Hibernate 菜鸟入门教程
第一部分:Hibernate 是什么?为什么需要它?
想象一下,你正在开发一个 Java 程序,需要把数据保存到数据库里,没有 Hibernate 的时候,你可能会这样做:

- 获取数据库连接:
Connection conn = DriverManager.getConnection(...); - 创建 SQL 语句:
String sql = "INSERT INTO user (name, age) VALUES ('张三', 25)"; - 创建 Statement 对象:
Statement stmt = conn.createStatement(); - 执行 SQL:
stmt.executeUpdate(sql); - 关闭资源:
stmt.close(); conn.close();
这个过程很繁琐,而且容易出错,更糟糕的是,如果你的 Java 对象(比如一个 User 类)和数据库的表结构(user 表)发生了一点变化(User 类增加了一个 email 属性,user 表也增加了一个 email 列),你就需要手动去修改所有相关的 SQL 语句。
Hibernate 就像一个“翻译官”,它解决了这个问题。
- 你只需要关心 Java 对象:你创建一个
User对象,设置好它的属性,然后告诉 Hibernate:“帮我保存这个对象”。 - Hibernate 会自动帮你处理所有数据库操作:它会自动生成相应的 SQL 语句,执行它,并处理连接等底层细节。
Hibernate 的核心思想:对象关系映射
ORM 是 Hibernate 的基石,就是把 Java 对象和关系型数据库的表建立一种映射关系。

| 概念 | 例子 | 说明 |
|---|---|---|
| 类 | public class User { ... } |
对应数据库中的一张表 |
| 对象 | User user = new User(); |
对应表中的一行记录 |
| 属性 | private String name; |
对应表中的一个列 |
| 主键 | @Id private Long id; |
对应表中的主键列 |
通过 ORM,你就可以用面向对象的方式,而不是面向 SQL 的方式来操作数据库,这让开发变得更加简单、直观和高效。
第二部分:Hibernate 开发环境准备
在开始写代码之前,你需要准备以下工具:
- JDK (Java Development Kit):Java 开发工具包,建议使用 JDK 8 或更高版本。
- IDE (Integrated Development Environment):集成开发环境,推荐使用 IntelliJ IDEA 或 Eclipse。
- 数据库:一个关系型数据库,MySQL 或 H2,我们这里以 MySQL 为例。
- 构建工具:Maven 或 Gradle,我们使用 Maven,它可以非常方便地管理项目依赖。
- Hibernate 库:Hibernate 的核心 jar 包。
好消息是,如果你使用 Maven,你几乎不需要手动下载任何 jar 包,Maven 会帮你自动管理。
第三部分:第一个 Hibernate 程序 - “Hello, World!”
我们将创建一个简单的程序,实现向数据库中插入一条用户记录。
步骤 1:创建 Maven 项目
在你的 IDE 中,创建一个新的 Maven 项目,选择 maven-archetype-quickstart 模板即可。
步骤 2:添加 Hibernate 和 MySQL 依赖
打开 pom.xml 文件,添加以下依赖:
<dependencies>
<!-- JPA API (Hibernate 的实现标准) -->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<!-- Hibernate 核心库 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.30.Final</version> <!-- 使用一个稳定的版本 -->
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
保存 pom.xml,Maven 会自动下载这些依赖。
步骤 3:创建数据库和表
在你的 MySQL 数据库中,执行以下 SQL 语句来创建一个 hibernate_demo 数据库和一个 user 表。
-- 创建数据库 CREATE DATABASE hibernate_demo; -- 使用数据库 USE hibernate_demo; -- 创建 user 表 CREATE TABLE `user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `age` INT, PRIMARY KEY (`id`) );
步骤 4:创建实体类
创建一个 Java 类,这个类将和 user 表对应,我们把它放在 src/main/java 的 com.example.entity 包下。
User.java
package com.example.entity;
import javax.persistence.*;
@Entity // 告诉 Hibernate 这是一个实体类,会映射到一张表
@Table(name = "user") // 指定映射到数据库中的 "user" 表
public class User {
@Id // 指定这个属性是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键的生成策略,IDENTITY 表示自增
private Long id;
@Column(name = "name", nullable = false) // 指定映射到 "name" 列,且不能为空
private String name;
@Column(name = "age") // 指定映射到 "age" 列
private Integer age;
// 必须提供一个无参构造器,Hibernate 反射时会用到
public User() {
}
// getter 和 setter 方法
public Long getId() {
return id;
}
public void setId(Long 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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
注解解释:
@Entity:声明这是一个 JPA 实体。@Table(name = "user"):指定此实体对应的数据库表名,如果不写,默认类名就是表名。@Id:声明这个属性是主键。@GeneratedValue:指定主键的生成策略。IDENTITY是最常用的,表示数据库自增。@Column:指定属性与数据库列的映射关系,可以指定列名、是否可为空等。
步骤 5:创建 Hibernate 配置文件
在 src/main/resources 目录下,创建一个名为 hibernate.cfg.xml 的文件,这是 Hibernate 的核心配置文件,用于连接数据库和配置 Hibernate。
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 1. 数据库连接信息 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_demo?useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">your_password</property> <!-- 替换成你的数据库密码 -->
<!-- 2. Hibernate 核心配置 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3. 注册实体类 -->
<mapping class="com.example.entity.User"/>
</session-factory>
</hibernate-configuration>
属性解释:
hibernate.connection.*:数据库连接的四大要素。hibernate.dialect:指定数据库方言,Hibernate 会根据方言生成针对特定数据库优化的 SQL,MySQL8 用MySQL8Dialect。hibernate.show_sql:在控制台打印生成的 SQL 语句,方便调试。hibernate.format_sql:格式化打印的 SQL 语句,使其更易读。hibernate.hbm2ddl.auto:自动管理表结构的策略。update:如果实体类有变化,会自动更新数据库表结构(非常方便!但生产环境要慎用)。create:每次启动都会先删除表,再重新创建。none:不进行任何操作。
<mapping class="..."/>:告诉 Hibernate 去扫描哪个实体类。
步骤 6:编写测试代码
我们创建一个主类来测试 Hibernate 的功能。
Main.java
package com.example;
import com.example.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Main {
public static void main(String[] args) {
// 1. 加载 Hibernate 配置文件,创建 SessionFactory
// Configuration 类用于读取 hibernate.cfg.xml 文件
// configure() 默认会从 classpath 下加载 hibernate.cfg.xml
// addAnnotatedClass() 告诉 Hibernate 去扫描哪个实体类(如果配置文件里没写的话,可以这样写)
SessionFactory sessionFactory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(User.class)
.buildSessionFactory();
// 2. 从 SessionFactory 中获取一个 Session
// Session 类相当于 JDBC 中的 Connection,是操作数据库的核心接口
Session session = sessionFactory.openSession();
// 3. 开启一个事务
// Hibernate 的所有写操作(增删改)都必须在事务中执行
Transaction transaction = session.beginTransaction();
try {
// 4. 创建 User 对象
User user = new User();
user.setName("李四");
user.setAge(30);
// 5. 保存对象
// session.save() 会将对象的状态变为 "持久化" 状态,并在此处生成 INSERT 语句
session.save(user);
// 6. 提交事务
transaction.commit();
System.out.println("用户保存成功!用户的 ID 是: " + user.getId());
} catch (Exception e) {
// 如果发生异常,回滚事务
transaction.rollback();
e.printStackTrace();
} finally {
// 7. 关闭资源
session.close();
sessionFactory.close();
}
}
}
步骤 7:运行并检查结果
运行 Main 类的 main 方法。
- 控制台输出:你会看到 Hibernate 打印出的格式化的 SQL 语句:
Hibernate: insert into user (name, age) values (?, ?) - 数据库检查:登录你的 MySQL,查询
user表,你会发现多了一条记录:SELECT * FROM user;
+----+------+------+ | id | name | age | +----+------+------+ | 1 | 李四 | 30 | +----+------+------+
恭喜你!你已经成功完成了你的第一个 Hibernate 程序!
第四部分:Hibernate 核心概念
为了更好地理解 Hibernate,你需要了解以下几个核心概念:
Configuration:负责加载和读取 Hibernate 的配置文件(hibernate.cfg.xml)。SessionFactory:线程安全的重量级对象,它是Connection的工厂,负责创建和管理Session,一个数据库对应一个SessionFactory,通常一个项目中只创建一个SessionFactory。Session:轻量级非线程安全的对象,它是 Hibernate 操作数据库的核心接口,相当于 JDBC 中的Connection,它用于执行 CRUD 操作、管理事务等,每次需要操作数据库时,都需要从SessionFactory获取一个新的Session。Transaction:事务对象,所有的写操作都必须在事务中完成,以确保数据的一致性。- 持久化对象:被
Session管理,并且和数据库中某条记录关联的对象,对它的修改会在事务提交时同步到数据库。
第五部分:下一步去哪里?
你已经入门了,接下来可以学习 Hibernate 的更多强大功能:
- 对象状态:深入了解 Hibernate 中对象的瞬时态、持久态和游离态。
- CRUD 操作:学习
session.save(),session.get(),session.update(),session.delete()等方法。 - HQL (Hibernate Query Language):Hibernate 提供的面向对象的查询语言,比 SQL 更强大、更安全。
- 关联关系:学习如何映射一对一、一对多、多对多关系(
User和Address的关系)。 - 缓存机制:了解 Hibernate 的一级缓存和二级缓存,以提升性能。
总结一下,Hibernate 的学习曲线并不陡峭,掌握了“配置映射文件 -> 创建实体类 -> 获取 Session -> 开启事务 -> 操作对象 -> 提交事务”这个基本流程后,你就可以用它来解决大部分数据库操作问题了。
希望这份菜鸟教程能帮助你顺利开启 Hibernate 之旅!祝你学习愉快!
