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的核心配置文件中配置
<property name="hibernate.current_session_context_class">thread</property>
(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));
}