简述
持久层ORM框架
ORM:对象关系映射 类与表之间的映射(建立关系),操作对象相当于操作表(体现面向对象的思想)。
优点
1、减少重复性代码(数据库连接代码、sql语句)
2、ORM实现
3、映射灵活性
4、可扩展性,API开放
5、缓存
传统Web应用方式
Servlet+jsp+javabean+jdbc可以完成所有Web应用的开发,过于底层,开发效率低。
传统jdbc开发
UserDao{
public void save(User user){
Connection con = ... //定义连接对象
PreparedStatement stmt = .... //定义预编译对象
con = .. //获得连接
String sql = ... //编写sql语句
stmt = conn. //预编译
stmt=.setXXX(); // 传进来的类要进行修改时,设置的名字也要修改
stmt.excuteUpdate();
}
}
)
配置
1、创建表
2、创建pojo类
3、创建映射,最好与pojo类放在同一包下
4、创建配置文件
映射的配置详解
1、class标签的配置
标签用来建立类与表的映射关系
属性:
name :类的全路径
table :表名(类名与表名一致,table可以省略)
catalog :数据库名
2、id标签的配置
标签用来建立类中的属性与表中的主键的对应关系
属性:
name :类中的属性名
column :表中的字段名(类中的属性名和表中的字段名如果一致,column可以省略)
length :长度
type :类型
3、property标签的配置
标签用来建立类中的普通属性与表的字段的对应关系
属性:
name :类中的属性名
column :表中的字段名
length :长度
type :类型
not-null :设置非空
unique :设置唯一
Hibernate的核心配置方式
1、属性文件的方式
属性文件的方式不能引入映射文件(手动编写代码加载映射文件)
2、XML文件的方式(常用)
Hibernate组件详解
1、Configuration:Hibernate的配置对象
作用:
加载核心配置文件
hibernate.properties
Configuration cfg = new Configuration();
hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
加载映射文件
// 手动加载映射
configuration.addResource("com/itheima/hibernate/demo1/Customer.hbm.xml");
2、SessionFactory:Session工厂
SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象。一个项目创建一个对象即可。
配置连接池:
<!-- 配置C3P0连接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
3、 Session:类似Connection对象是连接对象
Session代表的是Hibernate与数据库的链接对象。不是线程安全的。与数据库交互桥梁。
Session中的API
保存方法:
Serializable save(Object obj);
查询方法:
T get(Class c,Serializable id);
T load(Class c,Serializable id);
get方法和load方法的区别?
修改方法
void update(Object obj);
删除方法
void delete(Object obj);s
保存或更新
void saveOrUpdate(Object obj)
查询所有
4、Transaction:事务对象
Hibernate中管理事务的对象。
api:
commit();
rollback();
Hibernate的持久化类的编写规则
无参数构造
属性私有
属性尽量使用包装类
提供一个唯一OID与主键对应
不要使用final修饰
Hibernate的主键生成策略
主键分类
自然主键
代理主键
主键生成策略
increment
identity
sequence
uuid
native
assigned
foreign
持久化类三种状态(为了理解API)
瞬时态
没有唯一标识OID,没有被session管理
持久态
有OID,被session管理
托管态
有OID,没有被session管理
Hibernate的一级缓存
一级缓存:Hibernate优化手段,称为是session级别缓存,能自动更新数据库。
一级缓存:快照区
Hibernate的事务管理
Hibernate解决读问题
配置设置隔离级别
Hibernate解决Service事务
保证连接对象一致:1、向下传递2、使用ThreadLocal对象(用于绑定线程),hibertnate内部采用的是线程绑定的方式
Hibernate的其他的API
Query :HQL 面向对象方式的查询。
Criteria :QBC 完成面向对象化。
SQLQuery :SQL查询
Hibernate一对多关联映射
1、数据库表与表之间的关系
一对多关系
例:一个部门对应多个员工,一个员工只能属于某一个部门。
一对多的建表原则:在多的一方创建外键指向一的一方
多对多关系
例:一个学生可以选择多门课程,一门课程也可以被多个学生选择。
多对多的建表原则:创建中间表设置两字段指向多的双方。
一对一关系(了解)
例:一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。
一对一的建表原则:随便一方创建外键指向另一方
2、编码
1、创建数据库和表
2、 创建实体
3、创建映射文件
多的一方
一的一方
4、创建核心配置文件
Hibernate的一对多级联操作
1、场景:一对多关系只保存一边是否可以:
2、 一对多的级联操作解析
1、什么叫做级联
级联指的是,操作一个对象的时候,是否会同时操作其关联的对象。
2、级联是有方向性
操作一的一方的时候,是否操作到多的一方
操作多的一方的时候,是否操作到一的一方
3、 级联操作
1、保存或更新
保存客户级联联系人
保存联系人级联客户
2、级联删除
删除客户级联删除联系人
出现问题及解决方式
1、例子:一对多设置了双向关联产生多余的SQL语句
2、解决多余的SQL语句
单向维护:使一方放弃外键维护权,一的一方放弃。
在set上配置inverse=”true”
Hibernate的多对多关联映射
1、 创建表
2、创建实体
3、创建映射
用户的映射
角色的映射
Hibernate的查询的方式
1、OID查询
OID检索:Hibernate根据对象的OID(主键)进行检索
使用get方法
Customer customer = session.get(Customer.class,1l);
使用load方法
Customer customer = session.load(Customer.class,1l);
2、Hibernate的查询方式:对象导航检索
对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。
LinkMan linkMan = session.get(LinkMan.class,1l);
Customer customer = linkMan.getCustomer();
Customer customer = session.get(Customer.class,2l);
Set<LinkMan> linkMans = customer.getLinkMans();
3、 Hibernate的查询方式:HQL检索
HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。
4、 Hibernate的查询方式:QBC检索
QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。
5、Hibernate的查询方式:SQL检索
延迟加载的概述
什么是延迟加载
延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。
延迟加载的分类
1、类级别的延迟加载
指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效
将lazy设置为false
将持久化类使用final修饰
Hibernate. Initialize()
2、关联级别的延迟加载
指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。
Customer customer = session.get(Customer.class,1l);
customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。
抓取策略往往会和关联级别的延迟加载一起使用,优化语句。
抓取策略
1、抓取策略的概述
通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。
通过<set>或者<many-to-one>上通过fetch属性进行设置
fetch和这些标签上的lazy如何设置优化发送的SQL语句
2、 <set>上的fetch和lazy
fetch:抓取策略,控制SQL语句格式
select :默认值,发送普通的select语句,查询关联对象
join :发送一条迫切左外连接查询关联对象
subselect :发送一条子查询查询其关联对象
lazy:延迟加载,控制查询关联对象的时候是否采用延迟
true :默认值,查询关联对象的时候,采用延迟加载
false :查询关联对象的时候,不采用延迟加载
extra :及其懒惰。
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
3、<many-to-one>上的fetch和lazy
fetch :抓取策略,控制SQL语句格式。
select :默认值,发送普通的select语句,查询关联对象。
join :发送一条迫切左外连接。
lazy :延迟加载,控制查询关联对象的时候是否采用延迟。
proxy :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
false :查询关联对象,不采用延迟。
no-proxy :(不会使用)
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
批量抓取
什么是批量抓取:一批关联对象一起抓取,batch-size