1:創建實體類

1 package com.yinfu.entity; 2 3 public class User { 4 5 private int id; 6 private String username; 7 private String password; 8 private String address; 9 public int getId() { 10 return id; 11 } 12 public void setId(int id) { 13 this.id = id; 14 } 15 public String getUsername() { 16 return username; 17 } 18 public void setUsername(String username) { 19 this.username = username; 20 } 21 public String getPassword() { 22 return password; 23 } 24 public void setPassword(String password) { 25 this.password = password; 26 } 27 public String getAddress() { 28 return address; 29 } 30 public void setAddress(String address) { 31 this.address = address; 32 } 33 34 }
2:創建實體類與數據庫表對應的配置文件:

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 <!-- 7 配置類和表的對應 8 class標簽 9 name屬性:實體類全類名 10 table屬性:數據庫表名稱,用hibernate不需要自己創建表,他可以根據配置文件自動生成數據庫表 11 --> 12 <class name="com.yinfu.entity.User" table="t_user"> 13 <!-- 14 配置實體類ID與表中的ID進行對應 15 hibernate要求實體類屬性有一個唯一值 16 hibernate要求表有作為唯一值得字段 17 --> 18 <!--id標簽 19 name屬性:實體類中的id名稱 20 column屬性:表字段中的id名稱 21 --> 22 <id name="id" column="id"> 23 <!-- 設置數據庫表的增長策略 24 native:生成表id值就是主鍵自增長 25 --> 26 <generator class="native"></generator> 27 </id> 28 <!-- 配置其他屬性和表的字段的對應 29 name屬性:實體類中的屬性名 30 column屬性:表中的字段名 31 --> 32 <property name="username" column="username"></property> 33 <property name="password" column="password"></property> 34 <property name="address" column="address"></property> 35 </class> 36 </hibernate-mapping>
3:hibernate核心配置文件(1.數據庫信息,2.hibernate信息,3.實體類與數據庫映射的配置文件注入信息)
此配置文件文件名和位置是固定的:文件名: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 <!-- 此配置文件的文件名和位置是固定的的 7 文件名:hibernate.cfg.xml 8 位置:要寫在src文件中 9 --> 10 <session-factory> 11 <!-- 第一部分:配置數據庫信息 --> 12 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 13 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> 14 <property name="hibernate.connection.username">root</property> 15 <property name="hibernate.connection.password">song12345</property> 16 17 <!-- 第二部分:配置hibernate信息(可有可無) --> 18 <!-- 輸出底層的SQL語句 --> 19 <property name="hibernate.show_sql">true</property> 20 <!-- 對底曾語句進行格式化 --> 21 <property name="hibernate.format_sql">true</property> 22 <!-- hibernate幫創建表,需要配置 23 update:如果有表就更新,沒有表就創建 24 --> 25 <property name="hibernate.hbm2ddl.auto">update</property> 26 <!-- 配置數據庫的方言 27 識別不同數據庫中的特有的語句和關鍵字 28 比如:分頁查詢 29 MySQL關鍵字是limit 30 oracle中的使用的是top-n分析中的rownum 31 --> 32 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 33 <!-- 指定線程管理方式,與本地線程進行綁定,實現單線程操作 --> 34 <property name="hibernate.current_session_context_class">thread</property> 35 36 <!-- 第三部分:把映射文件放到核心配置文件中 --> 37 <mapping resource="com/yinfu/entity/User.hbm.xml"/> 38 39 </session-factory> 40 41 </hibernate-configuration>
4:用Junit進行簡單測試:

1 package com.yinfu.test; 2 3 import static org.junit.Assert.*; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.cfg.Configuration; 9 import org.junit.Test; 10 11 import com.yinfu.entity.User; 12 import com.yinfu.utils.HibernateUtils; 13 14 public class HibernateTest { 15 16 @Test 17 public void test() { 18 //1.加載hibernate核心配置文件 19 //只會到src下去尋找hibernate的核心配置文件 20 Configuration cfg = new Configuration(); 21 cfg.configure(); 22 //2.創建sessionFactory對象 23 //讀取hibernate核心配置文件內容,根據configuration對象創建sessionFactory對象 24 //在這過程中,根據映射關系,在相應數據庫中把表創建 25 SessionFactory sessionFactory = cfg.buildSessionFactory(); 26 //3.根據sessionFactory得到session對象 27 //類似於jdbc中的connection鏈接 28 Session session = sessionFactory.openSession(); 29 //4.開啟事務 30 Transaction tx = session.beginTransaction(); 31 //5.邏輯代碼實現crud操作 32 //session中有:增加:save方法 修改:update 刪除:delete方法 根據ID查詢:get方法 33 User user = new User(); 34 user.setUsername("李四"); 35 user.setPassword("12345"); 36 user.setAddress("韓國"); 37 session.save(user); 38 //6.提交事務 39 tx.commit(); 40 //7.釋放資源 41 session.close(); 42 sessionFactory.close(); 43 44 } 45 }
4.1,將創建SessionFactory對象的代碼提出來,放到static靜態代碼塊中,當此類加載的時候只創建一個對象,並重復使用此對象,能夠進行優化
首先創建Utils工具類:

1 package com.yinfu.utils; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 7 //工具類 8 public class HibernateUtils { 9 10 private final static Configuration cfg; 11 private final static SessionFactory sessionFactory; 12 13 //用靜態代碼塊來實現對象只在類加載的時候創建一次(靜態代碼塊只執行一次) 14 static{ 15 //創建configuration對象, 16 cfg = new Configuration(); 17 cfg.configure(); 18 //根據Configuration對象創建sessionFactory對象 19 sessionFactory = cfg.buildSessionFactory(); 20 } 21 22 //返回與本地線程綁定的session 23 public static Session getSession(){ 24 return sessionFactory.getCurrentSession(); 25 } 26 27 //創建一個方法用於返回sessionFactory對象 28 public static SessionFactory getSessionFactory(){ 29 return sessionFactory; 30 } 31 32 33 }
然后創建測試類:

1 package com.yinfu.test; 2 3 import static org.junit.Assert.*; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.cfg.Configuration; 9 import org.junit.Test; 10 11 import com.yinfu.entity.User; 12 import com.yinfu.utils.HibernateUtils; 13 14 public class HibernateTest { 15 @Test 16 public void testStatic() { 17 //利用工具類得到與本地線程綁定的session 18 Session session = HibernateUtils.getSession(); 19 //4.開啟事務 20 Transaction tx = session.beginTransaction(); 21 //5.邏輯代碼 22 //增加方法: 23 //此user為瞬時態數據(user中沒有id,與session無關) 24 User user = new User(); 25 user.setUsername("趙六"); 26 user.setPassword("12345"); 27 user.setAddress("瑪雅文明"); 28 session.save(user); 29 30 //根據ID查詢: 31 //第一個參數:實體類的類對象。第二個參數:id值 32 //此user為持久態數據(有id,與session有關) 33 // User user = session.get(User.class, 1); 34 // System.out.println(user); 35 36 //修改方法: 37 // User user = session.get(User.class, 1); 38 // user.setUsername("張三"); 39 // session.update(user); 40 41 //刪除方法: 42 //第一種: 43 // User user = session.get(User.class, 1); 44 // session.delete(user); 45 //第二種: 46 // User user = new User(); 47 // user.setId(2); 48 // session.delete(user); 49 50 //6.提交事務 51 tx.commit(); 52 //7.釋放資源 53 session.close(); 54 55 } 56 57 }
由於在工具類中將session與當前線程進行了綁定,執行結果正確了,但是會有一個異常,這個異常是由於當session與本地線程進行綁定之后,session會隨着線程的結束而自動關閉,不在需要手動進行session關閉,當還有session.close()方法的時候回報此異常。
數據的三種狀態:
1:瞬時態數據(沒有ID,與session無關):
User user = new User();
user.setUsername("趙六");
user.setPassword("12345");
user.setAddress("瑪雅文明");
2:脫管狀態:(有id,與session無關)
User user = new User();
user.setId(1);
3:持久態數據:(有id,與session有關)
User user = session.get(User.class, 1);