Hibernate入门

Hibernate入门:

搭建一个Hibernate的demo步骤:

1、引入jar包

2、创建实体类 ,并配置实体类的映射文件

3、配置hibernate的核心配置文件(hibernate.cfg.xml)

4、写具体的测试方法

测试的方法如下:

 1   @Test
 2     public void addTest() {
 3         // 第一步:加载核心配置文件
 4         Configuration configuration = new Configuration();
 5         configuration.configure();
 6         // 第二步:得到sessionFactory对象
 7         SessionFactory sessionFactory = configuration.buildSessionFactory();
 8         // 第三步:创建session对象
 9         Session session = sessionFactory.openSession();
10         // 第四步:得到事务对象
11         Transaction transaction = session.beginTransaction();
12         // 第五步:逻辑操作CRUD
13         Student s = new Student();
14         s.setName("Jack");
15         s.setCode("131006101");
16         session.save(s);
17         // 第六步:提交或回滚事务
18         transaction.commit();
19         // 关闭连接
20         session.close();
21         sessionFactory.close();
22     }

 5、稍后可以对上述代码进行优化:

  1)、静态代码块:当类加载的时候才执行,且就执行一次。例如SessionFactory对象的创建就可以放在静态代码块中,因为,创建SessionFactory的过程中,我们的hibernate配置中经常会写<property name="hibernate.hbm2ddl.auto">update</property>;所以它会在每次创建SessionFactory的过重都去创建表,或者是更新表,这很耗费资源,因此最后抽出一个工具类来创建这个对象。

  2)、hibernate中实体的三种状态

      临时态:(瞬时态)对象中没有id值,同时对象与session没有关联;
      持久态:对象里有id值,同时对象与session有关联;
      游离态:(托管态)对象里有id值,但是对象与session没有关联;

  3)、saveOrUpdate方法:如果操作的对象是临时态,做insert操作;如果对象是持久态或者游离态,做update操作。

  4)、hibernate中的一级缓存:

      1)、默认开启一级缓存
      2)、一级缓存的作用范围即session的范围
      3)、一级缓存中存储的数据必须是持久态数据

  5)、hibernate一级缓存的特性:持久态自动更新数据库(即修改实体中的值后,不需要执行update方法)

其中的原理:更新实体,首先要查询,你根据id查询到实体后,会把这个实体中的数据放到一级缓存中,然后把同样的一份数据放到快照区(副本),然后你更新实体的值,这时会更改一级缓存中的值,最后当你提交的时候,会比较快照区和一级缓存中的值是否相同,如果相同就不更新数据库;如果不同,就把一级缓存中的更新后的值提交到数据库,即执行update操作。

  6)、事务的规范写法:try....catch....finally(应该有失败的时候,请求回滚)

  7)、session 是单线程对象,所以我们要将session对象与hibernate进行绑定(本地线程绑定)。先在核心配置文件配置,然后在工具类中获取session对象。

   8)、hibernate查询:

      query对象可以实现;
      criteria对象也可以实现;
      SqlQuery对象也可以实现;

*******************************分割线*****************************************

1、hibernate的查询方式:
对象导航查询:根据ID查询某个客户,再查询这个客户对应的所有联系人(一对多)
OID查询:根据ID查询某一条记录,返回对象
    hql查询;
Query对象,写hql语句实现查询;
  查询所有:from 实体类名字
  条件查询:from 实体类名字 where name=? and age=? query.setParameter(0,"老王");query.setParameter(1,18);
  排序:ORDER BY ASC/DESC
  模糊查询:LIKE ? query.setParameter(0,"%a%");
  分页查询:query.setFirstResult(0);设置起始位置 query.setMaxResult(5);设置每页数据大小
QBC查询:
  Creteria对象
本地sql查询:
  SQLQuery对象,使用普通sql查询

 2、hibernate中的查询策略:

  立即查询;

  延迟查询;

 3、hibernate中的批量抓取:可以减少查询的次数;需要在实体类的配置文件中配置参数batch-size.

原文地址:https://www.cnblogs.com/ZT-SummerRain/p/7123962.html