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.