通過一個完整的「保存用戶」實例,對比 JDBC 與 Hibernate,直觀體會 Hibernate 的「完全面向對象」優勢。
核心包(Hibernate 3.x 時代):
現代項目建議用 Maven/Gradle 管理依賴,版本以 Hibernate 5.x/6.x 為主。
public class User {
private String id, name, password;
private Date createTime, expireTime;
// getter/setter
}

<hibernate-mapping>
<class name="com.entity.User">
<id name="id"><generator class="uuid"/></id>
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="com/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
public class Client {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = null;
try {
session = factory.openSession();
session.beginTransaction();
User user = new User();
user.setName("NAME1");
user.setPassword("PWD1");
user.setCreateTime(new Date());
user.setExpireTime(new Date());
session.save(user); // 核心:無需寫 SQL
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
if (session != null && session.isOpen()) session.close();
}
}
}

| 維度 | JDBC | Hibernate |
|---|---|---|
| 代碼風格 | 手寫 SQL,面向表結構 | 操作對象,面向對象模型 |
| SQL 維護 | 分散在代碼中,難維護 | 框架自動生成,集中映射文件 |
| 表結構變更 | 需同步修改所有 SQL | 只改映射文件,代碼無感 |
| 對象關係 | 手動 ResultSet → Object | 自動透明轉換 |
| 事務管理 | 手動 Connection 控制 | Session 封裝,聲明式事務 |
Hibernate 核心接口 Session 的 save() 一行代碼替代了 JDBC 的十幾行,實現了真正的面向對象持久化。下一章將講解配置文件與映射細節。