文件结构
maven 依赖
<!-- hibernate 核心依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.22.Final</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
1. 工具类 HibernateUtil.java
包com.xxx.utils
src/main/resources/mapper/Department.hbm.xml
package com.bdqn.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate 工具类
*/
public class HibernateUtil {
// 会话工厂对象
private static SessionFactory sessionFactory;
// 使用静态代码读取配置文件
static {
// 1. 读取并解析配置文件
Configuration configuration = new Configuration().configure();
// 2. 创建会话工厂类
sessionFactory = configuration.buildSessionFactory();
}
/**
* 获取Session
*
* @return
*/
public static Session getSession() {
// return sessionFactory.openSession(); // 需要关闭资源
return sessionFactory.getCurrentSession(); // 需要在hibernate文件中配置线程上线文
}
/**
* 根据主键删除
* */
public static void closeSession(Session session){
// 判断Session是否为空或Session是否处于打开状态
if(session != null && session.isOpen()){
session.close(); // 关闭 session
}
// 关闭工厂对象
sessionFactory.close();
}
}
2. 实体类文件 实例
包:com.xxx.entity
package com.bdqn.entity;
/**
* 部门类
* */
public class Department {
// int默认为0 Integer默认为空
private Integer deptNo; // 部门编号
private String deptName; // 部门名称
private String location; // 部门位置
public Integer getDeptNo() {
return deptNo;
}
public String getDeptName() {
return deptName;
}
public String getLocation() {
return location;
}
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public void setLocation(String location) {
this.location = location;
}
@Override
public String toString() {
return "Department{" +
"deptNo=" + deptNo +
", deptName='" + deptName + '\'' +
", location='" + location + '\'' +
'}';
}
}
3. hibernate配置文件 hibernate.cfg.xml
hibernate.cfg.xml
<?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>
<!-- Hibernate 连接数据库的基本信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.url">jdbc:mysql://localhost:3306/myweb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai</property>
<!-- 使用MYSQL的 innodb引擎 -->
<property name="hibernate.dialect.storage_engine">innodb</property>
<!--<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>-->
<!-- 根据实体类生成数据库表 -->
<!-- create:每次运行会重新创建表 -->
<!-- update: 修改表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 显示SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 线程上下文 对应获取Session第二种方法 -->
<property name="current_session_context_class">thread</property>
<!-- 加载映射文件 -->
<mapping resource="mapper/Department.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4. 映射文件 实体类名.hbm.xml
src/main/resources/mapper/Department.hbm.xml
<?xml version="1.0"?>
<!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属性:该实体类的路径(全局路径、全限定名)
table属性:该实体类关联的数据库表的名称
-->
<class name="com.bdqn.entity.Department" table="department">
<!--mmnnn
id标签:配置主键属性
name属性:实体类的属性名(严格区分大小写)
type属性:该属性的数据类型
column属性:对应数据表中的列名,不区分大小写,当属性名与列名一致时,可省略不写
-->
<id name="deptNo" type="java.lang.Integer" column="deptNo">
<!-- 配置主键生成策略 -->
<!-- assigned:主键有程序提供,默认生成策略,一般不用 -->
<!-- increment: 主键自增:先插叙表中的最大主键值,在此基础上+1操作,适用于mysql,sql server等数据库自增的不适合oracle -->
<generator class="increment"/>
</id>
<!--
property标签:配置普通属性(非主键)
name属性:实体类的属性名(严格区分大小写)
type属性:该属性的数据类型
column属性:对应数据库表中的列名,不区分大小写,当属性名与列名一致时,可省略不写
-->
<property name="deptName" type="string" column="deptName"/>
<property name="location" type="java.lang.String">
<column name="location"></column>
</property>
</class>
</hibernate-mapping>
5. 增
5.1 普通方法
/**
* 添加部门
*/
@Test
public void testAddDept() {
// 1.读取hibernate配置文件
Configuration configure = new Configuration().configure();
// 2.创建SessionFactory工厂
SessionFactory sessionFactory = configure.buildSessionFactory();
// 3.创建Session对象
// 方法一: 使用openSession()方法获取对象,必须关闭session对象
// Session session = sessionFactory.openSession();
// 方法二:此方法获取Session对象必须配置线程上下文
Session session = sessionFactory.getCurrentSession();
// 4.开启事务
Transaction transaction = session.beginTransaction();
// 5. 持久化操作
Department department = new Department();
// department.setDeptNo(6); // 主键自增时这个失效
department.setDeptName("市场部");
department.setLocation("202");
try {
// 调用save()方法保存
session.save(department);
// 6.提交事务
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
// 回滚事务
transaction.rollback();
} finally {
// 关闭资源
if (session != null) {
session.close();
}
}
}
6. 删
6.1 根据主键删除
/**
* 根据主键删除
* */
@Test
public void testDelete() {
// 获取 session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
try {
// 根据主键查询 查不到返回 null
Department department = session.get(Department.class, 1);
session.delete(department);
transaction.commit();
// System.out.println(department);
} catch (Exception e) {
// 关闭资源
HibernateUtil.closeSession(session);
}
}
7. 改
7.1 先查询 后修改
/**
* 先查询 后修改:没有赋值的属性保持不变
* */
@Test
public void testUpdate() {
// 获取 session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
try {
// 根据主键查询 查不到返回 null
Department department = session.get(Department.class, 2);
// 修改
department.setDeptName("666");
// 提交事务
transaction.commit();
} catch (Exception e) {
// 关闭资源
HibernateUtil.closeSession(session);
}
}
7.2 创建对象修改,没有赋值的属性会清空(不推荐)
/**
* 创建对象修改,没有赋值的属性会清空
* 一般不用
* */
@Test
public void testUpdate2() {
// 获取 session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
try {
// 创建对象
Department department = new Department();
department.setDeptNo(2);
department.setDeptName("123");
// 修改
session.update(department);
// 提交事务
transaction.commit();
} catch (Exception e) {
// 关闭资源
HibernateUtil.closeSession(session);
}
}
8. 查
8.1 根据主键查询 get()
/**
* 根据主键查询
* load(): 延迟加载
* 主键不存在时 报错:org.hibernate.ObjectNotFoundException:
* */
@Test
public void testLoad(){
// 获取 session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 根据主键查询 查不到返回 null
Department department = session.load(Department.class, 1);
System.out.println(department);
// 关闭资源
HibernateUtil.closeSession(session);
}
8.2 根据主键查询 load()
/**
* 根据主键查询
* load(): 延迟加载
* 主键不存在时 报错:org.hibernate.ObjectNotFoundException:
* */
@Test
public void testLoad(){
// 获取 session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
// 根据主键查询 查不到返回 null
Department department = session.load(Department.class, 1);
System.out.println(department);
// 关闭资源
HibernateUtil.closeSession(session);
}
9. 脏值检查
/**
* 脏值检查
* */
@Test
public void testState(){
// 获取Session
Session session = HibernateUtil.getSession();
// 开启事务
// Transaction transaction = (Department) session.beginTransaction();
Transaction transaction = session.beginTransaction();
try{
// 根据主键查询
Department department = session.get(Department.class, 2); // 研发部 ---> 内存(副本、快照)
// 赋值
department.setDeptName("大佬");
transaction.commit();
} catch (Exception e){
e.printStackTrace();
transaction.rollback();
} finally {
// 关闭资源
HibernateUtil.closeSession(session);
}
}
10. 增删改查 其他方法
10.1 保存或更新 saveOrUpdate()
- 主键生产策略不能是 assigned
- 新增:没有指定主键的情况下回执行新增操作
- 修改:当指定主键是存在的,执行修改操作,若主键不存在,会触发空指针异常
/**
* saveOrUpdate(): 主键生产策略不能是 assigned
* 新增:没有指定主键的情况下回执行新增操作
* 修改:当指定主键是存在的,执行修改操作,若主键不存在,会触发空指针异常
*
* */
@Test
public void testSaveUpdate(){
// 获取Session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
try{
// 查询数据
Department department = session.get(Department.class, 1);
// 修改数据
department.setDeptName("高管");
// 调用方法
session.saveOrUpdate(department);
// 提交事务
transaction.commit();
} catch (Exception e){
e.printStackTrace();
transaction.rollback();
} finally {
// 关闭资源
HibernateUtil.closeSession(session);
}
}
10.1 新增 meerge()
新增:没有指定主键的情况下会执行新增操作;指定主键不存在,也会执行新增(先根据主键查询,对象为空则新增)
/**
* meerge():
* 新增:没有指定主键的情况下会执行新增操作;指定主键不存在,也会执行新增(先根据主键查询,对象为空则新增)
* */
@Test
public void testMerge(){
// 获取Session
Session session = HibernateUtil.getSession();
// 开启事务
Transaction transaction = session.beginTransaction();
try{
// 查询数据
Department department = session.get(Department.class, 1);
// 修改数据
department.setDeptName("高管");
department.setDeptNo(1000);
// 调用方法
session.merge(department);
// 提交事务
transaction.commit();
} catch (Exception e){
e.printStackTrace();
transaction.rollback();
} finally {
// 关闭资源
HibernateUtil.closeSession(session);
}
}