Spring Hibernate 开发实践

Hibernate

实现了 POJO 与数据表之间的映射以及 SQL 的自动生成和执行(Object/Relational Mapping),完成持久化操作(JPA Provider)。

Spring Hibernate 开发实践

引入 spring-orm 包与 hibernate-core 包。

配置数据源 dataSource


  ...

通过 dataSource 配置 SessionFactory
SessionFactory 对应一个数据存储的概念。它是线程安全的,一般只会在启动的时候构建,单例模式。


  
  ...

通过 sessionFactory 配置 TransactionManager


  

实体类

@Entity
@Table
public class User {
  private int id;
  private String name;

  // set & get 方法
}

通过 sessionFactory 来访问数据库

public class UserDAOImpl {
  @Autowired // 自动装配
  private SessionFactory sessionFactory;

  public void saveUser(User user) {
    // Session 表示与数据库进行交互的一个工作单元
    // Session 轻量级非线程安全,因此线程间不能共享
    Session session = sessionFactory.openSession();

    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
  }
}

Hibernate 查询

方式1:HQL 查询 Hibernate Query Language

...
Query query = session.createQuery("from user where id='123'");
List users = query.list();
...

方式2:QBC 查询 Query By Criteria

...
Criteria criteria = session.createCreteria(User.class);
criteria.add(Restrictions.eq("id", "123"));
List users = criteria.list();
...

Hibernate 缓存

  • 查询缓存:缓存的是 Query 本身,key 为 SQL+参数+分页
  • 一级缓存
    • 缓存的是 Query 的结果,key 为 类型+主键,例如 User(id=123),value 为实体对象
    • 由当前 Session 提供,减少与 DB 的交互,提高性能。
  • 二级缓存
    • 与一级缓存相同,缓存的是 Query 的结果,key 为 类型+主键,例如 User(id=123),value 为实体对象
    • 全局的,由 SessionFactory 提供,所有 Session 共享

Session 加载实体对象的过程

  1. 通过 类型+主键 例如 User(id=123) 来在 一级缓存 中查找,有则返回该实体对象
  • 在当前 NonExist 记录中查找,相当于黑名单,有则返回 null
  • 通过 类型+主键 例如 User(id=123) 来在 二级缓存 中查找,有则返回结果
  • 发出 SQL 语句到数据库中查找
    • 如果找到,创建实体对象,加入到一级,二级缓存,返回结果
    • 如果未找到,记录到 NonExist 记录中,返回 null

Session 的 get 方法 VS load 方法

  • get() 方法

    • 使用 User user = (User)session.get(User.class, 123);
    • 如果没有找到记录,返回 null
    • 如果找到记录,返回实体对象自身
  • load() 方法

    • 使用 User user = (User)session.load(User.class, 123);
    • 如果没有找到记录,抛出异常 ObjectNotFoundException
    • 如果找到记录,返回实体对象的代理,该代理类对象中只保存了实体对象的 id,直到真正使用实体对象的非主键属性时(例如 user.getName();)才会向数据库发送 SQL 去做查询
    • 上述即为 Hibernate 的延时加载机制,即使用时才加载。

Hibernate 实体对象的状态

  • transient 瞬时态:new 一个实体对象,该对象进入transient 瞬时态
  • persistent 持久态:实体对象在数据库中有记录,并拥有一个持久化标识 id
    • 瞬时态的对象调用 save() & persist() & update() & merge() 方法后进入持久态
  • detected 游离态:实体对象已从 会话 中清除
    • 持久态的对象调用 close() & clear() 方法后进入游离态
  • removed 移除态
    • 持久态的对象调用 delete() & remove() 方法后进入移除态

Hibernate 优化

  • 缓存策略
  • session 管理
  • 尽量使用延时加载
  • 批处理

你可能感兴趣的:(Spring Hibernate 开发实践)