Hibernate(二):Hibernate搭建開發環境+簡單例項

JacobGo發表於2017-05-16

本文轉載自:http://blog.csdn.net/jiuqiyuliang/article/details/39380465


  hibernate是非常典型的持久層框架,持久化的思想是非常值得我們學習和研究的。這篇博文,我們主要以例項的形式學習Hibernate,不深究Hibernate的思想和原理,否則,一味追求,苦學思想和原理,到最後可能什麼也學不會,從實踐入手,熟能生巧,思想和原理自然而然領悟。

 

      上篇博文:【SSH進階之路】Hibernate基本原理,我們介紹了Hibernate的基本概念、Hibernate的核心以及Hibernate的執行原理,可以很好幫助我們認識Hibernate,再看這篇部落格之前,請先回顧上篇博文內容。這篇博文,我們從實踐角度,動手搭建一個簡單的Hibernate例項。


一、開發環境


         Win8 + jdk1.7 + MyEclipse + Tomcat5.0 + MySQL

      說明:其實Hibernate是非常獨立的框架,根本不需要MyEclipse,Eclipse,Tomcat,Log4J等,他們只不過是能滿足我們其他的需求,才把他們引進來的。


二、下載檔案


你需要Java SDK、 Hibernate包、和JDBC Driver。
 
1、Hibernate包下載地址:
http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc

2、JDBC Driver根據你的資料庫來定,一般database官網都有。Hibernate支援常用的資料庫,比如 MySQL, Oracle等等。這兩個資料庫是現在比較常用的,都有JDBC Driver:

Oracle JDBC Driver下載地址(下載前必須同意Oracle協議書)
http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

MySQL JDBC Driver下載地址
http://dev.mysql.com/downloads/connector/j/3.0.html

三、所需jar包

   


hibernate3.jar                                             Hibernate的核心包

dom4j-1.6.1.jar                                            dom4j讀取xml檔案包

mysql-connector-Java-3.1.13-bin.jar        MySQL的jdbc驅動包

       Hibernate的作用:讓我們以物件導向的方式或思維來考慮怎麼向關係型資料庫存取資料。它需要與相應的資料庫打交道,所以需要相應的jdbc驅動。我們的database用的是MySQL,所以需要引入MySQL的jdbc驅動。

log4j-1.2.11.jar                                           記錄日誌框架

        由於log4j的記錄日誌比jdk自帶的記錄日誌功能更加美觀,簡單,易配置日誌級別,便於除錯,我們選擇使用log4j。

 

必須要引入的jar:

commons-logging-1.0.4.jar                       抽象的日誌記錄框架

      本身並沒有實現真正的寫日誌能力(看包結構即可知道)而是結合其它的日誌系統如Log4j或者java本身的java.util.logging作為日誌輸出元件,來實現日誌記錄的功能。

commons-collections-2.1.1jar                各種集合類和集合工具類的封裝

cglib-2.1.3.jar                                            動態代理,Hibernate用它來實現PO位元組碼的動態生成

asm.jar                                                      cglib需要依賴的jar,ASM位元組碼庫

 

注:作為初學者不提倡這種做法,只需要將hibernate所要依賴的第三方jar包都引入即可,否則做其他例項時會報NoClassDefFoundError的錯誤,解決方案:只需將對應jar引入即可。由於這是一個簡單例項,僅僅需要引入這些jar。

 

四、程式碼展示

 

1、在IDE中建立java專案(比較簡單不再演示)

 

2、建立source folder,命名為Hibernate3,在Hibernate下載檔案中找到我們所需要的三個配置檔案和所有jar包,拷貝所需jar檔案,構建依賴包

 

           

3、提供hibernate.cfg.xml檔案,完成基本配置

 

4、寫程式碼

 

(1)建立實體類User.java

  

[java] view plain copy
 print?
  1. package com.liang.hibernate;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class User {  
  6.     private String id;  
  7.     private String name;  
  8.     private String password;  
  9.     private Date createTime;  
  10.     private Date expireTime;  
  11.       
  12.     public String getId() {  
  13.         return id;  
  14.     }  
  15.     public void setId(String id) {  
  16.         this.id = id;  
  17.     }  
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.     public String getPassword() {  
  25.         return password;  
  26.     }  
  27.     public void setPassword(String password) {  
  28.         this.password = password;  
  29.     }  
  30.     public Date getCreateTime() {  
  31.         return createTime;  
  32.     }  
  33.     public void setCreateTime(Date createTime) {  
  34.         this.createTime = createTime;  
  35.     }  
  36.     public Date getExpireTime() {  
  37.         return expireTime;  
  38.     }  
  39.     public void setExpireTime(Date expireTime) {  
  40.         this.expireTime = expireTime;  
  41.     }  
  42.   
  43. }  

 

(2)提供User.hbm.xml檔案,完成實體類對映

 

[html] view plain copy
 print?
  1. <span style="font-size:12px;"><?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <!--生成預設為user的資料庫表-->  
  7.     <class name="com.liang.hibernate.User">  
  8.         <id name="id">  
  9.             <!-- 演算法的核心思想是結合機器的網路卡、當地時間、一個隨機數來生成GUID -->  
  10.             <generator class="uuid"></generator>  
  11.         </id>  
  12.         <property name="name"></property>  
  13.         <property name="password"></property>  
  14.         <property name="createTime" type="date"></property>  
  15.         <property name="expireTime" type="date"></property>  
  16.     </class>  
  17.       
  18. </hibernate-mapping></span>  

 

(3)將User.hbm.xml檔案加入到hibernate.cfg.xml檔案中

 

[html] view plain copy
 print?
  1. <!DOCTYPE hibernate-configuration PUBLIC  
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  4.   
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <!-- 設定資料庫驅動 -->  
  8.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  9.         <!-- 設定資料庫URL -->  
  10.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>  
  11.         <!-- 資料庫使用者名稱 -->  
  12.         <property name="hibernate.connection.username">root</property>  
  13.         <!-- 資料庫密碼 -->  
  14.         <property name="hibernate.connection.password">123456</property>  
  15.         <!-- 指定對應資料庫的方言,hibernate為了更好適配各種關聯式資料庫,針對每種資料庫都指定了一個方言dialect -->  
  16.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  17.           
  18.         <!-- 對映檔案 -->  
  19.         <mapping resource="com/liang/hibernate/User.hbm.xml"/>  
  20.     </session-factory>  
  21. </hibernate-configuration>  

 

(4)編寫工具類ExportDB.java,將hbm生成ddl,也就是hbm2ddl

 

[java] view plain copy
 print?
  1. package com.liang.hibernate;  
  2.   
  3. import org.hibernate.cfg.Configuration;  
  4. import org.hibernate.tool.hbm2ddl.SchemaExport;  
  5.   
  6. /** 
  7.  * 將hbm生成ddl 
  8.  * @author liang 
  9.  * 
  10.  */  
  11. public class ExportDB{    
  12.     public static void main(String[]args){  
  13.         //預設讀取hibernate.cfg.xml檔案  
  14.         Configuration cfg = new Configuration().configure();  
  15.         ////生成並輸出sql到檔案(當前目錄)和資料庫  
  16.         SchemaExport export = new SchemaExport(cfg);  
  17.         export.create(truetrue);  
  18.     }  
  19. }  

 

測試之前,要提前建立資料庫hibernate_first,測試如下: 

 

控制檯列印的SQL語句:

 

  1. drop table if exists User  
  2. create table User (id varchar(255) not nullname varchar(255), password varchar(255), createTime date, expireTime dateprimary key (id))  

 

資料庫表結構:

           

 

(5)建立客戶端類Client,新增使用者資料到mySQL

 

[java] view plain copy
 print?
  1. package com.liang.hibernate;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import org.hibernate.Session;  
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.cfg.Configuration;  
  8.   
  9. public class Client {  
  10.     public static void main(String[]args){  
  11.         //讀取hibernate.cfg.xml檔案  
  12.         Configuration cfg = new Configuration().configure();  
  13.         //建立SessionFactory  
  14.         SessionFactory factory =cfg.buildSessionFactory();  
  15.           
  16.         //取得session  
  17.         Session session = null;  
  18.           
  19.         try{  
  20.             //開啟session  
  21.             session = factory.openSession();  
  22.             //開啟事務  
  23.             session.beginTransaction();  
  24.               
  25.             User user = new User();  
  26.             user.setName("jiuqiyuliang");  
  27.             user.setPassword("123456");  
  28.             user.setCreateTime(new Date());  
  29.             user.setExpireTime(new Date());  
  30.             //儲存User物件  
  31.             session.save(user);  
  32.               
  33.             //提交事務  
  34.             session.getTransaction().commit();  
  35.               
  36.         }catch(Exception e){  
  37.             e.printStackTrace();  
  38.             //回滾事務  
  39.             session.getTransaction().rollback();  
  40.         }finally{  
  41.             if(session != null){  
  42.                 if(session.isOpen()){  
  43.                     //關閉session  
  44.                     session.close();  
  45.                 }  
  46.             }  
  47.         }  
  48.     }  
  49. }  


右鍵debug執行,測試完成之後,我們查詢一下測試結果:

            

 

5、為了在除錯過程中能觀察到Hibernate的日誌輸出,最好加入log4j.properties配置檔案、在CLASSPATH中新建log4j.properties配置檔案或將該配置檔案拷貝到src下,便於程式除錯。

內容如下:

 

[html] view plain copy
 print?
  1. <span style="font-size:12px;">### direct log messages to stdout ###  
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  3. log4j.appender.stdout.Target=System.out  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  6.   
  7. ### direct messages to file hibernate.log ###  
  8. #log4j.appender.file=org.apache.log4j.FileAppender  
  9. #log4j.appender.file.File=hibernate.log  
  10. #log4j.appender.file.layout=org.apache.log4j.PatternLayout  
  11. #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  12.   
  13. ### set log levels - for more verbose logging change 'info' to 'debug' ###  
  14.   
  15. log4j.rootLogger=warn, stdout</span>  

 

配置完成後,專案結構如下圖所示:

 

          


 

五、最後

 

      自己動手豐衣足食,實踐出真理,紙上得來終覺淺,絕知此事要躬行。雖然這個例項非常簡單,但是我們踏進了持久層框架的大門。

 

      從上面的簡單例項可以看到,我們只是使用Hibernate對User這一個實體進行了對映,比較簡單,但是完全不符合實際。如何像關係型資料庫一樣表示多種關聯關係,例如:一對一,一對多,多對多等等,我們還需要深入。下篇博文,我們介紹Hibernate的基本對映原理以及關聯關係對映。


相關文章