Hibernate 是一个 JDO( Java Data Objects)工具。它的工作原理是通过文件把值对象(Java对象)和
数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法。
配置 Hibernate 框架
配置 Hibernate 框架,需要三个准备,七个步骤。
准备一、导入 Hibernate 库
准备二、添加配置文件 hibernate.cfg.xml
准备三、添加映射文件 UserInfo.hbm.xml
步骤一、创建 Configuration
步骤二、创建 SessionFactory
步骤三、打开 Session
步骤四、开始一个事务
步骤五、持久化操作
步骤六、提交事务
步骤七、关闭 Session
HQL检索方式
HQL检索方式,与SQL语法有些类似。但是HQL是面向对象的,它操作的是持久化类的类名和类属性,
而SQL操作的是表名和字段名。Query接口封装了HQL查询语言。
ORM
ORM 是 Objiect Relational Mapping 的简称,即对象关系映射。
ORM 是通过使用描述对象和数据库之间映射的原数据,将 Java 程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换为另一种形式。ORM 产品如下:Hibernate、IBatis
hibernate.cfg.xml 文件元素分析 (Hibernate配置文件)
<hibernate-configuration>是文件的根元素,所有相关的配置都要在此元素下配置。
<session-factory>session 工厂配置,相当于 JDBC 中的 DriverManager。
<property name="connection.username">root</property>指定连接数据库的用户名。
<property name="connection.password">922526</property>指定连接数据库的密码。
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>指定连接数据
库的驱动程序。
<property name="connection.url">jdbc:mysql://localhost:3306/mybbs</property>指定连接数
据库 URL。
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>指定数据库使用
的 SQL 方言。
Hibernate 能够访问多种数据库,如 MySQL、 Oracle 和 Sybase 等。尽管多数数据库都支
持标准的 SQL 语言,但是它们往往还有各自的 SQL 方言,就像不同地区的人既能说标准普
通话,还能将各自的方言一样。
<property name="show_sql">true</property>显示 SQL 语句
UserInfo.hbm.xml 文件元素分析 (Hibernate映射文件)
UserInfo.hbm.xml 作用是告诉 Hibernate 怎么来做对象映射。向哪个表插入数据,每个属
性的数据类型,以及对应数据表里的列名。
SessionFactory 实例
对应一个数据存储源应用从 SessionFactory 中获得 Session 实例。
SessionFactory 用到了一个设计模式-工厂模式,用户程序从工厂类 SessionFactory 中取得 Sessi
on 的实例,设计者的意图是让它能在整个应用程序中共享。
![](https://i-blog.csdnimg.cn/blog_migrate/1c7d60fe80c1c6fa18e75a865188c57b.png)
hibernate
基础部分
jdbc缺点
jdbc缺点.txt
hibernate优点
hibernate优点.txt
操作部分
查询 例子 session.get(xxx);
List<Classes> classes = session.createQuery("from Classes").list();
Iterator<Classes> iterator = session.createQuery("from Classes").iterate();
修改、session.update(xxx)
删除、session.delete(xxx)
增加 session.save(xxx)
执行过程
执行过程.txt
基本组成
hibernate.cfg.xml
hibernate配置文件.txt
持久化类
持久化类.txt
*.hbm.xml
映射文件.txt
主键的产生机制
主键的产生机制.txt
hibernate类型
hibernate类型.txt
执行原理
执行原理.bmp
对象状态
对象的状态.txt
hibernate缓存部分
hibernate一级缓存
get方法
load方法
save方法
update方法
flush方法
evict方法
clear方法
一级缓存.txt
hibernate二级缓存
关于二级缓存.txt
hibernate查询缓存
关系部分
一对多单项
一对多双向
多对多双向
hibernate-关系部分.txt
性能部分
延迟加载
抓取策略
延迟加载和抓取策略.txt
hql语句
hql语句.txt
hbm2ddl.auto
根据持久化类生成表的策略
例子:<property name="hbm2ddl.auto">update</property>
validate 通过映射文件检查持久化类与表的匹配
update 每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么 都不做了
create 每一次hibernate启动的时候,根据持久化类和映射文件生成表
show_sql 显示sql
<property name="show_sql">true</property>
format_sql 格式sql
<property name="format_sql">true</property>
可以根据持久化类和映射文件
实现了Serializable的主要的作用是为了在网络上传输
jdbc缺点
1
、编程的时候很繁琐,用的try和catch比较多
2
、jdbc没有做数据的缓存
3
、没有做到面向对象编程
4
、sql语句的跨平台性很差
jdbc的优点
效率比较高
hibernate的优点
1
、完全的面向对象编程,所以不需要写sql,hibernate帮我们自动生成SQL
2
、hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存 重点
3
、编程的时候就比较简单了
4
、跨平台性很强
5
、使用场合就是企业内部的系统
hibernate的缺点
1
、效率比较低
2
、表中的数据如果在千万级别,则hibernate不适合
3
、如果表与表之间的关系特别复杂,则hibernate也不适合
sessionFactory
1
、hibernate中的配置文件、映射文件、持久化类的信息都在sessionFactory中
2
、sessionFactory中存放的信息都是共享的信息
3
、sessionFactory本身就是线程安全的
4
、一个hibernate框架sessionFactory只有一个
5
、sessionFactory是一个重量级别的类
session
1
、得到了一个session,相当于打开了一次数据库的连接
2
、在hibernate中,对数据的crud操作都是由session来完成的
主键的产生器
1、increment 自动生长,主键必须是数字类型。
* 先找到主键的最大值,在最大值基础上加1
<!--
主键的产生器
-->
<generator class="
increment"></generator>
2、assigned 在程序中手动的设置主键的值
3、identity
* 主键必须是数字类型
* 该效率比increment要高,但是id值不连续
4、UUID
* uuid的字符串是由hibernate内部生成的
* 要求主键必须是字符串类型
缓存
oscache,ehcache 小型的应用
memory cache,redis,hbase 分布式的应用
一级缓存
为session级别的缓存,一级缓存的生命周期和session的生命周期保持一致。
一级缓存的意义,通过session.flush(),只和数据库交换一次。
具体细节在缓存总操作数据,然后flush,最后和数据库交换一次
![](https://i-blog.csdnimg.cn/blog_migrate/52256c6cbce866325bf74e879a00a79e.png)
一级缓存位置
![](https://i-blog.csdnimg.cn/blog_migrate/4a02c966ca47544916fccdc95f1e2fe6.jpeg)
一级缓存操作
get方法
可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来
save方法
该方法可以把一个对象放入到一级缓存中
evit方法
可以把一个对象从session的缓存中清空
update方法
可以把一个对象放入到一级缓存(session)中
clear方法
清空一级缓存中所有的数据
close方法
当调用session.close方法的时候,一级缓存的生命周期就结束了
cascade 级联操作
null 默认值
save-update
cascade指的是级联操作,操作的是一般属性,指的是对象与对象的操作
inverse指的是关系操作,针对的就是外键
all
delete
inverse 关系操作
default:classes维护classes与student之间的关系
true: classes不维护classes与student之间的关系
false: classes维护classes与student之间的关系
一对多的单项
inverse与cascade的关系
cascade
指的是级联操作,操作的是一般属性,指的是对象与对象的操作
inverse
指的是关系操作,针对的就是外键
一对多的双向
当多的一方维护关系时,不会发出更新关系的update语句,而一的一方维护关系时
需要发出维护关系的update语句,所以在这里,一般情况下,多的一方维护关系效率
比较高。
多对多维护关系
多对多建立关系相当于在第三张表中插入一行数据
多对多解除关系相当于在第三张表中删除一行数据
多对多修改关系相当于先删除后增加
多对多谁维护效率都一样。看需求
一对一
<!--
外键
column
unique外键只能出现一次
-->
<many-to-one name="classes" column="cid" class="com.itheima12.hibernate.domain.Classes"
unique="true"
cascade="save-update"></many-to-one>
二级缓存
实用的场合
公开的数据
数据基本上不发生变化
该数据保密性不是很强
说明:如果一个数据一直在改变,不适合用缓存。
例如:12306的省份、市地址
生命周期
二级缓存的生命周期和sessionFactory是一致的。
设置二级缓存
利用的是ehcache实现的二级缓存
1、在hibernate的配置文件中
<!--
二级缓存的供应商
-->
<property name="cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!--
开启二级缓存
-->
<property name="cache.use_second_level_cache">true</property>
<!--
开启二级缓存的统计机制 可选
-->
<property name="generate_statistics">true</property>
2、指定哪个类开启二级缓存
可以在 xx.cfg.xml文件中
<class-cache usage="read-only" class=""com.itheima12.hibernate.domain.Classes""/>
也可以在
xx.hbm.xml文件中
<class name="com.itheima12.hibernate.domain.Classes">
<cache usage="read-only"/>
</class>
哪些方法可以把对象放入到二级缓存
get方法,list方法可以把一个或者一些对象放入到二级缓存中
哪些方法可以把对象从二级缓存中提取出来
get方法,iterator方法可以提取
策略
![](https://i-blog.csdnimg.cn/blog_migrate/5f9d1cbd5e681939b51f29e91bb07e20.jpeg)
read-only:对象只要加载到二级缓存以后,就只能读取了,不能进行修改。
read-write:对二级缓存中的对象能够进行读和写的操作
查询缓存
一级缓存和二级缓存都是对象缓存:就是把该对象对应的数据库表中的所有的字段
全部查询出来了,这种查询在某些场合下会让效率降低。例如:表中的字段特别多,
但是程序中所需要的字段却很少。
查询缓存也叫数据缓存:内存(页面)中需要多少数据就把多少数据放入到查询缓存
中。
生命周期
只要一些数据放入到查询缓存中,该缓存会一直存在,直到缓存中的数据被修改了,该
缓存的生命周期就结束了。
操作步骤
1、在hibernate的配置文件中,开启查询缓存
2、使用查询缓存
query.setCacheable(true);//query要使用查询缓存了
query.list();//把数据放入到查询缓存中
总结
hibernate总共有三种缓存
一级缓存解决的问题是在一次请求中,尽量减少和数据库交互的次数,在session.flush之前,改变的是一级缓存的对象的属性。当session.flush的时候才要
跟数据库交互,一级缓存解决不了重复查询的问题。一级缓存是对象缓存
二级缓存可以把经常不改变、常用的公共的数据放入进来,可以重复查询,利用get方法和iterator方法可以把二级缓存中的数据得到。
查询缓存可以缓存数据或者对象,可以利用list方法把查询缓存中的数据放入到缓存中
查询缓存中存放的是数据,是数据缓存。
懒加载的时候:
需要数据的时候才要加载
集合的懒加载
set的延迟加载:
true
false
extra
说明:
1、因为延迟加载在映射文件设置,而映射文件一旦确定,不能修改了。
2、延迟加载是通过控制sql语句的发出时间来提高效率的。
抓取策略
![](https://i-blog.csdnimg.cn/blog_migrate/24e7d3b21a89ed84c03f08ddea564811.jpeg)
join:左外连接
select:默认的值
subselect:子查询
说明:
1、因为抓取策略的设置在映射文件中,所以一旦映射文件生成就不能改变了。
2、通过发出怎么样的SQL语句加载集合,从而优化效率的。
抓取策略是应用于集合。
hql语句
1、单表
Session session = sessionFactory.openSession();
List<Classes> classes = session.createQuery("from Classes").list();
session.close();
2、Criteria查询
3、sql查询
其他参考
HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good
HibernateDaoSupport:让简单的增删改查如此简单