Hibernate 基本配置文件+基本增删改查

文件结构

在这里插入图片描述

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&amp;characterEncoding=UTF-8&amp;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);
	}

}

猜你喜欢

转载自blog.csdn.net/zx77588023/article/details/109501023