Hibernate 学习笔记
hibernate 实体类编写规则
1. 实体类里面的属性是私有的
2. 私有属性使用公开的 set 和 get 方法
3. 要求实体类有属性作为唯一值
4. 实体类属性建议不使用基本数据类型,建议使用包装类。具体应该考虑 null 值是否有意义,比如一个学生的分数为 0,和他没有参加考试,没有参加考试可将值赋值为 null,而分数为 0,就是属性值,因此只有 int 的包装类 Integer 才能表示 null 值
hibernate 主键生成策略
1. hibernate 要求实体类有一个唯一属性对应表的主键,主键的自动生成有不同策略
<generator class="native"></generator>
2. class 属性中有多个值
(1) native:表示根据本地的数据库来选择主键的自动生长策略
(2) uuid:hibernate 会自动生成一个 uuid 作为主键,此时表里面的 id 类型应为 String
常用的就是以上两类
hibernate 中实体类的三种状态
1. 瞬时态:对象里面没有 id 值,对象与 session 没有关联。也叫自由态,只存在于内存中,而在数据库中没有相应数据。用 new 创建的对象,它没有持久化,没有处于 Session 中。
2. 持久态:对象里面有 id 值,对象与 session 有关联。与 session 关联并且在数据库中有相应数据。已经持久化,加入到了 Session 缓存中。如通过 hibernate 语句保存的对象。
3. 托管态:对象有 id 值,对象与 session 没有关系。持久化对象脱离了 Session 的对象。如 Session 缓存被清空的对象。
特点:已经持久化,但不在 Session 缓存中。
Hibernate 的缓存
1. Hibernate 一级缓存
(1) Hibernate 的一级缓存默认打开
(2) Hibernate 的使用范围是 session 范围,从 session 创建到关闭
(3) Hibernate 的一级缓存中,存储数据必须持久态数据
2. Hibernate 二级缓存
(1) 目前使用 redis 去替代
(2) 默认不打开,需要配置
(3) 二级缓存的范围是 sessionFactory 的范围
3. Hibernate 一级缓存的执行过程
hibernate 一级缓存特性
1. 持久态自动更新数据库
2. 原理图
当对象为持久态时,其实会存储到一级缓存和一个快照区,当修改后,会与修改之前的数据进行比较,只有修改的值与未修改前的值不同时才会进行数据库的修改,极大的提高了数据库操作的效率
hibernate 绑定 session
1. session 类似于 jdbc 的 connection,通过 ThreadLocal 可以进行绑定
2. Hibernate 会实现 session 与本地线程进行绑定
3. 获取与本地线程 session
(1) 在 Hibernate 的核心配置文件中配置
(2) 对用 sessionFactory 的 getCurrentSession()方法
4. 与本地线程绑定的 session,关闭 session 资源会报错,那是因为它与线程绑定了,线程结束,那么 session 结束
Hibernate 的查询对象的简单使用
Query 对象
1. 使用 query 对象不需要写 sql 语句,但是要写 hql 语句
(1) sql 语句是操作表和表字段,hql 语句是操作实体类和属性
2. 查询所有的 hql 语句 ‘from 实体类名称’
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
Criteria 对象
1. 使用这个对象进行查询操作,不需要写语句,直接调用里面的 API
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
SQLQuery
1. 普通的 sql 语句查询
2. 应该注意这个时候默认返回的 Lsit 集合中,每一部分是数组
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
List<Object []> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
3. 设置返回 list 对象每一部分的类型
SQLQuery sqlQuery = session.createSQLQuery("select * from t_user");
//设置数据返回时封装到那一个实体类
sqlQuery.addEntity(User.class);
List<Object []> list = sqlQuery.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于