Hibernate入门配置和基本用法

Hibernate 是 ORM 框架,把 POJO 类和数据库表映射起来自动生成 SQL。需要 hibernate.cfg.xml 配置数据库连接和方言,User.hbm.xml 配置类和表的映射关系(id 主键、property 普通字段)。主键生成策略有 identity自增、uuid、assigned手动等。代码流程是 Configuration 读配置、SessionFactory 创建会话、Session 执行 CRUD。

Hibernate 是个 ORM 框架,干的事就一句话:把 Java 对象和数据库表对应起来,让你操作对象就等于操作数据库,SQL 它帮你生成。

现在新项目基本上 MyBatis、JPA 当道,Hibernate 的 XML 配置玩法已经不常见了。但理解这套最早期的配置方式,对搞懂 ORM 到底在替我们做什么,挺有帮助。

这篇用最原始的 XML 配置(不是 SpringBoot 那种一键装配)走一遍 Hibernate 入门,重点是看清它需要哪些关键配置。

Hibernate 是干嘛的

它对 JDBC 做了一层很轻的对象化封装。

你平时写 JDBC 要自己拼 SQL、自己把 ResultSet 一列列读出来塞进对象,繁琐又容易错。

Hibernate 把这层包了:你把 POJO 类和数据库表的映射关系告诉它,它就能自动生成 SQL,自动把查出来的数据填进对象。

好处是关系清晰、代码简洁,操作数据库像操作普通对象一样自然。

国际惯例,先导包(这步略过)。本文全程用最早期的 XML 配置形式,就为了把配置项一个个看明白。

主配置文件

Hibernate 要跑起来,第一个要有的就是主配置文件 hibernate.cfg.xml,里面写数据库连接信息。

这里以 Oracle 为例:

<?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 按哪种数据库的语法生成 SQL -->
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!-- 连接地址 -->
        <property name="connection.url">jdbc:oracle:thin:@10.10.10.10:1521:Sobest</property>
        <!-- 用户名 -->
        <property name="connection.username">mebugs</property>
        <!-- 密码(真实项目别明文写,走加密或外部注入) -->
        <property name="connection.password">mebugs</property>
        <!-- JDBC 驱动类 -->
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

        <!-- 以下是可选项,但很常用 -->
        <!-- 自动提交:不开的话有时候 insert 完数据库里查不到 -->
        <property name="connection.autocommit">true</property>
        <!-- session 上下文策略:JDBC 单应用用 thread,Web 容器里用 jta -->
        <property name="current_session_context_class">thread</property>
        <!-- 格式化打印 SQL,调试时好看 -->
        <property name="format_sql">true</property>
        <!-- 把生成的 SQL 打到控制台,学习阶段强烈建议开 -->
        <property name="show_sql">true</property>

        <!-- 挂上映射文件,可以挂多个 -->
        <mapping resource="com/mebugs/daoBean/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
​

这里面最该记住的是 dialect(方言):换数据库主要就是换它和驱动,Hibernate 靠方言决定生成什么风格的 SQL,这也是它号称跨数据库的底气。

另外学习阶段一定把 show_sql 打开,能看见它到底帮你生成了什么 SQL,ORM 就不再是黑盒了。

实体类

接着是一个普通的 POJO,用来跟表映射:

public class User {
    private int id;
    // 简单起见只放一个业务属性
    private String username;

    public int getId() { return id; }
    public void setId(int id) { this.id = id; }

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
}
​

就是个普通类,带 getter/setter,没任何注解——因为这版映射关系全写在 XML 里。

映射文件

映射文件 User.hbm.xml,告诉 Hibernate 这个类的哪个属性对应表的哪一列。按惯例放在实体类同目录:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- package 写上,下面类名就不用写全限定名了 -->
<hibernate-mapping package="com.mebugs.daoBean">
    <!-- class 的 name 是类名,table 是对应的表名 -->
    <class name="User" table="user">
        <!-- id 标签声明主键:name 是属性名,column 是表的列名 -->
        <id name="id" type="int" column="id">
            <!-- 主键生成策略,下面细说 -->
            <generator class="identity"></generator>
        </id>
        <!-- 普通字段映射 -->
        <!-- type 建议直接写 java.lang.String,效率更高 -->
        <!-- 因为 Hibernate 自己的类型最终也要转成 Java 类型再去匹配列类型 -->
        <property name="username" type="java.lang.String" column="name"></property>
    </class>
</hibernate-mapping>
​

有个小细节:property 的 type 建议直接写成 java.lang.String 这种 Java 全类型,比写 Hibernate 的简写类型(如 string)略快,因为省了一道类型转换的查找。

主键生成策略

<generator> 这块值得单独说,它决定主键怎么生成。常见的几种:

  • identity:交给数据库自增(MySQL、SQL Server 这类支持自增的),主键必须是数值类型。最常用。
  • sequence:依赖数据库的序列(Oracle 常用)。
  • increment:Hibernate 自己每次加 1。多线程下有并发风险,容易撞主键,别在多应用环境用。
  • native:让 Hibernate 看数据库类型自动在 identity / sequence / hilo 里选一个。适合跨数据库。
  • uuid:生成 128 位的唯一字符串做主键,跨库适应性最好,插入性能也好,但主键得是 String 类型。
  • assigned:主键由你代码自己指定,Hibernate 不管。类型不限。
  • hilo / foreign:前者用高低位算法另开表存状态,后者用在一对一关系里借别人的主键。用得较少。

挑的时候就看数据库:MySQL 用 identity,Oracle 用 sequence,想跨库用 native 或 uuid。

跑一遍 CRUD

配置和映射都齐了,写段代码把它跑起来,感受一下操作对象即操作数据库:

// 1. 读配置,构建配置对象
Configuration conf = new Configuration();
conf.configure("hibernate.cfg.xml");

// 2. 建会话工厂(重量级对象,整个应用建一个就够,别反复 new)
SessionFactory sf = conf.buildSessionFactory();

// 3. 开一个 session(轻量,用完即关)
Session session = sf.openSession();

// 4. 开启事务
session.beginTransaction();

// 5. 存一个对象,等价于一条 insert
User user = new User();
user.setUsername("mebugs");
// 持久化相关方法:save/update/saveOrUpdate/delete 分别对应增改删
session.save(user);

// 6. 提交事务(rollback 回滚,wasCommitted 检查是否已提交)
session.getTransaction().commit();

// 7. 收尾,关 session 和工厂
session.close();
sf.close();
​

整段看下来,我们从头到尾没碰一行 SQL,session.save(user) 就把插入干完了——这就是 ORM 要给你的体验。

实际项目里,第 1~2 步(读配置建工厂)会抽成一个工具类,全局复用一个 SessionFactory,别每次操作都重建,那玩意儿贵。

小结

Hibernate 入门就三样东西:主配置 hibernate.cfg.xml 管连接和方言,映射文件 .hbm.xml 管类和表的对应,再加 Configuration → SessionFactory → Session 这条调用链执行增删改查。

主键生成策略按数据库挑,MySQL 用 identity,Oracle 用 sequence,跨库用 native 或 uuid。

学习阶段务必开 show_sql,盯着它生成的 SQL 看,ORM 的"魔法"就都现原形了。

这版是最原始的 XML 配置,理解它之后,再去看注解版、SpringBoot 装配版,会轻松很多。

更多推荐

章节目录