一.Hibernate概述Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架. 實現了ORM思想的:不再重點關註sql語句的編寫 開源的:開放源代碼的 輕量級的:消耗的資源少(記憶體),依賴的jar包比較少註:ORM思想(O:object R:relati... ...
一.Hibernate概述
Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架.
實現了ORM思想的:不再重點關註sql語句的編寫
開源的:開放源代碼的
輕量級的:消耗的資源少(記憶體),依賴的jar包比較少
註:ORM思想(O:object R:relation M:mapping--對象關係映射)
目的:操作實體類就相當於操作資料庫表
條件:1.創建實體類和表的映射關係
2.創建屬性和欄位的映射關係
二.環境搭建
1.導入jar包:必選/log4j/mysql驅動包
2.編寫映射關係文件:實體類.hbm.xml,放在實體類包下
映射關係文件內容:
(1)實體類與sql表的關係
(2)實體類屬性與sql表欄位的關係
模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- 1.創建實體類與表的映射關係 --> 7 <!-- 8 lazy:配置懶載入 9 true:使用懶載入(使用時才發送sql語句); 10 false:立即載入; 11 --> 12 <class name="linkman.Linkman" table="cst_linkman" lazy="false"> 13 <!-- 2.創建屬性與欄位值的映射關係 --> 14 <!--2.1配置主鍵 --> 15 <id name="lkmId" column="lkm_id"> 16 <generator class="native"></generator> 17 </id> 18 <!--2.2其它屬性與欄位 --> 19 <property name="lkmName" column="lkm_name"></property> 20 <property name="lkmGender" column="lkm_gender"></property> 21 <property name="lkmPhone" column="lkm_phone"></property> 22 <property name="lkmMobile" column="lkm_mobile"></property> 23 <property name="lkmEmail" column="lkm_email"></property> 24 <property name="lkmPosition" column="lkm_position"></property> 25 <property name="lkmMemo" column="lkm_memo"></property> 26 </class> 27 </hibernate-mapping>
3.編寫hibernate核心配置文件:hibernate.cfg.xml,放在src包下
核心配置文件內容(順序不能變):
(1)資料庫配置信息;
(2)hibernate基本配置信息;
(3)映射關係文件的位置
模板:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!--資料庫配置 --> 8 <!-- 9 hibernate.hbm2ddl.auto : hibernate生成數據定義語言 10 資料庫的建表語句,使用hibernate自動創建資料庫表 11 create-drop :程式開始的時候創建表(有表刪表,再創建,沒表直接創建),程式結束的時候刪除表 12 create : 有表現刪除再創建表,沒表直接創建 13 update :沒表創建表,有表的話如果映射關係發生了變化,更新表 14 validate :不會創建表,驗證映射文件的配置,如果映射文件配置發生了變化,拋出異常 15 --> 16 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 17 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 18 <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property> 19 <property name="hibernate.connection.username">root</property> 20 <property name="hibernate.connection.password">root</property> 21 <!--hibernate基本配置 --> 22 <property name="hibernate.hbm2ddl.auto">update</property> 23 <property name="hibernate.show_sql">true</property> 24 <property name="hibernate.format_sql">true</property> 25 <!--指定映射文件位置 --> 26 <mapping resource="linkman/Linkman.hbm.xml"/> 27 </session-factory> 28 </hibernate-configuration>
附:關於使用Eclipse軟體編寫以上兩種配置文件的自動提示相關問題:
1.配置Eclipse:
菜單欄:window-->preferences-->XML-->Catalog,選中User Specified Entries,單擊Add,選擇File System,選中dtd文件(hibernate-configuration-3.0.dtd或者hibernate-mapping-3.0.dtd)的路徑;Key Type選擇uri,將對應的dtd文件中的uri(http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd或者http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd)複製進去即可;重啟Eclipse,輸入標簽<>即可自動提示;
2.關於標簽內屬性的提示,需按快捷鍵alt+/
三.Hibernate使用步驟:七步
1.載入配置文件--Configuration
2.構建sessionFactory--cfg.buildSessionFactory
3.打開新的session--factory.openSession
4.開啟事務--tx.beginTransaction
5.CRUD
6.提交事務--tx.commit
7.釋放資源--session.close()/factory.close()(若使用工具類,factory不能釋放)
工具類:HibernateUtils
1 //使用靜態代碼塊創建factory,僅在啟動時創建一次,提高效率 2 import org.hibernate.Session; 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 public class HibernateUtils { 6 private static SessionFactory factory; 7 static { 8 // 載入配置文件 9 Configuration cfg = new Configuration(); 10 cfg.configure(); 11 // 構建sessionFactory 12 factory = cfg.buildSessionFactory(); 13 } 14 public static Session getSession() { 15 return factory.openSession(); 16 } 17 }
============================================================
舉例:
1.創建sql表
2.創建實體類
3.編寫映射關係文件:Linkman.hbm.xml
4.編寫hibernate配置文件:hibernate.cfg.xml
5.編寫工具類
6.編寫執行代碼
------------------------------------------------------------
1.創建sql表
1 CREATE TABLE `cst_linkman` ( 2 `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯繫人編號(主鍵)', 3 `lkm_name` varchar(16) DEFAULT NULL COMMENT '聯繫人姓名', 4 `lkm_gender` varchar(10) DEFAULT NULL COMMENT '聯繫人性別', 5 `lkm_phone` varchar(16) DEFAULT NULL COMMENT '聯繫人辦公電話', 6 `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '聯繫人手機', 7 `lkm_email` varchar(64) DEFAULT NULL COMMENT '聯繫人郵箱', 8 `lkm_position` varchar(16) DEFAULT NULL COMMENT '聯繫人職位', 9 `lkm_memo` varchar(512) DEFAULT NULL COMMENT '聯繫人備註', 10 PRIMARY KEY (`lkm_id`) 11 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.創建實體類
1 public class Linkman { 2 private Long lkmId;// 聯繫人編號(主鍵) 3 private String lkmName;// 姓名 4 private String lkmGender;// 性別 5 private String lkmPhone;// 辦 公電話 6 private String lkmMobile;// 手機 7 private String lkmEmail;// 郵箱 8 private String lkmPosition;// 職位 9 private String lkmMemo;// 備註 10 // getter/setter 11 public Long getLkmId() { 12 return lkmId; 13 } 14 15 public void setLkmId(Long lkmId) { 16 this.lkmId = lkmId; 17 } 18 19 public String getLkmName() { 20 return lkmName; 21 } 22 23 public void setLkmName(String lkmName) { 24 this.lkmName = lkmName; 25 } 26 27 public String getLkmGender() { 28 return lkmGender; 29 } 30 31 public void setLkmGender(String lkmGender) { 32 this.lkmGender = lkmGender; 33 } 34 35 public String getLkmPhone() { 36 return lkmPhone; 37 } 38 39 public void setLkmPhone(String lkmPhone) { 40 this.lkmPhone = lkmPhone; 41 } 42 43 public String getLkmMobile() { 44 return lkmMobile; 45 } 46 47 public void setLkmMobile(String lkmMobile) { 48 this.lkmMobile = lkmMobile; 49 } 50 51 public String getLkmEmail() { 52 return lkmEmail; 53 } 54 55 public void setLkmEmail(String lkmEmail) { 56 this.lkmEmail = lkmEmail; 57 } 58 59 public String getLkmPosition() { 60 return lkmPosition; 61 } 62 63 public void setLkmPosition(String lkmPosition) { 64 this.lkmPosition = lkmPosition; 65 } 66 67 public String getLkmMemo() { 68 return lkmMemo; 69 } 70 71 public void setLkmMemo(String lkmMemo) { 72 this.lkmMemo = lkmMemo; 73 } 74 75 // toString 76 @Override 77 public String toString() { 78 return "Linkman [lkmId=" + lkmId + ", lkmName=" + lkmName + ", lkmGender=" + lkmGender + ", lkmPhone=" 79 + lkmPhone + ", lkmMobile=" + lkmMobile + ", lkmEmail=" + lkmEmail + ", lkmPosition=" + lkmPosition 80 + ", lkmMemo=" + lkmMemo + "]"; 81 } 82 83 } 84
3.編寫映射關係文件:Linkman.hbm.xml--放在實體類所在包下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <!-- 1.創建實體類與表的映射關係 --> 8 <class name="linkman.Linkman" table="cst_linkman"> 9 <!-- 2.創建屬性與欄位值的映射關係 --> 10 <!--2.1配置主鍵 --> 11 <id name="lkmId" column="lkm_id"> 12 <generator class="native"></generator> 13 </id> 14 <!--2.2其它屬性與欄位 --> 15 <property name="lkmName" column="lkm_name"></property> 16 <property name="lkmGender" column="lkm_gender"></property> 17 <property name="lkmPhone" column="lkm_phone"></property> 18 <property name="lkmMobile" column="lkm_mobile"></property> 19 <property name="lkmEmail" column="lkm_email"></property> 20 <property name="lkmPosition" column="lkm_position"></property> 21 <property name="lkmMemo" column="lkm_memo"></property> 22 </class> 23 </hibernate-mapping>
4.編寫hibernate配置文件:hibernate.cfg.xml--放在src下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!--資料庫配置 --> 8 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.url">jdbc:mysql:///cst_linkman</property> 11 <property name="hibernate.connection.username">root</property> 12 <property name="hibernate.connection.password">root</property> 13 <!--hibernate基本配置 --> 14 <property name="hibernate.hbm2ddl.auto">update</property> 15 <property name="hibernate.show_sql">true</property> 16 <property name="hibernate.format_sql">true</property> 17 <!--指定映射文件位置 --> 18 <mapping resource="linkman/Linkman.hbm.xml"/> 19 </session-factory> 20 </hibernate-configuration>
5.編寫工具類
1 import org.hibernate.Session; 2 import org.hibernate.SessionFactory; 3 import org.hibernate.cfg.Configuration; 4 5 public class HibernateUtils { 6 private static SessionFactory factory; 7 8 static { 9 // 載入配置文件 10 Configuration cfg = new Configuration(); 11 cfg.configure(); 12 // 構建sessionFactory 13 factory = cfg.buildSessionFactory(); 14 } 15 16 public static Session getSession() { 17 return factory.openSession(); 18 } 19 20 } 21
6.編寫執行代碼--增刪改
1 package demo; 2 3 import org.hibernate.Session; 4 import org.hibernate.Transaction; 5 import org.junit.Test; 6 7 import linkman.Linkman; 8 import utils.HibernateUtils; 9 10 public class Demo02 { 11 // 增加 12 @Test 13 public void add() { 14 // 利用工具類獲取session 15 Session session = HibernateUtils.getSession(); 16 // 開啟事務 17 Transaction tx = session.beginTransaction(); 18 // crud/ 19 Linkman man = new Linkman(); 20 man.setLkmName("Jack"); 21 session.save(man); 22 // 提交事務 23 tx.commit(); 24 // 釋放資源 25 session.close(); 26 27 } 28 29 // 修改id=2的名字為rose,id一定要正確,否則報空指針 30 @Test 31 public void modify() { 32 // 獲取session 33 Session session = HibernateUtils.getSession(); 34 // 開啟事務 35 Transaction tx = session.beginTransaction(); 36 // 修改 37 Linkman man = session.get(Linkman.class, 2L); 38 man.setLkmName("Rose"); 39 // 提交事務 40 tx.commit(); 41 // 釋放資源 42 session.close(); 43 } 44 45 //刪除 46 @Test 47 public void del() { 48 // 獲取session 49 Session session = HibernateUtils.getSession(); 50 // 開啟事務 51 Transaction tx = session.beginTransaction(); 52 // crud-del 53 Linkman man = session.get(Linkman.class, 2L); 54 session.delete(man); 55 // 提交事務 56 tx.commit(); 57 // 釋放 58 session.close(); 59 } 60 } 61