目录
51. HQL查询-Hibernate Query Language (多表查询,但不复杂时使用)
1 hibernate中的实体规则
1.1 实体类创建的注意事项
- 1.持久化类提供无参数构造
- 2.成员变量私有,提供共有get/set方法访问.需提供属性
- 3.持久化类中的属性,应尽量使用包装类型
- 4.持久化类需要提供oid.与数据库中的主键列对应
- 5.不要用final修饰class ---------hibernate使用cglib代理生成代理对象.代理对象是继承被代理对象.如果被final修饰.将无法生成代理.
1.2 主键类型
1.2.1 自然主键(少见)
表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用。
1.2.2 代理主键(常见)
表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义的列作为主键。
1.3 主键生成策略
1.3.1 代理主键
identity : 主键自增.由数据库来维护主键值.录入时不需要指定主键.
1.3.2 自然主键
assigned:自然主键生成策略. hibernate不会管理主键值.由开发人员自己录入.
2 hibernate中的对象状态
2.1 对象分为三种
- 瞬时状态------没有id,没有在session缓存中
- 持久化状态------有id,在session缓存中
- 游离|托管状态-------有id,没有在session缓存中
2.2 三种状态的转换图
3 hibernate进阶----- 一级缓存
缓存:提高效率.hibernate中的一级缓存也是为了提高操作数据库的效率.
3.1 提高效率手段 1: 提高查询效率
3.2 提高效率手段 2: 减少不必要的修改语句发送
4 hibernate中的事务
4.1 事务
- 事务特性(ACID)
A 原子性 C 一致性 I 隔离性 D 持久性
- 事务并发问题
1 脏读 2 不可重复读 3 幻 | 虚 读
- 事务的隔离级别
读未提交- 123
读已提交 - 23
可重复读(mysql默认级别)-3
串行化 - 没有问题
知识点:如何在hibernate中指定数据库的隔离级别
知识点2:在项目中如何管理事务
- 1) 业务开始之前打开事务,业务执行之后提交事务. 执行过程中出现异常.回滚事务.
- 2) 在dao层操作数据库需要用到session对象.在service控制事务也是使用session对象完成. 我们要确保dao层和service层使用的使用同一个session对象
- 3) 在hibernate中,确保使用同一个session的问题,hibernate已经帮我们解决了. 我们开发人员只需要调用sf.getCurrentSession()方法即可获得与当前线程绑定的session对象
- 4) 注意1: 调用getCurrentSession方法必须配合主配置中的一段配置
- 5) 注意2:通过getCurrentSession方法获得的session对象.当事务提交时,session会自动关闭.不要手动调用close关闭.
在相应的 CRM 管理系统中
Service层
Dao层
5 hibernate中的批量查询(概述)
51. HQL查询-Hibernate Query Language (多表查询,但不复杂时使用)
5.1.1 基本查询
5.1.2 条件查询
?号占位符
命名占位符
5.1.3 分页查询
5.2 Criteria查询(单表条件查询)
Hibernate自创的无语句面向对象查询
5.2.1 基本查询
5.2.2 条件查询
5.2.3 分页查询
5.2.4 设置查询总记录数
5.3 原生SQL查询(复杂的业务查询)
5.3.1 基本查询
返回数组List
返回对象List
5.3.2 条件查询
5.3.3 分页查询