一,概述
什么是Hibernate框架?
- 一个框架
- 一个java领域的持久化框架
- 一个ORM(object relation Mapping)框架
对象的持久化
ORM(对象/关系 映射)
object relation Mapping
流行的ORM框架
-
Hibernate:
非常优秀、成熟的ORM框架。
完成对象的持久化操作
一Hibernate允许开发者采用面向对象的方式来操作关系数据库。
消除那些针对特定数据库厂商的SQL代码 -
myBatis :
-相比Hibernate灵活高,运行速度 快
开发速度慢,不支持纯粹的面向对象操作,需熟悉sq|语
句,并且熟练使用sq|语句优化功能 -
TopL ink
-
OJB
二,HelloWord代码
2.1 准备HIbernate环境
导入Hibernate和加载数据库的jar包,使用Maven仓库
<!-- hibernate jar包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.4.Final</version>
</dependency>
<!-- mysql加载驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
2.2 Hibernate的开发步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-olvbO1S4-1645959532486)(C:\Users\无敌维\AppData\Roaming\Typora\typora-user-images\1645929356376.png)]
1.创建Hibemate配置文件
使用IDEA,快速创建 *.cfg.xml文件 设置中配置文件模板 setting —>Editor -->file and code Templates(也可以直接创建)
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
-->
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sgg_hibernate?serverTimezone=GMT</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">****</property>
<!-- 数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
sql99标准: DDL 定义语言 库表的增删改查
DCL 控制语言 事务 权限
DML 操纵语言 增删改查
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--
#hibernate.show_sql true
#hibernate.format_sql true
-->
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export 自动导出表结构. 自动建表
#hibernate.hbm2ddl.auto create自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
引入orm元数据路径书写: 填写src下的路径
-->
<mapping class="com.sgg.pojo.User"/>
<mapping resource="Mapper/User.hbm.xml"/>
<!-- <mapping resource="cn/itheima/domain/Customer.hbm.xml" />-->
</session-factory>
</hibernate-configuration>
2.创建持久化类
就是一个实体类,对应数据库中的各字段
3.创建对象关系映射文件
*.hbt.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sgg.pojo.User" table="user" schema="sgg_hibernate">
<id name="id" column="id"/>
<property name="name" column="name"/>
<property name="password" column="password"/>
</class>
</hibernate-mapping>
4.通过Hibemate API编写访问数据库的代码
@Test
public void test1(){
//1.创建一个SessionFactory对象
SessionFactory sessionFactory =null;
//1)创建Configuration对象:对应hibernate的配置信息和关系映射信息
Configuration configuration= new Configuration().configure();
//sessionFactory = configuration.buildSessionFactory();
//2)创建一个serviceRegistry对象:hibernate4.0后新添加的对象
//hibernate 的任何配置和服务都需要在该对象中注册才有效。
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(
configuration.getProperties()).buildServiceRegistry();
//3)
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2.创建一个Session对象
Session session = sessionFactory.openSession();
//3.开启事务
Transaction transaction = session.beginTransaction();
//4.执行并保存事务
User u = new User("lisi","123");
session.save(u);
//5.提交事务
transaction.commit();
//6.关闭资源 session对象 sessionFaction对象
session.close();
sessionFactory.close();
2.3 HelloWord详解释
1,持久化类
2,对象关系映射文件
3,Hibernate配置文件
4,通过HIbernate API编写访问数据库的代码
使用Hibernate进行数据持久化操作, 通常有如下
步骤:
- 编写持久化类: POJO+映射文件
- 获取Configuration对象
- 获取SessionFactory对象
- 获取Session ,打开事务
- 用面向对象的方式操作数据库
- 关闭事务,关闭Session
Configuration类
SessionFaction接口
Session接口
Transaction(事务)
三,Session对象
Hibernate 一级缓存
/**
flush:使数据表中的记录和Session缓存中的对象的状态保持-致。为了保持-致,则可能会发送对应的Sql语句
1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务
2. flush() 方法会可能会发送SQL语句,但不会提交事务。
3.注意:在未提交事务或显式的调用session. flush()方法之前,也有可能会进行flush()操作。
1)执行HQL 或 QBC 查询,会先进行flush操作,以得到数据库的最新操作
2)save 若记录的ID是由底层数据库使用自增的方式生成的,则在调用save() 方法后,就会立即发送 INSER因为save方法后,必须保证对象的ID是存在的!
**/
# refresh():会强制发送 SELECT语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致!
数据库隔离级别:4种