Java Hibernate 框架
Hibernate 是一个开源的对象关系映射(ORM)框架,用于 Java 应用程序中简化数据库操作。
Hibernate 将 Java 对象映射到数据库表,使开发者能够以面向对象的方式操作数据库,而无需编写复杂的 SQL 语句。
Hibernate 的主要优势包括:
- 减少 JDBC 样板代码
- 提供透明的持久化机制
- 支持多种数据库
- 提供缓存机制提高性能
- 支持事务管理
Hibernate 核心架构
Hibernate 架构由多个重要组件组成:
1. SessionFactory
SessionFactory 是线程安全的对象,通常在整个应用程序中只创建一次。它负责:
- 创建 Session 实例
- 缓存生成的 SQL 语句
- 缓存映射元数据
实例
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
SessionFactory sessionFactory = configuration.buildSessionFactory();
2. Session
Session 是 Hibernate 的核心接口,代表与数据库的一次会话。它提供了:
- 创建、读取、更新和删除操作
- 事务管理
- 查询功能
实例
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 执行数据库操作
transaction.commit();
session.close();
Transaction transaction = session.beginTransaction();
// 执行数据库操作
transaction.commit();
session.close();
3. Transaction
Transaction 接口封装了数据库事务的概念,确保操作的原子性。
Hibernate 映射配置
Hibernate 支持两种配置方式:
1. XML 映射文件
传统方式,使用 .hbm.xml 文件定义实体类与数据库表的映射关系。
实例
<!-- User.hbm.xml -->
<hibernate-mapping>
<class name="com.example.User" table="USERS">
<id name="id" column="USER_ID">
<generator class="native"/>
</id>
<property name="name" column="USER_NAME"/>
<property name="email" column="USER_EMAIL"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.User" table="USERS">
<id name="id" column="USER_ID">
<generator class="native"/>
</id>
<property name="name" column="USER_NAME"/>
<property name="email" column="USER_EMAIL"/>
</class>
</hibernate-mapping>
2. 注解方式
现代 Hibernate 更推荐使用 JPA 注解方式:
实例
@Entity
@Table(name = "USERS")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "USER_NAME")
private String name;
@Column(name = "USER_EMAIL")
private String email;
// getters and setters
}
@Table(name = "USERS")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "USER_NAME")
private String name;
@Column(name = "USER_EMAIL")
private String email;
// getters and setters
}
Hibernate 查询语言
Hibernate 提供了多种查询方式:
1. HQL (Hibernate Query Language)
面向对象的查询语言,类似于 SQL 但操作的是对象而非表。
实例
String hql = "FROM User WHERE name = :name";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();
2. Criteria API
类型安全的查询构建方式:
实例
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> root = criteria.from(User.class);
criteria.select(root).where(builder.equal(root.get("name"), "John"));
List<User> users = session.createQuery(criteria).getResultList();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> root = criteria.from(User.class);
criteria.select(root).where(builder.equal(root.get("name"), "John"));
List<User> users = session.createQuery(criteria).getResultList();
3. 原生 SQL 查询
当需要执行复杂 SQL 时:
实例
String sql = "SELECT * FROM USERS WHERE USER_NAME = :name";
NativeQuery<User> query = session.createNativeQuery(sql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();
NativeQuery<User> query = session.createNativeQuery(sql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();
Hibernate 缓存机制
Hibernate 提供两级缓存提高性能:
1. 一级缓存 (Session 缓存)
- 默认启用
- 生命周期与 Session 相同
- 保证同一个 Session 中相同查询只执行一次
2. 二级缓存 (SessionFactory 缓存)
- 需要显式配置
- 跨 Session 共享
- 常用实现:EhCache, Infinispan 等
配置示例:
实例
<!-- hibernate.cfg.xml -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
Hibernate 事务管理
Hibernate 支持两种事务管理方式:
1. JDBC 事务管理
适用于独立应用程序:
实例
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// 业务逻辑
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
session.close();
}
Transaction tx = null;
try {
tx = session.beginTransaction();
// 业务逻辑
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
session.close();
}
2. JTA 事务管理
适用于分布式环境,如 Java EE 应用服务器。
Hibernate 最佳实践
- 合理使用延迟加载:避免 N+1 查询问题
- 批量处理:大量数据操作时使用批量处理
- 避免长会话:及时关闭 Session
- 合理设计对象关系:避免复杂对象图
- 使用连接池:提高性能
实例
// 批量插入示例
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 100000; i++) {
User user = new User("User" + i, "user" + i + "@example.com");
session.save(user);
if (i % 50 == 0) { // 每50条刷新一次
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 100000; i++) {
User user = new User("User" + i, "user" + i + "@example.com");
session.save(user);
if (i % 50 == 0) { // 每50条刷新一次
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Hibernate 作为成熟的 ORM 框架,大大简化了 Java 应用程序的数据访问层开发。通过合理配置和使用,可以显著提高开发效率和应用程序性能。
点我分享笔记