1 主配置文件
Hibernate.cfg.xml
主配置文件中主要配置:數據庫連接信息、其他參數、映射信息!
常用配置查看源碼:
hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
<!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節點代表一個數據庫 --> <session-factory> <!-- 1. 數據庫連接配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hib_demo?useUnicode=true&characterEncoding=UTF8</property> <property name="hibernate.connection.username">用戶名</property> <property name="hibernate.connection.password">密碼</property> <!-- 數據庫方法配置,hibernate在運行的時候,會根據不同的方言生成符合當前數據庫語法的sql --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 2. 其他相關配置 --> <!-- 2.1 顯示hibernate在運行時候執行的sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 2.3 自動建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 3. 加載所有映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
2 數據庫連接參數配置
例如:
## MySQL
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
<!-- 1. 數據庫連接配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hib_demo?useUnicode=true&characterEncoding=UTF8</property> <property name="hibernate.connection.username">用戶名</property> <property name="hibernate.connection.password">密碼</property> <!-- 數據庫方法配置,hibernate在運行的時候,會根據不同的方言生成符合當前數據庫語法的sql --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
2.1 自動建表
Hibernate.properties
#hibernate.hbm2ddl.auto create-drop 每次在創建sessionFactory時候執行創建表;
當調用sesisonFactory的close方法的時候,刪除表!
#hibernate.hbm2ddl.auto create 每次都重新建表; 如果表已經存在就先刪除再創建<property name="hibernate.hbm2ddl.auto">create</property>
#hibernate.hbm2ddl.auto update 如果表不存在就創建; 表存在就不創建; <property name="hibernate.hbm2ddl.auto">update</property>
#hibernate.hbm2ddl.auto validate (生成環境時候) 執行驗證: 當映射文件的內容與數據庫表結構不一樣的時候就報錯!
<!-- 2. 其他相關配置 --> <!-- 2.1 顯示hibernate在運行時候執行的sql語句 --> <property name="hibernate.show_sql">true</property> <!-- 2.2 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- 2.3 自動建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 3. 加載所有映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/>
當使用
// 創建sf對象 sf = new Configuration() .configure() .addClass(User.class) //(測試) 會自動加載映射文件:Employee.hbm.xml .buildSessionFactory();
用以上語句可以 不用在主配置文件中 寫 <!-- 3. 加載所有映射 --> <mapping resource="com/yif/a_hello/Employee.hbm.xml"/>
2.2 手動建表
public class App_ddl { // 自動建表 @Test public void testCreate() throws Exception { // 創建配置管理類對象 Configuration config = new Configuration(); // 加載主配置文件 config.configure(); // 創建工具類對象 SchemaExport export = new SchemaExport(config); // 建表 // 第一個參數: 是否在控制台打印建表語句 // 第二個參數: 是否執行腳本 export.create(true, true); } }
3 映射配置
3.1 普通字段類型
3.2 主鍵映射
單列主鍵映射
多列作為主鍵映射
主鍵生成策略,查看api: 5.1.2.2.1. Various additional generators
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 映射文件: 映射一個實體類對象; 描述一個對象最終實現可以直接保存對象數據到數據庫中。 --> <!-- package: 要映射的對象所在的包(可選,如果不指定,此文件所有的類都要指定全路徑) auto-import 默認為true, 在寫hql的時候自動導入包名 如果指定為false, 再寫hql的時候必須要寫上類的全名; 如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list(); --> <hibernate-mapping package="cn.itcast.c_hbm_config" auto-import="true"> <!-- class 映射某一個對象的(一般情況,一個對象寫一個映射文件,即一個class節點) name 指定要映射的對象的類型 table 指定對象對應的表; 如果沒有指定表名,默認與對象名稱一樣 --> <class name="Employee" table="employee"> <!-- 主鍵 ,映射--> <id name="empId" column="id"> <!-- 主鍵的生成策略 identity 自增長(mysql,db2) sequence 自增長(序列), oracle中自增長是以序列方法實現 native 自增長【會根據底層數據庫自增長的方式選擇identity或sequence】 如果是mysql數據庫, 采用的自增長方式是identity 如果是oracle數據庫, 使用sequence序列的方式實現自增長 increment 自增長(會有並發訪問的問題,一般在服務器集群環境使用會存在問題。) assigned 指定主鍵生成策略為手動指定主鍵的值 uuid 指定uuid隨機生成的唯一的值 foreign (外鍵的方式, one-to-one講) --> <generator class="uuid"/> </id> <!-- 普通字段映射 property name 指定對象的屬性名稱 column 指定對象屬性對應的表的字段名稱,如果不寫默認與對象屬性一致。 length 指定字符的長度, 默認為255 type 指定映射表的字段的類型,如果不指定會匹配屬性的類型 java類型: 必須寫全名 hibernate類型: 直接寫類型,都是小寫 --> <property name="empName" column="empName" type="java.lang.String" length="20"></property> <property name="workDate" type="java.util.Date"></property> <!-- 如果列名稱為數據庫關鍵字,需要用反引號或改列名。 --> <property name="desc" column="`desc`" type="java.lang.String"></property> </class> </hibernate-mapping>
3.3 復合主鍵映射
User 類 主鍵需要單獨為類
public class User { // 名字跟地址,不會重復 private CompositeKeys keys; private int age; public CompositeKeys getKeys() { return keys; } public void setKeys(CompositeKeys keys) { this.keys = keys; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
主鍵類:必須實現 序列化
CompositeKeys keys = new CompositeKeys();
keys.setAddress("廣州棠東");
keys.setUserName("Jack");
// 主鍵查詢
User user = (User) session.get(User.class, keys); 后面的id 是 Serializable
import java.io.Serializable; // 復合主鍵類 public class CompositeKeys implements Serializable{ private String userName; private String address; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true"> <class name="User"> <!-- 復合主鍵映射 --> <composite-id name="keys"> <key-property name="userName" type="string"></key-property> <key-property name="address" type="string"></key-property> </composite-id> <property name="age" type="int"></property> </class> </hibernate-mapping>