Hibernate4入门01--基本知识

一,Hibernate框架的主要工作:

  1. 提高数据访问层的编码效率,对JDBC进行了轻量级的对象封装;
  2. 将数据库的关系型数据,映射到普通的java类中,通过操作对象来操作数据库的数据,即ORM(Object Relational Mapping)对象-关系型数据映射。

二,Hibernate使用前的准备过程:

  1. 编写Hibernate的配置文件(可自动生成):hibernate.cfg.xml,主要是配置SessionFactory。
<hibernate-configuration>
  <!-- 配置SessionFactory -->
  <session-factory>

    <!-- 1,配置数据源 -->
    <!-- 1.1,配置数据库的驱动l类 -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 1.2,配置数据库的url地址 -->
    <property name="connection.url">
      jdbc:mysql://localhost:3306/cnconsum
    </property>
    <!-- 1.3,配置数据库的用户名 -->
    <property name="connection.username">root</property>
    <!-- 1.4,配置数据库的密码 -->
    <property name="connection.password">naruto68</property>
    
    <!-- 配置数据库的类型 -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 是否显示sql语句 --> 
    <property name="show_sql">true</property>

    <!-- 配置映射表 -->
    <mapping resource="com/hibernate/entity/CnUser.hbm.xml"/>
    ...
  </session-factory>
</hibernate-configuration>
  1. 编写回话工厂类HibernateSessionFactory:主要用于根据配置文件创建SessionFactory,并利用SessionFactory获取Session。
//1,通过Configuration对象解析hibernate.cfg.xml的内容,并创建SessionFactory对象。
configuration.configure();
......省略注册机代码
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2,通过sessionFactory的openSession()方法,获取session对象;
......省略处理每个线程维护自己的session的代码
session = sessionFactory.openSession();
  1. 创建实体类(对应数据库中的一张表),该实体类的属性值,对应表的列属性,并提供getXxx和setXxx方法。这些可自动生成。
public class CnUser
{
  private String uuid;
  private String phone;
  ......省略其它属性
  public String getUuid()
  {
    return this.uuid;
  }
  public void setUuid(String uuid)
  {
    this.uuid = uuid;
  }
  ......省略其它方法
}
  1. 编写映射文件(实体类和关系表的真正映射关系),可自动生成。
<hibernate-mapping>
  <!-- 配置一个实体类的映射关系 -->
  <class name="实体类的具体位置" table="对应的表明" catalog="对应的数据库">

    <!-- 映射主键(也可以是组合主键) -->
    <id name="实体类中的属性名" type="数据类型">
      <!-- 对应表中的主键 -->
      <column name="表中的主键名"/>
      <!-- 主键生成策略 -->
      <generator class="assigned(默认)"/>
    </id>

    <!-- 映射其它属性 -->
    <property name="实体类中的属性名" type="数据类型">
      <!-- 对应表中的属性 -->
      <column name="表中的列属性" length="字段长度"/>
    </property>

  </class>
</hibernate-mapping>
  1. 通过Annotation注解的方式,进行映射配置;

三,使用Hibernate操作数据库

操作数据的代码框架结构

//1,获得session实例
Session session = HibernateSessionFactory.getSession();
//2,开启事务
Transaction tx = null;
try
{
  tx = session.beginTransaction();
  //3,通过session操作持久化对象
  session.save(user);
  //4,提交事务
  tx.commit();
}
catch(Exception e)
{
  if(tx != null)
  {
    //4,事务回滚
    tx.rollback();
  }
}
finally
 {
  //5,关闭session
  HibernateSessionFactory.closeSession();
 }
  1. 加载数据(只能根据主键加载)
session.get(CnUser.class,id); //记录不存在,返回null
session.load(CnUser.class,id); //记录必须存在,否则返回异常
  1. 添加数据
   session.save(user); //重复提交会报异常
   session.saveOrUpdate(user); //重复提交,第二次做为更新
  1. 删除数据
session.delete(user); //先通过get或load加载到user,然后删除
  1. 修改数据
session.update(user);//先通过get或load加载到user,然后修改

四,使用hibernate检索数据

  1. 使用HQL(Hibernate Query Language),HQL对应于数据库中的sql查询;

使用HQL进行查询的代码框架

//1,获取session实例
Session session = HibernateSessionFactory.getSession();
//2,声明hql查询语句
String hql = "from CnUser user";
//3,通过session和hql创建sql查询
Query query = session.createQuery(hql);
/*4,对query可以设置查询的限制,包括:
4.1,动态设置条件;
4.2,sql查询的对应查询:分组,排序等;
4.3,聚集函数;
4.4,分页查询;
4.5,连接查询
*/
//5,获取查询结果
List list = query.list();
  1. 使用QBC(Query By Criteria)

因为HQL的虽然比JDBC方式的查询有进步,但是还是需要编写繁琐的HQL语句,Criteria采用面向对象的方式,封装查询条件,使得查询代码编写更加方便;代码结构如下:

//1,获取Session实例;
Session session = HibernateSessionFactory.getSession();

//2,利用Session创建Criteria对象;
Criteria criteria = session.createCriteria(CnUser.class);

/*3,给Criteria对象设置查询条件Critetion接口,实现类包括:
Example,SimpleExpression和Junction,都由Restrictions工具类来创建;*/

//3.1,直接使用Restrictions工具类来设置条件
criteria.add(Restrictions.like("userLevel", "ORD", MatchMode.ANYWHERE));

//3.2,使用Example类的实例来设置条件
//QBE查询
CnUser condition = new CnUser();
condition.setUserLevel("ORD");
condition.setName("liu");
Example example = Example.create(condition);
example.enableLike(MatchMode.ANYWHERE);
example.ignoreCase();
criteria.add(example);

//4,使用Order设置排序方式
criteria.addOrder(Order.desc);

//5,使用Projection进行分组和统计
//分组
ProjectionList  pList = Projections.projectionList();
//分组依据
pList.add(Projections.groupProperty("sex"));
//统计分组数
pList.add(Projections.rowCount());
criteria.setProjection(pList);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345