Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
【第一部分:关于查询】
在Hibernate中,查询是获取数据的核心功能。以下是对几种查询方法的详细解释:
1. `get()` 和 `load()`:两者都用于根据ID获取对象,但有关键区别。`get()` 直接从数据库中获取数据,如果不存在则返回`null`;而`load()` 则返回一个代理对象,只有当调用其方法时才执行实际的数据库查询。如果使用代理并设置batch-size,`load()` 可以批量加载多个对象,提高性能。
2. HQL(Hibernate Query Language):是Hibernate的面向对象查询语言,类似于SQL。HQL支持命名参数和位置参数,例如上面的例子展示了如何通过`createQuery()`创建HQL查询,并使用`setParameter()`或`setParameterList()`设置参数。`uniqueResult()`用于获取单个结果,`list()`则用于获取结果集。
3. Criteria API:提供了一种类型安全的方式来构建查询,无需编写字符串HQL。`createCriteria()`开始构建查询,通过`add()`添加条件,如`Restrictions.like()`、`Restrictions.or()`,并使用`Order`进行排序。`list()`返回结果。
4. QBC(Query By Example):基于实例的查询,通过创建一个对象实例,设置其属性值,然后使用`Example.create()`创建一个示例,再将其添加到`Criteria`中。这种方式非常直观,适用于简单的查询。
5. Native SQL:直接执行SQL查询,通过`createSQLQuery()`创建查询,使用`addEntity()`和`addScalar()`指定结果映射。这样可以直接利用数据库特定的功能。
6. Named SQL queries:预定义的SQL查询,可以在配置文件中定义,然后在代码中引用,提高了代码的可维护性。
7. Filter:动态过滤,允许在运行时添加全局查询条件,对整个会话中的所有查询都生效,适用于按用户权限或其它动态条件筛选数据。
8. Detached queries:离线查询,用于处理已经关闭的Session中的对象,通过`DetachedCriteria`可以在不打开新的Session的情况下构造查询。
【第二部分:关于版本】
Hibernate 2 和 Hibernate 3 的主要区别包括包名的改变,从`net.sf.hibernate`到`org.hibernate`,这影响了导入语句。此外,Hibernate 3引入了许多新特性,如:
- 支持JPA(Java Persistence API),使其更容易集成到Java EE环境中。
- 改进了Criteria API,增加了更多的查询表达式和函数。
- 改进了HQL,支持更多的SQL特性,如JOIN子句和集合函数。
- 引入了二级缓存,提高了性能。
- 提供了更强大的对象关系映射能力,如多对多关系的简化配置。
- 异步查询和批处理操作的改进。
总结,Hibernate作为强大的ORM框架,提供了多种灵活的查询方式,适应不同场景的需求,同时在不同版本中不断优化,提升开发效率和性能。理解并熟练掌握这些查询方法和版本差异,对于Java开发者来说至关重要。