零基础学 Hibernate 的朋友是不是都有这样的困扰?看着教程里的 “ORM 框架”“映射文件” 一头雾水,不知道这东西到底能干嘛;下载了 Hibernate 包,却卡在核心配置文件上,数据库连接总报错;写好了实体类和映射文件,增删改查代码要么没反应,要么报 “Session is closed” 的错误。别着急,兔子哥第一次学 Hibernate 时,光是搞懂 hibernate.cfg.xml 里的方言配置就查了半天,第一次做查询操作,因为忘了开启事务,查了半天啥数据都没有。今天就带零基础的你从核心配置讲到映射文件,再到增删改查实战,一步步入门 Hibernate,跟着学,你也能轻松搞定数据库操作!
一、Hibernate 是什么?为什么要学它?
很多新手一开始就闷头学配置,却不知道 Hibernate 到底是啥,先搞懂这两个基础问题,学起来更有方向。
- 什么是 Hibernate?简单说就是 “数据库操作的偷懒工具”
Hibernate 是一个 ORM(对象关系映射)框架,能帮我们把 Java 的实体类和数据库表对应起来,不用写复杂的 SQL 语句,直接用 Java 代码操作对象,就能实现数据库的增删改查。比如你想保存一个 User 对象,不用写INSERT INTO user(...) VALUES(...),直接调用session.save(user)就行,Hibernate 会自动帮你生成 SQL。 - 为什么要学 Hibernate?这 3 个好处新手必须知道
- 不用手写 SQL:省去写复杂 SQL 的麻烦,尤其对 SQL 不熟练的新手很友好。
- 跨数据库方便:换数据库时(比如从 MySQL 换到 Oracle),改改配置文件就行,不用改 Java 代码。
- 简化开发:帮我们处理数据库连接、事务管理这些重复工作, focus 在业务逻辑上。
有朋友问:“直接用 JDBC 不行吗?” 当然行,但 JDBC 需要手动写 SQL、处理结果集,代码重复多,Hibernate 相当于在 JDBC 上盖了一层 “懒人工具”,让数据库操作更简单。
二、核心配置:hibernate.cfg.xml 怎么写?3 步搞定基础配置
学 Hibernate 先搞定核心配置文件,这是框架的 “总开关”,数据库连接、方言这些关键信息都在这配置。
- 配置文件放哪里?必须在 src 目录下
新建一个 Java 项目,在 src 目录下新建 “hibernate.cfg.xml” 文件,Hibernate 启动时会自动在这找配置,放错位置会报 “找不到配置文件” 的错误。 - 核心配置项:这几个必须写对,不然连不上数据库
以 MySQL 为例,基础配置代码如下,关键项已加粗:
xml
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><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><property name="hibernate.format_sql">trueproperty><mapping resource="com/hibernate/demo/User.hbm.xml"/>session-factory>hibernate-configuration>- 避坑指南:配置时最容易错的 3 个地方
- 驱动类名:MySQL 8 以上用
com.mysql.cj.jdbc.Driver,旧版本用com.mysql.jdbc.Driver,写错会报 “ClassNotFoundException”。 - 连接地址:别忘了加
serverTimezone=UTC,不然会报时区错误;数据库名(hibernate_db)要先在 MySQL 里建好。 - 方言错误:MySQL 8 对应
MySQL8Dialect,MySQL 5 对应MySQL57Dialect,方言不对会报 SQL 语法错误。
三、映射文件:实体类与数据库表怎么对应?写好 *.hbm.xml
映射文件是 Hibernate 的 “翻译官”,告诉框架实体类的属性对应数据库表的哪个字段,这步错了,增删改查全白搭。
- 先建数据库表和实体类,再写映射文件
- 建表 SQL(MySQL):
sql
CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;- 实体类 User.java:
java
public class User {private Integer id;private String name;private Integer age;// 必须有getter和setter方法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; }}- 映射文件怎么写?关键是属性对应
在实体类同包下新建 “User.hbm.xml”,代码如下:
xml
DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.hibernate.demo"><class name="User" table="user"><id name="id" column="id"><generator class="native">generator>id><property name="name" column="name">property><property name="age" column="age">property>class>hibernate-mapping>class的name是实体类名,table是数据库表名。id标签对应主键,generator class="native"表示用数据库自增策略。property的name是实体类属性名,column是表字段名,两者相同可省略column。
- 映射文件要在核心配置里注册
别忘了在 hibernate.cfg.xml 里加映射路径,就是前面配置里的,路径错了会报 “找不到映射文件”。
四、增删改查实战:从获取 Session 到操作数据,4 步搞定
配置和映射都弄好后,就能做 CRUD 操作了,核心是获取 Session 对象,用它来操作数据库。
- 工具类:获取 SessionFactory 和 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();}}- 添加操作:save () 方法保存对象到数据库
java
import org.hibernate.Session;import org.hibernate.Transaction;public class AddDemo {public static void main(String[] args) {// 获取SessionSession session = HibernateUtils.getSession();// 开启事务Transaction tx = session.beginTransaction();// 创建对象并赋值User user = new User();user.setName("张三");user.setAge(20);// 保存对象session.save(user);// 提交事务tx.commit();// 关闭资源session.close();}}运行后,数据库 user 表会新增一条记录,控制台会显示 Hibernate 生成的 INSERT 语句。
- 查询操作:get () 方法根据主键查对象
java
Session session = HibernateUtils.getSession();// 根据主键1查询User user = session.get(User.class, 1);System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge());session.close();- 更新和删除:update () 修改,delete () 删除
java
// 更新操作Session session = HibernateUtils.getSession();Transaction tx = session.beginTransaction();User user = session.get(User.class, 1);user.setAge(21); // 修改年龄session.update(user);tx.commit();session.close();// 删除操作Session session = HibernateUtils.getSession();Transaction tx = session.beginTransaction();User user = session.get(User.class, 1);session.delete(user);tx.commit();session.close();五、避坑指南:增删改查最容易踩的 4 个坑
- 坑 1:报 “Session is closed!” 错误
原因:操作数据前 Session 已经被关闭了,比如查询时先调用了session.close(),再用 session 操作。
解决:确保所有数据库操作都在session.close()之前完成,用完再关。 - 坑 2:增删改后数据库没变化,没报错也没数据
90% 是没开启事务!Hibernate 默认不会自动提交事务,增删改必须手动开启事务(session.beginTransaction()),操作完提交事务(tx.commit()),不然数据不会写入数据库。 - 坑 3:查询返回 null,明明数据库有数据
检查两点:主键是否正确(比如查 id=1,但数据库里 id=1 的记录不存在);映射文件的属性对应是否正确(比如实体类属性名和表字段名不一致)。 - 坑 4:报 “Table 'hibernate_db.user' doesn't exist”
数据库表没建好!Hibernate 不会自动建表(除非配置了hbm2ddl.auto),必须先手动在数据库里建好表,表名和映射文件的table属性一致。
网友 “Java 新手” 分享:“之前增删改一直没效果,查了半天发现没开事务,加上事务提交后立马有数据了,这个细节新手一定要注意!”
结尾心得
Hibernate 入门难在开头的配置和映射,但只要把核心配置文件的数据库连接信息写对,映射文件的属性对应好,增删改查其实很简单。兔子哥的经验是,新手别一开始就追求复杂功能,先把基础的 CRUD 操作练熟,用工具类封装重复代码,减少出错概率。遇到错误别慌,先看控制台的报错信息,大部分问题都能从错误提示里找到线索(比如配置错、表不存在、事务没提交)。多动手写案例,从简单的 User 表操作开始,慢慢理解 ORM 的思想,你会发现 Hibernate 确实能帮我们省很多事,加油,零基础也能学好 Hibernate!
标签: hibernate.cfg.xml session.save
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~