Hibernate 框架(第二天)
1.实体类编写规则(重点)
实体类编写规则
- 实体类里面的属性是私有的
- 私有属性使用公开的set 和 get 方法操作
- 要求实体类有属性作为唯一值(一般使用id 值)
- 实体类属性建议不使用数据类型,使用基本数据类型对应的包装类
2.hibernate主键生成策略
1.hibernate 要求实体类里面有一个属性作为唯一值,对应的表主键,主键可以不同生成策略
2.hibernate 主键生成策略有很多的值
3.在class属性中有很多的值
(1)native : 根据使用的数据库帮选择那个值
uuid : 之前web阶段写代码生成uuid值,hibernate 帮我们生成uuid值。
4.演示生成策略uuid
(1) 使用uuid生成策略,实体类id 属性属性必须 字符串类型
首先把这个地方的uid 修改为
重新生成他的Get和Set 方法
(2) 配置部分写出 uuid 值
测试生成
最好查看数据库
3.实体类操作
(1)CRUD操作(重点)
添加操作
调用session 里面的save 方法实现
关于这段代码的全部部分在本人的Hibernate 入门学习第一天中
根据id 查询
1.调用session 里面的get 方法实现
运行截图 SQL 执行的语句
修改操作
首先查询,修改值
数据库之前的数据
修改成功后的表数据
(1) 根据id 查询,返回对象
执行过程
删除操作
调用session里面的delete方法实现
实体类对象(概念)
1 瞬时态:对象中没有id 值,对象于session 没有关系,
一般用于添加操作
2.持久态:对象里面有这个id值,对象与session有关联
3.托管态:对象有id 值,对象中没有id 值,对象于session 没有关联
2.演示操作实体类对象的方法
(1)saveOrUpdate 方法:实现添加和修改
4. hibernate 的一级缓存
什么是缓存?
1.数据库到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。
(1)把数据存到内存里面,不需要使用流方式,可以直接读取内存中读取数据
(2)把数据放到内存中,提高读取效率
Hibernate 缓存
1. hibernate 框架中提供很多优化方式,hibernate 的缓存就是一个优化方式
2. hibernate 缓存特点:
第一类:hibernate 的一级缓存
(1) hibernate 一级缓存默认打开
(2)hibernate 的一级缓存使用范围,是Session范围,从Session创建到Session 关闭范围
第二类 hibernate 的二级缓存
(1)目前已经不使用的,替代的是Redis
(2) 二级缓存默认不是打开的,需要配置
(3) 二级缓存使用范围,是sessionFactory 范围
验证一级缓存存在
1. 验证方式:
(1)首先根据Uid = 1,返回对象
(2)其次再根据uid = 1查询,返回对象
最终的效果展示:
第一步执行get 方法之后,发送sql语句查询数据库
第二句执行get方法之后,没用发送sql 语句,查询一级缓存内容
hibernate 一级缓存执行流程:
hibernate 一级缓存特性
- 持久态自动更新数据库
执行过程(了解)
如图所示:
5. hibernate 的事务操作
(1)事务代码规范写法
代码结构:
try{
开启事务
提交事务
}catch(){
回滚事务
}finally{
关闭
}
事务相关概念
1.什么是事务
2. 事务特性
3. 不考虑隔离性产生问题
(1)脏读
(2)不可重复读
(3)虚读
4. 设置事务隔离级别
(1)mysql 默认隔离级别 repeatable read
hibernate 其他的api(查询)
Hibernate 绑定session
- session 类似于jdbc的connection,之前web阶段学过threadLocal
- 帮实现与本地线程绑定session
- 获取与本地线程session
(1) 在hibernate 核心文件中配置
(2)调用Session的方法
4获取与本地绑定session时候,关闭session报错,不需要手动关闭。
Hibernate 的api 使用
Query 对象
1.使用query 对象 不需要写SQL语句,但是要写hql 语句
(1)hql: hibernate query language,hibernate 提供查询语言,这个hql 语句和普通语句很相似
(2)hql 和sql 语句区别:
使用sql 操作和表字段
使用hql 操作实体类和属性 - 查询所有的hql 语句
(1)from 实体类名称 - Query 对象使用
(1)创建Query 对象
(2)调用query 对象里面的方法得到结果
代码如下:
// 创建Query对象
// 方法里面写hql 语句
Query query = session.createQuery ("from User");
// 调用方法得到结果
List <User> list = criteria.list();
for(User user : list) {
System.out.println(Arrays.toString(user));
}```
Criteria 对象
1.使用这个对象查询到,但是查询这个对象时候,不需要写语句,直接调用方法实现
2. 实现过程
(1)创建Criteria 对象
(2)调用方法得到结果
代码演示如下:
// 创建Criteria 对象
// 方法里面参数是实体类class
Criteria criteria = session.createCriteria(User.class);
// 调用方法得到结果
List list = criteria.list();
for(User user : list) {
System.out.println(Arrays.toString(user));
}
SQLQuery 对象
1.使用hibernate 时候,调用底层SQL 实现
2. 实现过程
(1)创建SQLQuery 对象
(2)调用方法得到结果
代码如下:
// list 返回的是数组
// 创建对象
// 参数普通sql语句
SQLQuery sqlquery = session.createSQLQuery("select * from t_user");
// 调用sqlQuery里面的方法
// 返回List 集合 ,默认里面每部分数据结构
List<Object[]> list = sqlQuery.list();
for(Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
// 返回的list 每部分是对象
sqlQuery.addEntity(User.class);
// 调用sqlQuery里面的方法
List <User> list = sqlQuery.list();
for(User user : list) {
System.out.println(Arrays.toString(user));
}