Hibernate 開發實例全步驟

轉載:http://blog.chinaunix.net/uid-26284395-id-3048988.html

開發順序
1 下載並安裝Hibernate
2 Hibernate配置文件詳解 配置與MySQL數據庫的鏈接與映射文件User.hbm.xml
3 生成映射文件User.hbm.xml
4 編寫持久化類User.java
5 編寫輔助類HibernateSessionFactory.java 負責取得和關閉Hibernate的Session對象
6 編寫DAO類UserDAO.java 編寫根據用戶名取得用戶對象的getUser()
7 編寫Service類UserService.java 編寫valid()函數 調用UserDAO.java的getUser()函數執行函數驗證
 
 
1 下載並安裝Hibernate
下載hibernate-3.0.zip  將hibernate3.zip文件和lib下的所有文件都複製到新建的HibernateTest項目的lib子目錄下
MySQL數據庫的驅動文件複製到lib子目錄下
 
2 hibernate.cfg.xml配置文件
  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

  5. <!-- Generated by MyEclipse Hibernate Tools. -->
  6. <hibernate-configuration>

  7.     <session-factory>
  8.         <property name="myeclipse.connection.profile">
  9.             JDBC for MySQL
  10.         </property>
  11.         <property name="connection.url">
  12.             jdbc:mysql://localhost:3306/demo
  13.         </property>
  14.         <property name="connection.username">root</property>
  15.         <property name="connection.password">root</property>
  16.         <property name="connection.driver_class">
  17.             org.gjt.mm.mysql.Driver
  18.         </property>
  19.         <property name="dialect">
  20.             org.hibernate.dialect.MySQLDialect
  21.         </property>
  22.         <mapping resource="com/demo/hibernate/beans/User.hbm.xml" />


  23.     </session-factory>

  24. </hibernate-configuration>

使用XML文件進行配置時 指定Java類與數據庫表格的映射文件位置 XML配置文件的位置必須在CLASSPATH的設定中 Web程式的WEB-INF/classes中 我們使用下面的方式讀入XML文件以配置Hibernate

  1. SessionFactory sf = new Configuration().configure().buildSessionFactory();

Configuration表示Java類與數據庫表格映射的集合 用於之後建立SessionFactory 之後Configuration就不再起作用了 預設的XML文件名稱是hibernate.cfg.xml你也可以指定文件的名稱

壓縮包Hibernate-3.0.zip壓縮包的etc子目錄下提供默認的Hibernate配置文件hibernate.cfg.xml 我們要在HibernateTest中使用XML的配置文件 因此請複製該文件到HibernateTest項目的src目錄下  並添加MySQL的相關配置項 這樣 HibernateTest就支持Hibernate了

3  編寫映射文件 User.hbm.xml

Hibernate映射文件包含了對象/關係映射所需的元數據 元數據包含持久化類的聲明和屬性到數據庫的映射

映射文件是XML格式的文件 它負責持久化類與數據庫表之間的映射 其根目錄是hibernate-mapping 並通過屬性package指定類所在的包 每一個表使用一個class定義 那麼表示類的名稱 table表示關聯的表明 通過property子元素來映射類的變量名與數據庫表字段名之間的映射關係

在這個HibernateTest項目中 我們建立一個映射文件User.hbm.xml來映射到數據表user 映射的類名爲User 所在的包爲com.demo.hibernate.beans

 

  1. <?xml version="1.0" encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.                             "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.                             "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

  5. <!-- DO NOT EDIT: This is a generated file that is synchronized -->
  6. <!-- by MyEclipse Hibernate tool integration. -->
  7. <!-- Created Tue Aug 14 18:57:22 CST 2007 -->
  8. <hibernate-mapping package="com.demo.hibernate.beans">

  9.     <class name="User" table="user">
  10.         <id name="id" column="ID" type="integer">
  11.             <generator class="native"/>
  12.         </id>

  13.         <property name="username" column="username" type="string" />
  14.         <property name="password" column="password" type="string" />
  15.         <property name="email" column="email" type="string" />
  16.     </class>
  17.     
  18. </hibernate-mapping>

4  編寫持久化類User.java

持久化類是指其實例需要被Hibernate持久化到數據庫中的類 持久化通常是與模型中的實體域類 一般都是一張數據表對應一個持久化類 不能認爲所有的持久化類的實例都是持久的狀態 一個實例的狀態也可能是瞬時的或脫管的。

在HibernateTest示例程序中 包含了一個持久化類User.java 該類包含表User的4個字段對應的變量 這些變量都申明爲private類型的

 

  1. package com.demo.hibernate.beans;

  2. public class User {
  3.     private java.lang.Integer id;

  4.     private java.lang.String username;

  5.     private java.lang.String password;

  6.     private java.lang.String email;

  7.     public java.lang.String getEmail() {
  8.         return email;
  9.     }

  10.     public void setEmail(java.lang.String email) {
  11.         this.email = email;
  12.     }

  13.     public java.lang.Integer getId() {
  14.         return id;
  15.     }

  16.     public void setId(java.lang.Integer id) {
  17.         this.id = id;
  18.     }

  19.     public java.lang.String getPassword() {
  20.         return password;
  21.     }

  22.     public void setPassword(java.lang.String password) {
  23.         this.password = password;
  24.     }

  25.     public java.lang.String getUsername() {
  26.         return username;
  27.     }

  28.     public void setUsername(java.lang.String username) {
  29.         this.username = username;
  30.     }

  31. }

 

5  編寫輔助類 HibernateSessionFactory.java

Hibernate的Session 這是一個持久化管理器 通過它從數據庫中存取User

首先我們要從SessionFactory中獲取一個Session

 

  1. SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

通過對configure()的調用來轉載hibernate.cfg.xml配置文件 並初始化成一個Configuration實例 在創建SessionFactory之前 可以訪問Configuration來設置其他屬性

SessionFactory應該設置成單例模式 這樣才能在程序中容易地訪問SessionFactory

程序代碼如下

 

  1. package com.demo.hibernate.util;

  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Session;
  4. import org.hibernate.cfg.Configuration;

  5. /**
  6.  * Configures and provides access to Hibernate sessions, tied to the
  7.  * current thread of execution. Follows the Thread Local Session
  8.  * pattern, see {@link http://hibernate.org/42.html}.
  9.  */
  10. public class HibernateSessionFactory {

  11.     /**
  12.      * Location of hibernate.cfg.xml file.
  13.      * NOTICE: Location should be on the classpath as Hibernate uses
  14.      * #resourceAsStream style lookup for its configuration file. That
  15.      * is place the config file in a Java package - the default location
  16.      * is the default Java package.


  17.      * Examples:

  18.      * CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
  19.      * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".
  20.      */
  21.     private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

  22.     /** Holds a single instance of Session */
  23.     private static final ThreadLocal threadLocal = new ThreadLocal();

  24.     /** The single instance of hibernate configuration */
  25.     private static final Configuration cfg = new Configuration();

  26.     /** The single instance of hibernate SessionFactory */
  27.     private static org.hibernate.SessionFactory sessionFactory;

  28.     /**
  29.      * Returns the ThreadLocal Session instance. Lazy initialize
  30.      * the SessionFactory if needed.
  31.      *
  32.      * @return Session
  33.      * @throws HibernateException
  34.      */
  35.     public static Session currentSession() throws HibernateException {
  36.         Session session = (Session) threadLocal.get();

  37.         if (session == null) {
  38.             if (sessionFactory == null) {
  39.                 try {
  40.                     cfg.configure(CONFIG_FILE_LOCATION);
  41.                     sessionFactory = cfg.buildSessionFactory();
  42.                 }
  43.                 catch (Exception e) {
  44.                     System.err.println("%%%% Error Creating SessionFactory %%%%");
  45.                     e.printStackTrace();
  46.                 }
  47.             }
  48.             session = sessionFactory.openSession();
  49.             threadLocal.set(session);
  50.         }

  51.         return session;
  52.     }

  53.     /**
  54.      * Close the single hibernate session instance.
  55.      *
  56.      * @throws HibernateException
  57.      */
  58.     public static void closeSession() throws HibernateException {
  59.         Session session = (Session) threadLocal.get();
  60.         threadLocal.set(null);

  61.         if (session != null) {
  62.             session.close();
  63.         }
  64.     }

  65.     /**
  66.      * Default constructor.
  67.      */
  68.     private HibernateSessionFactory() {
  69.     }

  70. }

這個類不但在他的靜態初始器中使用了SessionFactory 還使用了了一個ThreadLocal變量來保存Session作爲當前工作線程

 

6  編寫DAO類UserDAO.java

所謂的DAO層 就是數據訪問接口 爲了基於Hibernate的開發中將業務層與數據層分開 DAO層只負責處理調用Hibernate API實現CRUD操作 Service層面向用戶負責調用DAO層的代碼 這樣做的好處是 數據層的代碼不用關心業務服務 可以更好的實現移植

 

  1. package com.demo.hibernate.dao;

  2. import org.hibernate.HibernateException;
  3. import org.hibernate.Query;
  4. import org.hibernate.Session;
  5. import org.hibernate.Transaction;

  6. import com.demo.hibernate.beans.User;
  7. import com.demo.hibernate.util.HibernateSessionFactory;

  8. public class UserDAO {

  9.     public User getUser(String username) throws HibernateException {
  10.         Session session = null;
  11.         Transaction tx = null;
  12.         User user = null;
  13.         try {
  14.             session = HibernateSessionFactory.currentSession();
  15.             tx = session.beginTransaction();
  16.             Query query = session.createQuery("from User where username=?");
  17.             query.setString(0, username.trim());
  18.             user = (User)query.uniqueResult();
  19.             query = null;
  20.             tx.commit ();
  21.         }catch(HibernateException e){
  22.             throw e;
  23.         }finally{
  24.             if (tx!=null) {
  25.                 tx.rollback();
  26.             }
  27.             HibernateSessionFactory.closeSession();
  28.         }
  29.         return user;
  30.     }
  31. }

 

該類實現了一個getUser()函數 根據用戶名username查詢一個用戶對象 在該函數中使用HibernateSessionFactory取得Session對象 然後通過session執行事務 創建查詢對象 返回查詢的用戶對象,操作Session的代碼都是Hibernate提供的API

7  編寫Service類並運行

Service類即服務層 就是面向用戶服務 它定義的方法都是與實際的業務相關的

此例子中 定義一個Service類UserService 他有一個函數valid() 根據用戶名和密碼來判斷用戶是否存在 改函數調用DAO層的UserDAO類來取得一個用戶對象 並比較該對象的密碼與輸入的密碼是否相等 如果相等就返回true 否則返回false  然後編寫一個main()入口函數 用戶調用valid()函數來執行業務的調用 並輸出返回的結果

 

  1. package com.demo.hibernate.service;

  2. import com.demo.hibernate.beans.User;
  3. import com.demo.hibernate.dao.UserDAO;

  4. public class UserService {
  5.     
  6.     public boolean valid(String username, String password) {
  7.         UserDAO test = new UserDAO();
  8.         User user = test.getUser("admin");
  9.         if(user.getPassword().equals(password)) {
  10.             return true;
  11.         } else {
  12.             return false;
  13.         }
  14.     }
  15.     
  16.     public static void main(String[] args) {
  17.         UserService service = new UserService();
  18.         boolean login = service.valid("admin", "admin");
  19.         System.out.println("驗證結果:"+login);
  20.     }
  21. }

接下來 運行 UserService.java 運行方式 Java應用程序 即可運行main()函數

此處記住 還要添加日誌屬性文件 三個日誌屬性文件 複製到Hibernate的src子目錄下即可

運行程序 出現錯誤

 

  1. Communication failure during handshake. Is there a server running on localhost:3306?

原因:

結果在Mysql.com的官方網站上看到這個解釋,是因爲新的Mysql的認證機制發生了一些變化造成的,解決方法如下

解決方法:

I'd to change the authentication method at the mysql server:
set password for @ = old_password('');

將紅色那部分在cmd-mysql登錄之後敲進去就解決了

假如你的用戶名密碼是root root 那麼紅色部分就是

set password for root@localhost=old_password('root');

最後正確運行的輸出信息

 

  1. INFO - Hibernate 3.0.5
  2. INFO - hibernate.properties not found
  3. INFO - using CGLIB reflection optimizer
  4. INFO - using JDK 1.4 java.sql.Timestamp handling
  5. INFO - configuring from resource: /hibernate.cfg.xml
  6. INFO - Configuration resource: /hibernate.cfg.xml
  7. INFO - Mapping resource: com/demo/hibernate/beans/User.hbm.xml
  8. INFO - Mapping class: com.demo.hibernate.beans.User -> user
  9. INFO - Configured SessionFactory: null
  10. INFO - processing extends queue
  11. INFO - processing collection mappings
  12. INFO - processing association property references
  13. INFO - processing foreign key constraints
  14. INFO - Using Hibernate built-in connection pool (not for production use!)
  15. INFO - Hibernate connection pool size: 20
  16. INFO - autocommit mode: false
  17. INFO - using driver: org.gjt.mm.mysql.Driver at URL: jdbc:mysql://localhost:3306/demo
  18. INFO - connection properties: {user=root, password=****}
  19. INFO - RDBMS: MySQL, version: 5.5.17
  20. INFO - JDBC driver: Mark Matthews' MySQL Driver, version: 2.0.4
  21. INFO - Using dialect: org.hibernate.dialect.MySQLDialect
  22. INFO - Using default transaction strategy (direct JDBC transactions)
  23. INFO - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
  24. INFO - Automatic flush during beforeCompletion(): disabled
  25. INFO - Automatic session close at end of transaction: disabled
  26. INFO - Scrollable result sets: enabled
  27. INFO - JDBC3 getGeneratedKeys(): disabled
  28. INFO - Connection release mode: null
  29. INFO - Maximum outer join fetch depth: 2
  30. INFO - Default batch fetch size: 1
  31. INFO - Generate SQL with comments: disabled
  32. INFO - Order SQL updates by primary key: disabled
  33. INFO - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
  34. INFO - Using ASTQueryTranslatorFactory
  35. INFO - Query language substitutions: {}
  36. INFO - Second-level cache: enabled
  37. INFO - Query cache: disabled
  38. INFO - Cache provider: org.hibernate.cache.EhCacheProvider
  39. INFO - Optimize cache for minimal puts: disabled
  40. INFO - Structured second-level cache entries: disabled
  41. INFO - Statistics: disabled
  42. INFO - Deleted entity synthetic identifier rollback: disabled
  43. INFO - Default entity-mode: pojo
  44. INFO - building session factory
  45. WARN - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/eeeeeee/HibernateTest/WebRoot/WEB-INF/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
  46. INFO - Not binding factory to JNDI, no JNDI name configured
  47. INFO - Checking 0 named queries
  48. 驗證結果:true

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章