杰瑞科技汇

Hibernate菜鸟入门,核心概念怎么学?

Hibernate 菜鸟入门教程

第一部分:Hibernate 是什么?为什么需要它?

想象一下,你正在开发一个 Java 程序,需要把数据保存到数据库里,没有 Hibernate 的时候,你可能会这样做:

Hibernate菜鸟入门,核心概念怎么学?-图1
(图片来源网络,侵删)
  1. 获取数据库连接Connection conn = DriverManager.getConnection(...);
  2. 创建 SQL 语句String sql = "INSERT INTO user (name, age) VALUES ('张三', 25)";
  3. 创建 Statement 对象Statement stmt = conn.createStatement();
  4. 执行 SQLstmt.executeUpdate(sql);
  5. 关闭资源stmt.close(); conn.close();

这个过程很繁琐,而且容易出错,更糟糕的是,如果你的 Java 对象(比如一个 User 类)和数据库的表结构(user 表)发生了一点变化(User 类增加了一个 email 属性,user 表也增加了一个 email 列),你就需要手动去修改所有相关的 SQL 语句。

Hibernate 就像一个“翻译官”,它解决了这个问题。

  • 你只需要关心 Java 对象:你创建一个 User 对象,设置好它的属性,然后告诉 Hibernate:“帮我保存这个对象”。
  • Hibernate 会自动帮你处理所有数据库操作:它会自动生成相应的 SQL 语句,执行它,并处理连接等底层细节。

Hibernate 的核心思想:对象关系映射

ORM 是 Hibernate 的基石,就是把 Java 对象和关系型数据库的表建立一种映射关系

Hibernate菜鸟入门,核心概念怎么学?-图2
(图片来源网络,侵删)
概念 例子 说明
public class User { ... } 对应数据库中的一张表
对象 User user = new User(); 对应表中的一行记录
属性 private String name; 对应表中的一个列
主键 @Id private Long id; 对应表中的主键列

通过 ORM,你就可以用面向对象的方式,而不是面向 SQL 的方式来操作数据库,这让开发变得更加简单、直观和高效。


第二部分:Hibernate 开发环境准备

在开始写代码之前,你需要准备以下工具:

  1. JDK (Java Development Kit):Java 开发工具包,建议使用 JDK 8 或更高版本。
  2. IDE (Integrated Development Environment):集成开发环境,推荐使用 IntelliJ IDEAEclipse
  3. 数据库:一个关系型数据库,MySQL 或 H2,我们这里以 MySQL 为例。
  4. 构建工具Maven 或 Gradle,我们使用 Maven,它可以非常方便地管理项目依赖。
  5. 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/javacom.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&amp;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,你需要了解以下几个核心概念:

  1. Configuration:负责加载和读取 Hibernate 的配置文件(hibernate.cfg.xml)。
  2. SessionFactory:线程安全的重量级对象,它是 Connection 的工厂,负责创建和管理 Session,一个数据库对应一个 SessionFactory,通常一个项目中只创建一个 SessionFactory
  3. Session:轻量级非线程安全的对象,它是 Hibernate 操作数据库的核心接口,相当于 JDBC 中的 Connection,它用于执行 CRUD 操作、管理事务等,每次需要操作数据库时,都需要从 SessionFactory 获取一个新的 Session
  4. Transaction:事务对象,所有的写操作都必须在事务中完成,以确保数据的一致性。
  5. 持久化对象:被 Session 管理,并且和数据库中某条记录关联的对象,对它的修改会在事务提交时同步到数据库。

第五部分:下一步去哪里?

你已经入门了,接下来可以学习 Hibernate 的更多强大功能:

  • 对象状态:深入了解 Hibernate 中对象的瞬时态持久态游离态
  • CRUD 操作:学习 session.save(), session.get(), session.update(), session.delete() 等方法。
  • HQL (Hibernate Query Language):Hibernate 提供的面向对象的查询语言,比 SQL 更强大、更安全。
  • 关联关系:学习如何映射一对一、一对多、多对多关系(UserAddress 的关系)。
  • 缓存机制:了解 Hibernate 的一级缓存和二级缓存,以提升性能。

总结一下,Hibernate 的学习曲线并不陡峭,掌握了“配置映射文件 -> 创建实体类 -> 获取 Session -> 开启事务 -> 操作对象 -> 提交事务”这个基本流程后,你就可以用它来解决大部分数据库操作问题了。

希望这份菜鸟教程能帮助你顺利开启 Hibernate 之旅!祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇