1.JavaEE三层结构
web层:Struts2框架
service层:spring框架
dao层:hibernate框架
2.什么是hibernate框架(重点)
hibernate框架应用在javaee三层结构中dao层框架
在dao层里面对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbc进行封装,使用hibernate好处,不需要写复杂的jdbc代码了,不需要写sql语句实现
hibernate开源的轻量级的框架
hibernate版本:hibernate5.x
3.什么是orm思想
hibernate使用orm思想对数据库进行crud操作
在web阶段学习javabean,更正确的叫法 实体类
orm:object relational mapping,对象关系映射;
让实体类和数据库进行一一对应关系
让实体类首先和数据库表对应
让实体类属性 和 表里面字段对应
不需要直接操作数据库表,而操作表对应实体类对象
4.hibernate配置文件详解
hibernate映射配置文件
映射配置文件名称和位置没有固定要求
映射配置文件中,标签name属性值写实体类相关内容
class标签name属性值实体类全路径
id标签和property标签name属性值 实体类属性名称
id标签和property标签,column属性可以省略的,不写值和name属性值一样的
property标签type属性,设置生成表字段的类型,自动对应类型
hibernate核心配置文件
配置写位置要求,必须在hibernate-configuration及session-factory标签中
配置三部分要求
数据库部分必须的
hibernate部分可选的
映射文件必须的
核心配置文件名称和位置固定的
位置:src下面
名称:hibernate.cfg.xml
5.hibernate核心api
Configuration
Configuration cfg=new Configuration();
cfg.configure();
到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
SessionFactory(重点)
使用configuration对象创建sessionFactory对象
创建sessionFactory过程中做事情:根据核心配置文件中,有映射文件映射部分,到数据库里面根据映射关系把表创建
创建sessionFactory过程中,这个过程特别耗资源的
在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
具体实现
写工具类,写静态代码块实现
静态代码块在类加载时候执行,执行一次
Session(重点)
session类似于jdbc中的connection
调用session里面不同的方法实现crud操作
添加save方法
修改update方法
删除delete方法
根据id查询 get方法
session对象单线程对象(只能自己用)
session对象不能共用,只能自己使用
Transaction
事务对象
Transaction tx=session.beginTransaction();
事务提交和回滚方法
commit();
rollback();
事务概念
事务四个特性
原子性、一致性、隔离性、持久性
6.解决配置文件没有提示问题
可以上网
把约束文件引入到eclipse中
7.实体类编写规则
实体类里面属性私有的
私有属性使用公开的set和get方法进行操作
要求实体类有属性作为唯一值(一般使用id值)
实体类属性建议不适用基本数据类型,使用基本数据类型对应的包装类
八个基本数据类型对应的包装类
int--Integer
char--Character
其他的都是首字母大写 比如 double-Double
8.hibernate主键生成策略
hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
hibernate主键生成策略有很多的值
在class属性里面有很多值
native:根据使用的数据库帮选择哪个值
uuid:之前web阶段写代码生成uuid值,hibernate帮我们生成uuid值
使用uuid生成策略,实体类id属性类型 必须 字符串类型
配置部分写出uuid值
9.对实体类crud操作
添加操作
调用session里面的save方法实现
根据id查询
调用session里面的get方法实现
修改操作
首先查询,修改值
根据id查询,返回对象
删除操作
调用session里面delete方法实现
10.实体类对象状态(概念)
实体类状态有三种
瞬时态:对象里面没有id值,对象与session没有关联
持久态:对象里面有id值,对象与session有关联
脱管态:对象里面有id值,对象与session没有关联
演示操作实体类对象的方法
saveOrUpdate方法:实现添加、实现修改
11.hibernate的一级缓存
什么是缓存
数据存到数据库里面, 数据库本身是文件系统,使用流方式操作文件效率不是很高。
把数据存到内存里面,不需要使用流方式,可以直接读取内存中数据
把数据放到内存中,提供读取效率
hibernate缓存
hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
hibernate缓存特点:
第一类hibernate的一级缓存
hibernate的一级缓存默认打开的
hibernate的一级缓存使用范围,是session的范围,从session创建到session关闭范围
hibernate的一级缓存中,存储数据必须 持久态数据
第二类hibernate的二级缓存
目前已经不使用了,替代技术 redis
二级缓存默认不是打开的,需要配置
二级缓存使用范围,是sessionFactory范围
hibernate一级缓存特性
持久态自动更新数据库
执行过程(了解)
12.hibernate事务操作
事务相关概念
什么是事务
事务特性
不考虑隔离性产生问题
脏读
不可重复读
虚读
设置事务隔离级别
mysql默认隔离级别repeatable read
13.hibernate事务代码规范写法
代码结构
try{
开启事务
提交事务
}catch(){
回滚事务
}finally{
关闭
}
14.hibernate绑定session
session类似于jdbc的connection,之前web阶段学过ThreadLocal
帮实现与本地线程绑定session
获取与本地线程session
在hibernate核心配置文件中配置
调用sessionFactory里面的方法得到
获取与本地线程绑定session时候,关闭session报错,不需要手动关闭session了
15.hibernate的api使用
Query对象
使用query对象,不需要写sql语句,但是写hql语句
hql:hibernate query language提供查询语言,这个hql语句和普通sql语句很相似
hql和sql语句区别:
使用sql操作表和表字段
使用hql操作实体类和属性
查询所有hql语句:
from实体类名称
Query对象使用
创建Query对象
调用query对象里面的方法得到结果
Criteria对象
使用这个对象查询操作,但是使用这个对象时候,不需要写语句,直接调用方法实现
实现过程
创建criteria对象
调用对象里面的方法得到结果
SQLQuery对象
使用hibernate时候,调用底层sql实现
实现过程
创建方法
调用对象的方法得到结果
16.表与表之间的关系回顾
一对多
分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类
客户和联系人是一对多关系
客户:与公司有业务往来,百度、新浪、360
联系人:与公司里面的员工,百度里面有很多员工,联系员工
**公司和公司员工的关系
客户是一,联系人是多
一个客户里面有多个联系人,一个联系人只能属于一个客户
一对多建表:通过外键建立关系
多对多
订单和商品关系,一个订单里面有多个商品,一个商品属于多个订单
用户和角色多对多关系
用户:小王、小马、小宋
角色:总经理、秘书、司机、保安
**比如小王 可以是总经理,可以是司机
**比如小宋 可以是司机,可以是秘书,可以是保安
**比如小马 可以是秘书,可以是总经理
一个用户里面可以有多个角色,一个角色里面可以有多个用户
多对多建表:创建第三张表维护关系
一对一
在中国,一个男人只能有一个妻子,一个女人只能有一个丈夫
17.hibernate的一对多操作(重点)
一对多映射配置
以客户和联系人为例:客户是一,联系人是多
第一步 创建两个实体类,客户和联系人
第二步 让两个实体类之间互相表示
在客户实体类里面表示多个联系人
一个客户里面有多个联系人
在联系人实体类里面表示所属客户
一个联系人只能属于一个客户
第三步 配置映射关系
一般一个实体类对应一个映射文件
把映射最基本的配置完成
在映射文件中,配置一对多关系
在客户映射文件中,表示所有联系人
在联系人映射文件中,表示所属客户
第四步 创建核心配置文件,把映射文件引入到核心配置文件中
一对多级联操作
级联操作
级联保存
添加一个客户,为这个客户添加多个联系人
级联删除
删除某一个客户,这个客户里面的所有的联系人也删除
18.一对多级联保存
添加客户,为这个客户添加一个联系人
复杂写法
简化写法
一般根据客户添加联系人
第一步 在客户映射文件中进行配置
在客户映射文件里面set标签进行配置
第二步 创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了
19.一对多级联删除
删除某个客户,把客户里面所有的联系人删除
具体实现
第一步 在客户映射文件set标签,进行配置
使用属性cascade属性值delete
第二步 在代码中直接删除客户
根据id查询对象,调用session里面delete方法删除
执行过程:
根据id查询客户
根据外键id值查询联系人
把联系人的外键设置为null
删除联系人和客户
20.hibernate多读多操作
多对多映射配置
以用户和角色为例演示
第一步 创建实体类, 用户和角色
第二步 让两个实体类之间互相表示
用户里面表示所有角色,使用set集合
一个角色有多个用户,使用set集合
第三步 配置映射关系
基本配置
配置多对多关系
在用户里面表示所有角色,使用set标签
在角色里面表示所有用户,使用set标签
第四步
多对多级联保存
根据用户保存角色
第一步 在用户配置文件中set标签进行配置,cascade值save-update
第二步 写代码实现
创建用户和角色对象,把角色放到用户里面,最终保存用户就可以了
多对多级联删除(了解)
第一步 在set标签进行配置,cascade值delete
第二步 删除用户
维护第三张表
用户和角色多对多关系,维护关系通过第三张表维护
让某个用户有某个角色
第一步 根据id查询用户和角色
第二步 把角色放大用户里面
把角色对象放到用户set集合
让某个用户没有某个角色
第一步 根据id查询用户和角色
第二步 从用户里面把角色去掉
从set集合里面把角色移除
21.hibernate查询方式
对象导航查询
根据id查询某个客户,再查询这个客户里面所有的联系人
OID查询
根据id查询某一条记录,返回对象
调用session里面get方法实现
hql查询
Query对象,写hql语句实现查询
hibernate提供一种查询语言,hql语言和普通sql很相似,区别:普通sql操作数据库和表字段,hql操作实体类和属性
常用的hql语句
查询所有:from 实体类名称
条件查询:from 实体类名称 where 实体类属性名称=? and 实体类属性名称=?
from 实体类名称 where 实体类属性名称 like ?
排序查询:from 实体类名称 order by 实体类属性名称 asc/desc
分页查询:from 实体类名称 再利用query中的2个函数
投影查询:select 实体类属性名称1,实体类属性名称2 from 实体类名称(select 后面不能写*,不支持的)
使用hql查询操作时候,使用Query对象
创建Query对象,写hql语句
调用query对象里面的方法得到结果
QBC查询
使用hql查询需要写hql语句实现,但使用qbc时候,不需要写语句了,使用方法实现
使用qbc时候,操作实体类和属性
使用qbc,使用Criteria对象实现
创建Criteria对象
调用方法得到结果
本次sql查询
SQLQuery对象,使用普通sql实现查询
22.聚集函数使用
常用的聚集函数
count、sun、avg、max、min
hql聚集函数语句写法
查询表记录数
select count(*) from 实体类名称
23.HQL多表查询
MySQL里面多表查询
内连接
select * from 表1,表2 where 表1 字段=表2 字段;
select * from 表1 inner join 表2 on 表1字段=表2字段;
左外连接
select * from 表1 left outer join 表2 on 表1字段=表2字段;
右外连接
select * from 表1 right outer join 表2 on 表1字段=表2字段;
HQL实现多表查询
内连接
内连接查询hql语句写法:以客户和联系人为例
from customer c inner join c.setLinkMan
返回list,list里面每部分是数组形式
左外连接
左外连接hql语句:
from customer c left outer join c.setLinkMan
返回list中每部分是数组
右外连接
from customer c right outer join c.setLinkMan
迫切内连接
迫切内连接和内连接底层实现一样的
区别:使用内连接返回list中每部分是数组,迫切内连接返回list每部分是对象
hql语句写法
from customer c inner join fetch c.setLinkMan
迫切左外连接
from customer c left outer join fetch c.setLinkMan
返回的list每部分是对象
24.hibernate检索策略
检索策略的概念
hibernate检索策略分为两类:
立即查询:根据id查询,调用get方法,已调用get方法马上发送语句查询数据库
延迟查询:根据id查询,还有load方法,调用load方法不会马上发送语句查询数据,只有得到对象里面的值时候才会发送语句查询数据库
延迟查询分成两类:
类级别延迟:根据id查询返回实体类对象,调用load方法不会马上发送语句
关联级别延迟:查询某个客户,再查询这个客户的所有联系人,查询客户的所有联系人的过程是否需要延迟,这个过程称为关联级别延迟
关联级别延迟操作
在映射文件中进行配置实现
根据客户得到所有的联系人,在客户映射文件中配置
在set标签上使用属性
fetch:值select
lazy:值
true:延迟
false:不延迟
extra:极其延迟,要什么值给什么值
25.批量抓取
查询所有的客户,返回list集合,遍历list集合,得到每个客户,得到每个客户的所有联系人
上面操作代码,发送多条sql语句
在客户的映射文件中,set标签配置
batch-size值,值越大发送语句越少