Hibernate概述
什么是框架?
写程序, 使用框架之后,帮我们实现一部分的功能,使用框架的好处,少写一部分的代码。
什么是Hibernate框架(重点)
- Hibernate框架应用在javaee三层架构中 dao层架构
- 在dao层里面做对数据库crud操作,使用Hibernate实现crud操作,Hibernate底层代码就是jdbc,Hibernate对jdbc进行封装,使用Hibernate的好处,不需要写jdbc代码了。不需要写sql语句实现
- Hibernate开源 轻量级框架
- hibernate版本 — 5.x
什么是orm思想?
1、hibernate使用orm思想对数据库进行crud操作
2、在web阶段学习javabean 更正确的叫法叫做实体类
3、orm:Object Relational Mapping ,对象关系映射
文字描述:
1) 让实体类与数据库的一一对应
让实体类与数据库对应
让实体类属性与表的字段对应
2)、不需要直接操作数据库表,操作实体类就可以了
Hibernate入门
搭建hibernate环境
导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 添加Hibernate依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.17.Final</version>
</dependency>
<!-- 添加Log4J依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.6.4</version>
</dependency>
<!-- 添加javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.0.GA</version>
</dependency>
<!-- mysql数据库的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
创建实体类
public class User {
/**
* 要求: hibernate要求实体类中有一个属性是唯一的*/
private Integer uid;
private String username;
private String password;
private String address;
// 自己生成 getter setter
}
使用hibernate的时候 不需要自己手动创建表,hibernate帮忙把表创建
配置实体类话数据库表一一对应
使用配置文件实现映射关系
1、 创建xml格式的配置文件
- 映射的配置文件名称和位置没有固定的要求
- 建议:在实体类所在的包中创建 ==名称建议:实体类名称.hbm.xml==
2、配置是xml格式,在配置文件中首先引入xml约束
- 使用![dtd](https://img-blog.csdnimg.cn/20200812165445207.png#pic_center)
约束
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
</hibernate-mapping>
3、配置hibernate映射关系
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
1、配置类和表对应
class标签
name属性 : 实体类全路径
table属性 : 数据库表的名称
-->
<class name="com.jsu.entity.User" table="user">
<!--
2、 配置实体类id 与 表id 对应
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值
-->
<!--
id标签 一般建议一样(不一样也可以)
name : 实体类里面id的名称
column : 生成的表字段名称
-->
<id name="uid" column="uid">
<!--
设置数据库中 id 增长的策略
native : 生成表id值就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!--
配置其他的属性和表的字段对应
name : 实体类属性名称
column : 生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
创建hibernate核心配置文件
核心:指定生成数据库的表
1、核心配置文件格式xml,而且核心配置文件名称和位置都是固定的
位置:必须src下面/resource
名称:必须hibernate.cfg.xml
2、引入dtd约束
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
3、hibernate 操作过程中 只会加载核心配置文件,其他的配置文件不会加载
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="">
<!--
hibernate 操作过程中 只会加载核心配置文件,其他的配置文件不会加载
第一部分: 配置数据库的信息
第二部分:配置hibernate信息
第三部分:把映射文件方法核心配置文件中
-->
<!--第一部分: 配置数据库的信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jsu</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">000</property>
<!--第二部分:配置hibernate信息-->
<!-- 是否显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否格式化底层sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 配置数据库的方言
在mysql里面实现分页 关键字 limit 只能使用mysql里面
在oracle数据库,实现分页rownum
让hibernate框架识别不同数据库的自己特有的语句
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL55Dialect</property>
<!--
hibernate帮创建表 需要配置之后
update : 如果已经有了表,更新;如果没有用这个表 创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 是否自动提交事务:针对insert有效,针对delete无效 -->
<property name="hibernate.connection.autocommit">true</property>
<!--第三部分:把映射文件方法核心配置文件中 -->
<mapping resource="com/jsu/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
实现添加操作
效果显示:
- 是否生成表
- 看表是否有记录
流程 - 1、加载hibernate核心配置文件(固定)
- 2、创建SessionFactory对象(固定)
3、使用SessionFactory创建session对象(固定)
4、开启事务(固定)
5、写具体逻辑 crud操作(唯一变化)
6、提交事务(固定)
7、关闭资源(固定)
public class HibernateTest {
@Test
public void testAdd() {
// 1、加载hibernate核心配置文件(固定)
// 到src下面找到的名称是hibernate.cfg.xml
// 在hibernate里面封装了对象
Configuration configuration = new Configuration();
configuration.configure();
// 2、创建SessionFactory对象(固定)
// 读取hibernate核心配置文件内容。创建sessionFactory
// 在过程中,根据映射关系,在配置数据库里面把表创建
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3、使用SessionFactory创建session对象(固定)
// 类似于连接
Session session = sessionFactory.openSession();
// 4、开启事务(固定)
Transaction transaction = session.beginTransaction();
// 5、写具体逻辑 crud操作(唯一变化)
User user = new User();
user.setUsername("小王");
user.setPassword("1234");
user.setAddress("上海");
// 调用session的方法实现添加
session.save(user);
// 6、提交事务(固定)
transaction.commit();
// 7、关闭资源(固定)
session.close();
sessionFactory.close();
}
}
Hibernate核心的api
Configuration
# 1、加载hibernate核心配置文件(固定)
# 到src下面找到的名称是hibernate.cfg.xml
# 2、去指定位置查找配置文件
Configuration config = new Configuration ().configure("/config/hibernate.cfg.xml");
# 3、加载映射文件
Configuration configuration = new Configuration () .configure ("xml文件位置");
configuration.addResource("com/domain/User.hbm.xml")
SessionFactory(重点)
使用Configuration对象 创建 SessionFactory 对象
1)、创建SessionFactory对象过程中做事情:
- 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
只有配置文件中有:<property name="hibernate.hbm2ddl.auto">update</property> 才会创建
创建SessionFactory的过程中,十分的消耗资源
1)、在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
具体实现
1)、写工具类,在静态代码块实现
-静态代码块在类加载的时候,执行一次
session
1、类似于jdbc中的connection
2、调用session中不同的方法实现crud操作
- 添加save方法
- 修改update方法
- 删除delete方法
- 根据id查询 get方法
3、单线程对象
- session对象不能共用,只能自己使用
Transaction
开启事务
Transaction transaction = session.beginTransaction();
事务管理的常用方法,具体如下:
- commit()方法:提交相关联的session实例。
- rollback(方法:撤销事务操作。
事务概念
1、事务四个特性
- 原子性(都成功或都失败)
- 一致性(操作之前之后,数据一致)
- 隔离性(同时操作同一条记录,不产生影响)
- 持久性(对数据所作的所有改动都必须在事务成功结束前保存)
- 根据id查询 get方法
3、单线程对象
- session对象不能共用,只能自己使用
Transaction
开启事务
Transaction transaction = session.beginTransaction();
事务管理的常用方法,具体如下:
- commit()方法:提交相关联的session实例。
- rollback(方法:撤销事务操作。
事务概念
1、事务四个特性
- 原子性(都成功或都失败)
- 一致性(操作之前之后,数据一致)
- 隔离性(同时操作同一条记录,不产生影响)
- 持久性(对数据所作的所有改动都必须在事务成功结束前保存)
Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC