目录
- 实体类的编写规则
- hibernate主键生成策略
- 实体类操作
- CRUD操作
- 实体类对象状态
- hibernate的一级缓存
- hibernate的实务操作
- 事务代码规则写法
- hibernate其他的api(查询)
实体类的编写规则(持久化类)
- 实体类里面的属性私有的
- 使用的getter / setter方法
- 属性作为唯一的值(一般使用id)
- 使用基本数据类型对应的包装类
- 八个基本数据类型对应的包装类
- int >>整数
- char >> Chararcter
- 双>>双
- 包装类的值可以为null而基础数据类型不可以
- 八个基本数据类型对应的包装类
hibernate主键生成策略
- hibernate要求实体类中有个属性作为唯一值,对应表主键,主键有不同的生成策略
- hibernate主键策略设置方式
- 标签:generator; 属性:class;
- 主键生成generator class =“”的值
- 增量>>自增
- 身份>> MySQL自增
- 序列>> Oracle自增
- native >>自动选择不同数据库的自增方式
- uuid >>字符串自增>适用于代理主键,随机字符串<
- 分配>>
实体类操作
crud操作
1.添加操作
- 创建实体类对象
- Session.save(对象名);
2.根据id查询
调用会话中的GET方法
获取的SessionFactory
获取会话
- 开启事务session.beginTransaction();
- 根据id查询
- 实体类对象名= session.get(实体类的类,id值)
- 提交事务
- 关闭
3.修改操作
- 首先查询,再修改
- 获取的SessionFactory
- 获取会话
- 开启事务session.beginTransaction();
- 修改操作
- 根据id查询>>同上
- 修改对象中的值
- 获取的对象名.set属性名(>新值<);
- 调用更新方法
- 了Session.update(修改后的对象名);
- 提交事务
- 关闭
4.删除操作
- 首先查询,再修改
- 获取的SessionFactory
- 获取会话
- 开启事务session.beginTransaction();
- 修改操作
- 方法1:
- 根据id查询>>同上
- 调用delete方法
- session.delete(修改后的对象名);
- 方法2:
- new 对象
- 给定 id
- 调用delete方法
- session.delete(修改后的对象名);
- 方法1:
- 提交事务
- 关闭
实体类对象状态(概念)
实体的三种状态
- 瞬时状态
- 对象里没有 id 并且和 session 没有关联
- 持久状态
- 对象和 session 有关联
- 托管状态
- 对象里面有 id 但是和 session 没有关系
演示操作实体类对象的方法
saveOrUpdate 方法 能实现添加也能实现更新
hibernate 缓存
什么是缓存
- 数据存到数据库,数据库本身就是一个文件系统,使用流的方式操作文件效率并不是很高
- 把数据存到内存里,不需要使用流的方式,可以直接读取内存中的数据.
- 把数据放入内容中可以提高读取效率.
hibernate 缓存
- hibernate 框架中提供很多优化方式, hibernate的缓存就是一个优化方式
hibernate 缓存的特点:
第一类 hibernate 的一级缓存
- hibernate 的一级缓存默认打开
- hibernate 的一级缓存使用范围,是** > session < 的范围**
- hibernate 的一级缓存,储存数据必须是持久状态
第二类 hibernate 的二级缓存
- 目前已经不使用了 , 替代技术 redis
- 二级缓存默认不是打开的 , 需要配置完成
- 二级缓存的范围是 sessionFactory 的范围
验证一级缓存的存在
验证方式:
- 首先根据 id = 1 查询 , 返回对象
其次再根据 id = 1 查询 , 返回对象
- 第二次查询后,不会从数据库再次获取,而是从一级缓存中获取
执行过程
- 获取 session 时获得一级缓存
- 第一次查询, 查询一级缓存中没有, 从数据库中获取数据 , 并返回一个对象, 并放入缓存中.
- 第二次查询, 首先查询一级缓存,找到了数据,直接返回一个对象.
- 会自动根据 id 在一级缓存中查找
一级缓存的特性
# 持久态会自动更新数据库
- 更新数据后不调用执行方法>>提交时
- 放在一级缓存中时 >> 同时会放入快照区(副本)
- 修改持久态对象时 >> 同时也会修改一级缓存中的值 >> 但是不会修改一级缓存的快照区中(副本)
- 最后提交事务时 >> 比较一级缓存和快照区的是否相同
- 相同 >> > 不更新 <
- 不同 >> > 更新 <
hibernate 的实务操作
事务的相关概念
- 什么是事务
- 事务的特性
- 不考虑隔离性产生的问题
- 脏读
- 不可重复读
- 虚读
- 设置事务隔离级别
事务代码规范写法
代码结构
hibernate 绑定 session (绝对单线程)
- session 类似于 jdbc 的connnection .
- hibernate 帮助实现了本地线程绑定 session (用户只需简单的配置)
- hibernate.cfg.xml 中添加
- property name="hiernate.currentsessioncontext_class" > thread
- 调用方法
- sessionFactory.CurrentSession();
- 返回值为 session > 已经与本地线程关联
- hibernate.cfg.xml 中添加
hibernate api 的使用
Query 对象
- 使用 query 对象,不需要 sql 语句,但是写 hql 语句
- hql: hibernate query language , hibernate 提供查询语句, 这个语句和sql 很相似
- hql 和 sql 的区别:
- 使用 sql 操作的是表和字段
- 使用 hql 操作的是实体类和属性
- 查询所有 hql 语句: * from >实体类名称<
- Query 对象使用
- 创建query对象
- 调用list();方法得到 > > list 集合的对象
Criteria 对象
- 使用这个对象查询操作,不需要语句,直接调用方法
- Criteria 实现的过程
- 创建Criteriz对象
- Criteria criteria = session.createCriteria(实体类.class)
- 调用list();方法得到 > > list 集合的对象
- 创建Criteriz对象
SQLQuery 对象
- 使用 SQLQuery 对象时,调用底层 sql 语句
实现过程
- 创建SQLQuery对象
- SQLQuery sqlquery = session.createSQLQuery("select * from 表名");
调用方法addEntity(实体类.class)
调用list();方法得到 > > list 集合的对象
- 创建SQLQuery对象
但是返回值的list中是以数组的形式,所以要使用addEntity()方法转换后,使用list方法就可以获得 对象的list集合