第一章:Hibernate基础知识
XXX定义:Hibernate是一个优秀的java持久化层解决方案,是当今主统的对象——关系映射(ORM)工具.
2.持久化定义;将数据在瞬时状态和持久状态之间进行转化的一种机制
XXX:三个对应关系,两个文件(配置文件,映射文件)
对应关系:
1,类和表
2,属性和列
3,对象和数据库中的数据
配置文件放在src根目录下;配置文件的名字永远是XXX._ml;配置文件包含三大块内容:
1,JDBC的配置信息
2,hibernate本身的配置信息(方言,show_sql)
3,映射文件的配置信息
4.准备hibernate(三步)
1),引入jar包
2),配置文件
3),创建实体类和实体映射文件(entity,dao)
Entity:需要进行序列化并手动添加一个无参的构造方法
Dao:七个步骤
(1)读取并解析配置文件
(2)读取并解析映射信息,创建SessionFactory
(3)打开Session
(4)开始一个事务
(5)数据库操作
(7)关闭Session
5.实体对象的三种状态
1)瞬时状态:刚用new语句创建还没有被持久化,且不处于Session的缓存中
2)持久状态:已经被持久化,且加入到Session的缓存中
3)游离状态:已经被持久化,但不再处于Session的缓存中
注:Session不绑定线程时,session开始缓存打开session关闭缓存关闭
第二章:关联映射
实体之间的关系有关联关系:通过一个对象持有另一个对象的事例
泛化关系:通过对象之间的继承方法来实现
XXXe
类与类之间的多对一的单向关联关系和关系数据库中的外键参照关系最匹配,是最常见的单向关联关系
多的一方持有一的一方,由多的一端进行数据维护
XXX
由一的一端加载多的一端,一的一端持有多的一端的集合,关系由一的一端
进行维护,(在开发过程中一般不建议从一的一端进行数据维护)
3.双向One-to-many
XXX与inverse
Cascade级联:当对一个表进行操作时也会对与该表有相关关系的表进行相应的操作
Cascade属性:
1)All:对所有操作进行级联操作
2)Save-update:执行保存和更新操作时进行级联操作
3)Delete:执行删除操作时进行级联操作
4)None:对所有操作都不执行级联操作
Inverse控制反转:当inverse=true时放弃控制权,由另一方负责维护关联关系
在One-to-many关联中将one的一方inverse设置为true有助于性能的改善
XXX
在实体表之外再设置一个关系表,关系表中只有外键,分别对应实体表中的主键,关系表没有实体类。
关系表的维护:
第三章:HQL
XXX支持两种主要的查询方式,HQL和Criteria
HQL:是一种面向对象的查询,没有表和字段的概念,只有类对象和属性的概念,应用较为广泛。
Criteria:对象查询,用面向对象的方式将构造查询的过程做了封装。
HQL简化,不需要封装,于数据库,对于不同的数据库根据方言属性的配置自动生成不同的SQL语句执行。
使用HQL的四步:
1)得到Session
2)编写HQL语句
3)创建Query对象
4)执行查询得到结果
2.属性查询:查询实体对象的某个属性,返回的是一个不带泛型的listlist里面存的是Object数组。
3.参数绑定
参数绑定有三种方式:占位符,命名参数,封装参数
1)占位符
通过setType()方法设置指定的参数,必须依照顺序设置,注意下标从0开始
2)命名参数
:name
不需要依照特定的顺序
4)封装参数
步骤:(1)将参数封装成为一个Bean(创建查询对象,根据开发需要单独创建)
(2)动态设置查询语句(动态拼接SQL语句)
(3)通过Query对象的setProperties(查询对象)方法实现参数的设定
4.聚合函数
5.排序
6.分组
7.分页
主要两个方法;setFirstResult((pnum-1)psize);第(pnum-1)psize条不返回setMa_Results(psize);
8.子查询
第四章:Hibernate性能优化
Hibernate性能优化主要从以下四方面:数据库设计,HQL优化,数据加载策略,缓存管理
XXX优化
避免or操作
避免使用not
避免like的特使形式
避免having子句
避免使用distinct
2.数据加载策略
数据加载策略有两种:即时加载和延迟加载
1.即时加载:当对象被加载时,其属性,关联的对象,或集合被立即加载
2.延迟加载:当在真正需要数据的时候才真正执行数据加载操作
1.关联对象的延迟加载
XXX()方法不受延迟加载的影响,load()受延迟加载的影响
3.关联,对象默认的都是延时加载。属性默认的都是即时加载
4.属性的延迟加载:适用于二进制大对象,字符串大对象,以及大容量组建类型的属性,降属性设为lazy=“true”时该属性用到时才会查
3.缓存管理
Query的list和iterate方法的不同
List:获取查询结果,每次发出一条查询语句,或许全部数据,不会在缓存中读数据,总是一次性从数据库中直接查询符合条件的数据并存入缓存,每次都需要进行封装
Iterate:先发出一条语句,查询所有满足条件的数据的id,然后依次按照这些id查询数据,可以从缓存中查询数据,不需要每次都进行封装
XXX连接查询
内连接,外连接,全连接
HQL:内连接,迫切内连接,左外连接,迫切左外连接,右外连接
迫切链接通过Fetch关键字实现,迫切链接是边查边设置,得到的是带泛型的list(谁在左边list的泛型是谁)
普通内连接得到的结果集中每行数据是一个Object数据
注意:普通内连接查询属性结果集中每行数据是一个Object数据
5.命名查询(将查询写到配置文件中,开发时尽量少动用原文件,只是修改配置文件)
元素用于定义一个HQL查询语句,和并列
在程序中通过session的getnamedQuery()获得该查询语句
6.本地SQL(在HQL无法解决的问题时使用)
第五章:Criteria查询
Criteria采用面向对象的方式,封装查询条件
特点:采用对象的方式来组合各种查询条件
XXX.createCriteria(XXX)
这一句相当于HQL中的fromUsers
XXX是类的反射
XXX()方法添加查询条件
XXX()等方法设置查询条件
其中XXX()需要注意,使用map,使用key/value进行进行多个相等的值得对比
XXX
先声明一个对象
XXX(XXX(对象))
注;E_ample不支持主键查询,即对象声明时不能声明其主键值
3.查询排序
两个方法:asc()和desc()
4,分页
也是setFirstResult((pnum-1)psize);第(pnum-1)psize条不返回setMa_Results(psize);