Hibernate 是 Java 生態系中最流行的 ORM(Object/Relational Mapping)框架,它實現了 JPA(Java Persistence API)規範,讓開發者能以面向對象的方式操作關係型數據庫,底層自動翻譯為 SQL 語句。本文將系統梳理 Hibernate 的核心配置、常用註解、HQL 查詢及完整代碼示例,助你快速上手。
在 pom.xml 中引入 Hibernate 核心庫、MySQL 驅動及 C3P0 連接池:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.10.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<!-- C3P0 連接池依賴 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
hibernate.cfg.xml通常置於 src 目錄下,配置數據源、連接池、方言及實體映射:
<?xml version='1.0' encoding='utf-8'?>
<hibernate-configuration>
<session-factory>
<!-- 數據庫連接基本信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/your_db</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<property name="connection.characterEncoding">utf-8</property>
<!-- C3P0 連接池優化 -->
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- 開發階段顯示 SQL,生產建議關閉 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 實體類映射 -->
<mapping class="com.example.entity.Student"/>
</session-factory>
</hibernate-configuration>
| 註解 | 作用 | 關鍵屬性 |
|---|---|---|
@Entity | 標記該類為持久化實體 | — |
@Table(name="studentTable") | 指定對應的數據庫表名 | name |
@Id | 標識主鍵字段 | — |
@Column(name="time_stamp") | 映射非同名列 | name |
@Temporal(TemporalType.TIMESTAMP) | 映射日期時間類型 | value |
@Transient | 忽略該字段,不持久化 | — |
HQL(Hibernate Query Language)面向對象,語法類似 SQL 但操作實體與屬性:
Session.createQuery("from Student where isGirl=true") 建立查詢Query.list() 返回結果列表package com.example.entity;
import javax.persistence.*;
import java.util.Date;
import java.util.List;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
@Entity
@Table(name = "studentTable")
public class Student {
@Id
private int id;
private String name;
private boolean isGirl;
@Column(name = "time_stamp")
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
// Getter/Setter 省略...
public static void main(String[] args) {
// 1. 加載配置並構建 SessionFactory
Configuration conf = new Configuration().configure();
ServiceRegistry registry = new ServiceRegistryBuilder()
.applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory sf = conf.buildSessionFactory(registry);
// 2. 開啟會話與事務
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
// 3. 新增數據
Student stu = new Student();
stu.setName("qiqi");
session.save(stu);
// 4. 查詢所有女同學
@SuppressWarnings("unchecked")
List list = session.createQuery("from Student where isGirl=true").list();
System.out.println(list);
// 5. 提交事務並釋放資源
tx.commit();
session.close();
sf.close();
}
}
hibernate.show_sql,改用日誌框架記錄 SQL。@Column 明確映射,減少維護歧義。