• 1. Hibernate简单查询
  • 2. 本章内容Session缓存 持久化对象状态 Hibernate的持久化操作 使用OID加载对象 HQL查询
  • 3. Session缓存Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置的,不能被卸载。 Hibernate的二级缓存是由SessionFactory提供的,他作为一个可插入的组件使用的,默认是不支持的,应用必须明确配置二级缓存才能使用。 Session缓存的作用: 降低访问数据库的频率 保证缓存中的对象与数据库中的相关记录保持同步
  • 4. 持久化对象的状态对于需要被持久化的对象,处于以下三种状态之一: 临时状态(Transient) 刚刚用new创建,还没有被持久化,还不处于Session缓存之中 持久化状态(Persistent) 已经被持久化,加入到Session的缓存之中 游离状态(Detached) 已经被持久化,但不再处于Session的缓存之中
  • 5. 对象的状态转换临时状态持久化状态游离状态get() load() find() iterator() 等等new语句delete()update() saveOrUpdate() lock()evict() close() clear()save() saveOrUpdate()垃圾回收垃圾回收
  • 6. 临时对象的特征不处于Session的缓存中 在数据库中没有对应的记录 以下情况会使对象进入临时状态: 当通过new语句刚创建了一个对象 Session的delete()方法会使一个对象从持久化状态或游离状态进入临时状态
  • 7. 持久化对象的特征位于一个Session实例的缓存中 持久化对象和数据库中相关的记录对应 Session在清理缓存时,会根据持久化对象的属性的变化来同步更新数据库 Session的save()方法把临时对象变为持久化对象 Session的load()或get()方法返回的是持久化对象,find()方法返回的List元素 Session的update(), saveOrUpdate(),lock()使对象从游离状态变成持久化状态。
  • 8. 游离对象的特征不再处于Session的缓存中 游离对象是从持久化对象转变过来的 调用Session的close()方法时,Sessin的缓存被清空,缓存中的持久化对象会变成游离对象 Session的evict()能从缓存中删除一个对象,使之从持久化状态变成游离状态
  • 9. 持久化对象save() //保存对象 把临时对象加入到缓存中,使之成为持久化对象 使用指定的ID生成器为持久化对象分配OID 当对象处于持久化状态,Hibernate不允许修改其OID update() //修改对象 把游离对象加入到缓存中,使一个游离对象变成持久化对象 计划执行update SQL语句,根据对象的OID来更新对象所对象的数据 update()不能更新一个在session中已经关联的相同OID的对象 saveOrUpdate() //保存或修改对象 同时包含了save()和update()方法的功能,根据对象的状态自动执行相应的功能 若对象为临时状态,执行save()方法,若为游离状态则执行update()方法
  • 10. 持久化对象merge() //合并对象 直接修改表中的记录,并不影响该对象原来的状态 delete() //删除指定的对象 如果是持久态对象,就计划执行delete语句 如果是游离态对象,先使用游离对象被Session缓存关联,变成持久化对象,再计划执行delete语句 contains() //判断实体对象是否与Session关联 可以用此方法判断对象是否处理持久化状态 evict() //把实体对象从Session缓存中移除 clear() //清除Session缓存中所有的持久化对象
  • 11. 根据OID加载对象get() load() 两个方法的区别: 都是根据指定的OID从数据库中加载一个持久化状态对象 当数据库中不存在与OID相对应的记录时,get()返回一个null引用,而load()方法会抛出ObjectNotFoundException异常 load()方法可以返回一个实体的代理类实例(当class的lazy=true时),而get()方法只是直接返回实体类对象。
  • 12. Hibernate查询数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。 Hibernate具有三种查询方式: HQL(Hibernate Query Language)检索 QBC(Query By Criteria)检索 Native SQL检索 以上三种查询方式都是通过Session对象来操作的
  • 13. HQL查询是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询,以类和属性代替表和字段。 Hibernate使用Query接口来执行HQL语句,类似jdbc使用的PreparedStatement。 HQL语句不区分大小写,但是实体类及其属性例外。
  • 14. Query接口使用Query进行查询的步骤 创建Query对象 绑定动态参数 执行查询/更新语句 创建Query对象 Query query = session.createQuery(“hql”);
  • 15. 绑定动态参数使用占位符?指定参数 例:“from User u where u.age > ?” query.setInteger(0, 20); 参数的索引从0开始 使用命名参数指定参数 例: “from User u where u.age > :age” query.setInteger(“age”, 20); 每种参数类型都有两种绑定形式
  • 16. 执行查询/更新list() 返回List对象,可以按索引随机访问对象 iterator() 返回Iterator对象,只能按从前到后的顺序依次访问对象 uniqueResult() 返回一个结果对象,一般确认结果集中只有一个符合条件的对象才使用此方法 技巧:可以使用setMaxResults()来限制个数 executeUpdate() 执行delete/update语句
  • 17. HQL-实体查询查询一个实体的信息,返回包含全部属性的实体对象的实例,也可以是一个List集合对象,其元素是实体对象的实例 如果是同一种类型的实体查询,可以省略select子句。 如果实体类命名冲突,可使用完全类名形式 “from com.handson.dto.User ” 查询所有用户信息 session.createQuery(“from User”).list(); 查询年龄大于20的所有用户信息 session.createQuery(“from User u where u.age > 20”).list();
  • 18. HQL-属性查询单个属性查询 session.createQuery(“select u.name from User u”).list(); 返回的结果集中的对象是String类型 多属性查询 session.createQuery(“select u.name, u.password from User u”).list(); 返回的结果集中是Object[]类型的数据,其长度等于属性列的个数 实体和属性混合查询 session.createQuery(“select u, u.name from User u”).list(); 返回一个Object[]类型结果集,第一个元素是User对象,第二个元素是一个String对象
  • 19. HQL-更新操作Hibernate 3之后新增加了对象的更新操作功能,即update/delete语句,用于提高批量操作的执行性能 使用Query.executeUpdate()来执行操作 示例:让所有用户的年龄加1 session.createQuery(“update User set age = age + 1”).executeUpdate(); 示例:删除所有年龄小于10的用户 session.createQuery(“delete User where age < 10”).executeUpdate();
  • 20. HQL-方法链编程Query接口支持方法链编程风格,它的setXXX()等方法都返回Query自身的实例,这样可直接通过“.”来调用下一个方法,从而使用程序更简洁 示例: 常规风格 Query query = session.createQuery(“from User u where u.age > ?”); query.setInteger(0, 10); List users = query.list(); 方法链风格 List users = session.createQuery(“from User u where u.age > ?”) .setInteger(0, 10) .list();