一、基礎使用
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的 orm 框架,hibernate 可以自動生成SQL語句,自動執行。
1. 持久化類創建
設計原則:
- 必需爲公有類 public,且含公有不帶參構造方法
- 類內部屬性私有,提供 setter/getter 封裝
2. 創建對象關係映射文件-Clazz.hbm.xml
- < hibernate-mapping >
屬性名稱 | 描述 |
---|---|
schema | 模式名稱 |
catalog | 目錄名稱 |
default-cascade | 級聯風格 |
default-access | 訪問策略 |
default-lazy | 加載策略 |
package | 默認包名 |
- < class >
屬性名稱 | 描述 |
---|---|
name | 映射類名 |
table | 映射表名 |
batch-size | 抓取策略 |
where | 抓取條件 |
entity-name | 多表映射 |
- < id >
屬性名稱 | 描述 |
---|---|
name | 映射屬性名 |
type | 映射屬性類型 |
column | 映射表中對應的字段名稱 |
length | 指定長度 |
< generator> | 主鍵生成策略,如下常用 assigned:手工賦值 native:自動增長,覆蓋手工賦值 |
- < component >
屬性名稱 | 描述 |
---|---|
name | 映射組件名 |
column | 映射表中對應的字段名稱 |
- < property >
屬性名稱 | 描述 |
---|---|
name | 映射屬性名 |
column | 映射表中對應的字段名稱 |
3. 配置文件(常用配置)-hibernate.cfg.xml
屬性名字 | 描述 | 使用 |
---|---|---|
show_sql | 控制檯 log 輸出 | true/false |
format_sql | 控制檯 log 排版 | true/false |
hbm2ddl.auto | 數據處理與表結構生成 | create: 每次刪除原有表,再創建新的表 update:在原有表上更新數據 create-drop:創建後刪除 validate:表結構驗證,一致的條件下創建 |
default_schema | 默認數據庫,創建前綴表名稱 | [schema_name] |
dialect | 數據庫方言 |
<session-factory>
<!-- 數據庫用戶名 -->
<property name="connection.username">root</property>
<!-- 數據庫用戶名 -->
<property name="connection.password">666666</property>
<!-- 數據庫驅動類 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 數據庫連接URL -->
<property name="connection.url">jdbc:mysql://localhost:3306/db_examsystem</property>
<!-- 數據庫方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<!-- 關聯對象關係映射文件 -->
<mapping resource="Clazz.hbm.xml"/>
</session-factory>
4. 事務處理
Hibernate 對數據的操作均封裝與事務當中按,且默認非自動提交(無啓動事務提交則無法將數據存儲值數據庫當中)
4.1 Session
- 獲取方式(默認)-openSession
<!-- 需手動關閉,獲取新的 session 對象 -->
<property name="hibernate.current_session_context_class">jta</property>
- 獲取方式-getCurrentSession()
<!-- 自動關閉,獲取原有 session 對象 -->
<property name="hibernate.current_session_context_class">thread</property>
- 常用操作
- save:存儲記錄
- get:獲取記錄(調用時獲取,記錄不存在返回 null)
- load:獲取記錄(使用時獲取,記錄不存在拋異常)
- update:更新記錄
- delete:刪除
4.2 Transaction
mSession.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
connection.setAutoCommit(true);// 實現自動提交
};
});
mSession.save(student);
mSession.flush();
或開啓事務實現數據提交存儲
mTransaction = mSession.beginTransaction();// 開啓
// ...
mTransaction.commit();// 提交
二、表映射
1. 一對多 one2many
- 模擬當個課室中多個學生的場景,gId 爲關聯外鍵
<hibernate-mapping>
<class name="[packname].Grade" table="grade">
<id name="gId" type="int">
<column name="gId" />
<generator class="native" />
</id>
<set name="students" table="student" inverse="false" cascade="save-update" lazy="true">
<key>
<column name="gId" />
</key>
<one-to-many class="[packname].Student" />
</set>
</class>
</hibernate-mapping>
- < set >常用屬性
屬性名稱 | 描述 |
---|---|
name | 映射類屬性的名稱 |
table | 關聯類的目標數據庫表 |
lazy | 指定關聯對象是否使用延遲加載 |
inverse | 標識雙向關聯中被動的一方false/負責維護的一方true |
cascade | all:對所有炒作進行級聯炒作 save-update:執行保存和更新操作是進行級聯操作 delete:執行刪除操作時進行級聯操作 none:對所有操作不進行級聯操作 |
2. 多對一 many2one
- 模擬多個學生在同一教室的場景,gId 爲關聯外鍵
<hibernate-mapping>
<class name="[packname].Student" table="student">
<id name="sId" type="int">
<column name="sId" />
<generator class="native" />
</id>
<many-to-one name="grade" class="[packname].Grade" column="gId" cascade="all"/>
</hibernate-mapping>