版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106151264
通過上篇 HelloWorld 博客我們已經大致瞭解了 Hibernate 這款全自動化框架的執行流程。
本篇博客主要介紹 Hibernate 中的兩類配置文件:核心配置文件 和 映射文件(這兩類配置文件的文件名一般要遵循相應的規範)。
一、核心配置文件
Hibernate 核心配置文件 的模板在
project\etc
目錄中。
1、Hibernate 的核心配置方式
1)方式一:屬性配置文件(hibernate.properties,不推薦使用)
hibernate.connection.driver_class=com.mysql.jdbc.Driver
...
hibernate.show_sql=true
注意: 屬性配置文件的文件名是:hibernate.properties
。這種方式一般不使用,因爲它不能引入映射文件,還得手動編寫代碼來加載映射文件,過程過於繁瑣。
2)方式二:XML配置文件(hibernate.cfg.xml,推薦使用)
XML 配置文件的文件名是:
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>
<!-- 連接數據庫的基本參數 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///sys</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置Hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可選配置================ -->
<!-- 打印SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- 自動創建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置C3P0連接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在連接池中可用的數據庫連接的最少數目 -->
<property name="c3p0.min_size">5</property>
<!--在連接池中所有數據庫連接的最大數目 -->
<property name="c3p0.max_size">20</property>
<!--設定數據庫連接的過期時間,以秒爲單位,
如果連接池中的某個數據庫連接處於空閒狀態的時間超過了timeout時間,就會從連接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒檢查所有連接池中的空閒連接 以秒爲單位-->
<property name="c3p0.idle_test_period">3000</property>
<!-- 設置事務隔離級別 -->
<property name="hibernate.connection.isolation">4</property>
<!-- 配置當前線程綁定的 Session -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 引入映射 -->
<mapping resource="com/domain/Customer.hbm.xml"/>
<mapping resource="com/domain/LinkMan.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2、核心配置
1)必要配置
A. 連接數據庫的基本參數
- 驅動類(
hibernate.connection.driver_class
) - URL(
hibernate.connection.url
) - 用戶名(
hibernate.connection.username
) - 密碼(
hibernate.connection.password
)
<!-- 連接數據庫的基本參數 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///sys</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
B. Hibernate 方言(hibernate.dialect
)
Hibernate 方言 簡單的說就是設置使用的數據庫語言,這樣 Hibernate 在底層就能轉換成對應數據庫的 SQL 語言。
<!-- 配置 Hibernate 的 MySQL 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
2)可選配置
A. 顯示 SQL(hibernate.show_sql
)
是否在控制檯上顯示相應的 SQL 語句。
B. 格式化 SQL(hibernate.format_sql
)
是否美化控制檯上的 SQL 語句。
C. 自動建表(hibernate.hbm2ddl.auto
)
通過此配置可以使用 Hibernate 來創建或更新數據表。其中
hbm2ddl
是指可以根據映射文件轉爲 DDL 語言(數據庫模式定義語言 ),它裏面的2
代表 to。它有以下五個值:
none
:默認值,不使用 Hibernate 的自動建表功能;create
:如果數據庫中已經有表,則刪除原有表,然後再重新創建;如果數據庫中沒有表,則新建表。此值一般測試的時候會使用;create-drop
:如果數據庫中已經有表,則刪除原有表,然後執行後面的語句,再刪除這個表;如果數據庫中沒有表,則新建一個表,使用完了再刪除該表。此值一般測試的時候會使用,使用此值時必須把 SessionFactory 關閉,若不關閉則會報錯;update
:如果數據庫中有表,就使用原有表;如果數據庫中沒有表,則創建新表;validate
:如果數據庫中沒有表,就不會創建表,它只會使用數據庫中原有的表,但是它使用的時候會校驗映射和表結構。
D. 配置連接池
<!-- 配置C3P0連接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在連接池中可用的數據庫連接的最少數目 -->
<property name="c3p0.min_size">5</property>
<!--在連接池中所有數據庫連接的最大數目 -->
<property name="c3p0.max_size">20</property>
<!--設定數據庫連接的過期時間,以秒爲單位,
如果連接池中的某個數據庫連接處於空閒狀態的時間超過了timeout時間,就會從連接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒檢查所有連接池中的空閒連接 以秒爲單位-->
<property name="c3p0.idle_test_period">3000</property>
E. 事務隔離級別(hibernate.connection.isolation
)
事務的隔離級別有四個,它們在程序中用四個數字進行表示,它們分別是:
- 讀未提交:Read uncommitted isolation,它用
1
表示;- 讀已提交:Read committed isolation,它用
2
表示;- 可重複讀:Repeatable read isolation,它用
4
表示;- 序列化:Serializable isolation,它用
8
表示。
<!-- 設置事務隔離級別 爲 可重複讀 -->
<property name="hibernate.connection.isolation">4</property>
F. 當前線程綁定的 Session(hibernate.current_session_context_class
)
在 Hibernate 中可以指定 Session 管理方式,它的可選值有:
thread
:Session 對象的生命週期與本地線程綁定;jta
:Session 對象的生命週期與 JTA 事務綁定;managed
:Hibernate 委託程序來管理 Session 對象的生命週期。
<!-- 配置當前線程綁定的 Session -->
<property name="hibernate.current_session_context_class">thread</property>
3)引入映射文件
在配置文件中引入映射文件只能通過 XML 配置文件 的方式,如:
<mapping resource="com/demo/domain/Customer.hbm.xml" />
二、映射文件
映射文件 是將 Java 中的實體類與數據庫中的表建立映射關係的配置文件,它的文件名格式是:
類名.hbm.xml
。它有幾個常用標籤:
1、class 標籤
class 標籤是用來建立類與表的映射關係。它的常用屬性有:
name
:類的全類名,如:name="com.demo.Student"
;table
:表名。如果類名和表名一致,table
屬性可以省略,如:table="s_student"
;catelog
:數據庫名。這個屬性可以不用寫,因爲在覈心配置文件中已經配置過了,如果一個項目中用到了多個數據庫,該屬性才發揮作用,如:catelog="sys"
。
2、id 標籤
id 標籤是用來建立類中的
id
屬性與表中主鍵字段的對應關係。它的常用屬性有:
-
name
:類中的屬性名; -
column
:表中的字段名。如果類中的屬性名和表中的字段名一致,column
屬性可以省略; -
length
:字段長度。我們一般通過 Hibernate 建表時需要用到此屬性; -
type
:類型。這個屬性不需要自己去寫,Hibernate 可以自動進行轉換。此類型有三種寫法:-
Java 類型:
type="java.lang.String"
-
Hibernate 類型:
type="string"
-
數據庫類型:
<property name="cust_name" length="32"> <column name="cust_name" sql-type="varchar"></column> </property>
-
3、property 標籤
property 標籤是用來建立類中的普通屬性與表字段的對應關係。id 標籤 與 property 標籤十分類似,相同的屬性我就不進行過多介紹了。它的常用屬性有:
name
:類中的屬性名;column
:表中的字段名。如果類中的屬性名和表中的字段名一致,column
屬性可以省略;length
:字段長度。我們一般通過 Hibernate 建表時需要用到此屬性;type
:這個屬性不需要自己去寫,Hibernate 可以自動進行轉換;not-null
:是否允許爲空(數據表裏是非空約束)。not-null='true'
;unique
:是否唯一(數據表裏是唯一約束)。unique="true"
。
4、實例代碼
<!-- 建立類與表的映射 -->
<class name="com.hibernate.demo1.Customer" table="cst_customer">
<!-- 建立類中的屬性與表中的主鍵對應 -->
<id name="cust_id" column="cust_id">
<!-- 主鍵都有生成策略 native: 本地策略 -->
<generator class="native" />
</id>
<!-- 建立類中的普通屬性和表字段的對應 -->
<property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry" />
<property name="cust_level" column="cust_level" />
<property name="cust_phone" column="cust_phone" />
<property name="cust_mobile" column="cust_mobile" />
</class>