hibernate增删改查实战教程:基础CRUD操作代码示例详解

admin Hibernate教程 1


新手学 Hibernate 是不是总在增删改查上栽跟头?写了添加代码数据库却没新增数据,查了半天不知道问题在哪;查询时返回 null,明明数据库里有记录却拿不到;更新操作执行了没报错,数据却纹丝不动;删除时要么删不掉,要么报 “Session 已关闭” 的错误。别着急,兔子哥当年练 CRUD 时,就因为忘了开启事务,添加操作跑了十几次数据库还是空的,后来才发现 Hibernate 需要手动提交事务。今天就带零基础的朋友把 Hibernate 基础 CRUD 操作讲透,每个步骤配代码示例,再把避坑技巧全分享出来,新手快速上手增删改查真没那么难!

一、先搞懂基础:什么是 CRUD?Hibernate 怎么实现?


很多人上来就写代码,却不知道 CRUD 到底指啥,先把基础概念捋顺,学起来更有方向。
  1. CRUD 就是增删改查,数据库操作的基本功
    CRUD 是 Create(增加)、Retrieve(查询)、Update(更新)、Delete(删除)的缩写,是所有数据库操作的基础。不管做什么项目,添加数据、查询信息、修改内容、删除记录这些操作都少不了,Hibernate 通过封装好的方法帮我们简化这些操作,不用手写复杂 SQL。
  2. Hibernate 做 CRUD 的核心步骤,这 3 步少不了
    不管是增删改查中的哪一种,都离不开这几个核心步骤:

  • 加载配置文件,创建 SessionFactory(相当于数据库连接池)。
  • 从 SessionFactory 获取 Session(相当于数据库连接)。
  • 通过 Session 对象调用对应的方法(save、get、update、delete)执行操作。
  • 增删改需要开启事务并提交,查询可以不用事务但要注意 Session 关闭时机。

二、环境准备:配置文件和实体类,这俩得先弄好


做 CRUD 之前,得把基础环境搭好,核心配置和实体类映射是前提,新手别嫌麻烦,这步错了后面全白搭。
  1. 核心配置文件:hibernate.cfg.xml 关键配置
    在 src 目录下新建核心配置文件,以 MySQL 为例,关键配置如下,数据库连接信息要填对自己的:

xml
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driverproperty><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db?serverTimezone=UTCproperty><property name="hibernate.connection.username">rootproperty><property name="hibernate.connection.password">123456property><property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialectproperty><property name="hibernate.show_sql">trueproperty><mapping package="com.hibernate.crud.entity"/>session-factory>hibernate-configuration>

  1. 实体类和注解映射:User.java
    用注解映射实体类,对应数据库的 user 表,表要先建好(id 自增,name 和 age 字段):

java
import javax.persistence.*;@Entity@Table(name = "user")public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增private Integer id;@Column(name = "name") // 对应表的name字段private String name;@Column(name = "age")private Integer age;// 必须有getter和setter,不然Hibernate拿不到值public Integer getId() { return id; }public void setId(Integer id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public Integer getAge() { return age; }public void setAge(Integer age) { this.age = age; }}

  1. 工具类:获取 Session,重复代码封装
    新建 HibernateUtils.java,封装获取 Session 的方法,不用每次都写加载配置的代码:

java
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtils {private static SessionFactory sessionFactory;static {// 加载配置文件,创建SessionFactoryConfiguration cfg = new Configuration().configure();sessionFactory = cfg.buildSessionFactory();}// 获取Sessionpublic static Session getSession() {return sessionFactory.openSession();}}

三、CRUD 实战:4 个操作代码示例,一步步跟着写


环境准备好了,接下来逐个讲增删改查的具体代码,新手最好自己敲一遍,印象更深刻。
  1. Create(增加):save () 方法保存数据

java
import org.hibernate.Session;import org.hibernate.Transaction;public class AddDemo {public static void main(String[] args) {// 1.获取SessionSession session = HibernateUtils.getSession();// 2.开启事务(增删改必须开事务,不然数据不生效)Transaction tx = session.beginTransaction();try {// 3.创建对象并赋值User user = new User();user.setName("张三");user.setAge(20);// 4.调用save()保存session.save(user);// 5.提交事务tx.commit();System.out.println("添加成功!");} catch (Exception e) {// 出错回滚事务tx.rollback();e.printStackTrace();} finally {// 6.关闭Sessionsession.close();}}}

运行后,数据库 user 表会新增一条记录,控制台会打印 Hibernate 生成的 INSERT 语句,这就成功了。
  1. Retrieve(查询):get () 方法根据主键查数据

java
import org.hibernate.Session;public class QueryDemo {public static void main(String[] args) {Session session = HibernateUtils.getSession();try {// 调用get(实体类.class, 主键值)查询User user = session.get(User.class, 1); // 查询id=1的记录if (user != null) {System.out.println("查询到:id=" + user.getId() + ",姓名=" + user.getName() + ",年龄=" + user.getAge());} else {System.out.println("没查询到数据!");}} catch (Exception e) {e.printStackTrace();} finally {session.close();}}}

查询不需要事务,但要注意如果主键不存在,get () 会返回 null,别直接调用属性方法,不然会空指针。
  1. Update(更新):update () 方法修改数据

java
import org.hibernate.Session;import org.hibernate.Transaction;public class UpdateDemo {public static void main(String[] args) {Session session = HibernateUtils.getSession();Transaction tx = session.beginTransaction();try {// 1.先查询要修改的对象User user = session.get(User.class, 1);if (user != null) {// 2.修改属性user.setAge(21); // 把年龄改成21// 3.调用update()更新session.update(user);System.out.println("更新成功!");} else {System.out.println("没找到要更新的数据!");}tx.commit();} catch (Exception e) {tx.rollback();e.printStackTrace();} finally {session.close();}}}

更新要先查询再修改,直接 new 对象设置 id 和属性再 update 也能行,但最好先查再改,避免覆盖已有数据。
  1. Delete(删除):delete () 方法删除数据

java
import org.hibernate.Session;import org.hibernate.Transaction;public class DeleteDemo {public static void main(String[] args) {Session session = HibernateUtils.getSession();Transaction tx = session.beginTransaction();try {// 1.先查询要删除的对象User user = session.get(User.class, 1);if (user != null) {// 2.调用delete()删除session.delete(user);System.out.println("删除成功!");} else {System.out.println("没找到要删除的数据!");}tx.commit();} catch (Exception e) {tx.rollback();e.printStackTrace();} finally {session.close();}}}

删除也要先查询对象,再调用 delete (),直接删不存在的 id 会报错,所以最好加非空判断。

四、CRUD 操作对比表:核心方法和注意事项


操作核心方法是否需要事务关键注意点
增加session.save(user)必须提交事务,对象 id 会自动生成
查询session.get(User.class, id)主键不存在返回 null,别直接调用属性
更新session.update(user)先查询再修改,避免数据覆盖
删除session.delete(user)先查询对象,再删除,加非空判断

五、避坑指南:新手最容易踩的 5 个 CRUD 错误


  1. 增删改后数据库没变化,没报错也没数据
    90% 是没开事务或没提交!Hibernate 增删改必须手动开启事务(session.beginTransaction()),操作完调用tx.commit(),不然数据只在内存里,不会写到数据库。
  2. 查询返回 null,数据库明明有数据
    检查两点:主键值是否正确(比如查 id=10,但数据库最大 id 是 5);实体类注解映射是否正确(@Table的 name 和表名是否一致,@Column的 name 和字段名是否对)。
  3. 报 “Session is closed!” 错误
    操作数据时 Session 已经被关闭了,比如在session.close()之后调用session.save()。解决:所有操作都要在session.close()之前完成,用完再关。
  4. 更新后某些字段变成 null
    直接 new 对象设置 id 和部分属性,然后调用 update (),会导致没设置的属性变成 null。解决:必须先查询对象(session.get()),再修改需要改的属性,这样其他属性会保留原值。
  5. 主键重复或无法生成,报 “Duplicate entry” 错误
    主键生成策略错了!MySQL 用GenerationType.IDENTITY(自增),如果手动设置 id 或策略不对,会导致主键重复。解决:实体类主键注解用对策略,别手动设置自增 id。

网友 “CRUD 新手” 分享:“之前更新数据总把其他字段变成 null,后来知道要先查询再修改,原来这么简单,新手一定要记住‘先查后改’!”

六、自问自答:新手做 CRUD 常问的问题


“查询操作也要开事务吗?不开会有问题吗?”
查询可以不开事务,Hibernate 查询默认会在非事务环境下执行,不会影响结果。但如果是在一个事务里做多次查询,开事务能保证数据一致性,新手简单查询直接查就行,不用纠结事务。
“为什么增删改必须开事务?JDBC 好像不用?”
Hibernate 默认把事务设置为 “手动提交”,而 JDBC 默认是 “自动提交”,所以 Hibernate 必须手动开启并提交事务,不然操作不会生效。这其实是好事,能避免误操作,比如添加一半出错了,回滚事务就能撤销操作,保护数据安全。

结尾心得


Hibernate 增删改查不难,难在细节:事务要提交、Session 别提前关、更新要先查后改、主键策略别错。兔子哥的经验是,新手别一开始就追求复杂功能,把这四个基础操作练熟,每个操作至少亲手敲三遍代码,遇到错误别慌,对照避坑指南一条条排查,大部分问题都是小细节导致的。CRUD 是数据库操作的基本功,练熟了后面学复杂查询、关联查询会更轻松,坚持多写多练,你会发现 Hibernate 用起来真的很方便!

标签: hibernate.connection.driver hibernate-configuration

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~