天天看點

J2EE開發 spring+springMVC+hibernate 三大架構整合

  首先我們要知道Hibernate五大對象:,本執行個體通過深入的使用這五大對象和spring+springMVC互相結合,體會到架構的好處,提高我們的開發效率

         Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration 。這五個接口構成了Hibernate運作的基本要素,可以執行存取,持久化,事務管理等操作。這五個接口可以位于系統的業務邏輯層和持久化層。下面是一張Hibernate的關系圖:

J2EE開發 spring+springMVC+hibernate 三大架構整合

Session接口:

       Session接口 Session 接口對于Hibernate 開發人員來說是一個最重要的接口。然而在Hibernate中,執行個體化的Session是一個輕量級的類,建立和銷毀它都不會占用很多資源。這在實際項目中确實很重要,因為在客戶程式中,可能會不斷地建立以及銷毀Session對象,如果Session 的開銷太大,會給系統帶來不良影響。但是Session對象是非線程安全的,是以在你的設計中,最好是一個線程隻建立一個Session對象。 session可以看作介于資料連接配接與事務管理一種中間接口。我們可以将session想象成一個持久對象的緩沖區,Hibernate能檢測到這些持久對象的改變,并及時重新整理資料庫。我們有時也稱Session是一個持久層管理器,因為它包含這一些持久層相關的操作, 諸如存儲持久對象至資料庫,以及從資料庫從獲得它們。需要注意的是,Hibernate的session不同于JSP 應用中的HttpSession。當我們使用session這個術語時,我們指的Hibernate 中的session,而我們以後會将HttpSesion 對象稱為使用者session。

SessionFactory接口:

       SessionFactroy接口負責初始化Hibernate。它充當資料存儲源的代理,并負責建立Session對象。這裡用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常隻需要一個SessionFactory就夠,當需要操作多個資料庫時,可以為每個資料庫指定一個SessionFactory。

Transaction接口

        Transaction接口負責事務相關的操作,一般在Hibernate的增删改中出現,但是使用Hibernate的人一般使用Spring去管理事務。

Query接口

Query負責執行各種資料庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。它的傳回值一般是List。需要自己轉換。

Configuration接口:

       Configuration對象用于配置并根啟動Hibernate。Hibernate應用通過Configuration執行個體來指定對象—關系映射檔案的位置或者動态配置Hibernate的屬性,然後建立SessionFactory執行個體。我們可以檢視Configuration的源代碼,它的configure()方法是這樣實作的:

了解了這五大對象之後,,以上部落格我們配置好了spring+springMVC的環境,現在我們繼續內建hibernate的相關配置,架構圖如下:

J2EE開發 spring+springMVC+hibernate 三大架構整合

第一步:引入相關的包

            (對于每個包,我們要有意識的去了解其功能,這樣今後的時候項目中報錯之後我們也可以及時知道錯誤出在哪裡?)

J2EE開發 spring+springMVC+hibernate 三大架構整合

第二:   繼續配置hibernatexml檔案( springAnnotation-hibernate.xml)

[html] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [  
  3. <!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">  
  4. ]>  
  5. <beans>  
  6. <!-- 配置hibernate相關資料庫的操作 -->  
  7.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  8.     <!-- 資料庫的驅動 -->  
  9.         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  10.         <!-- 資料庫的Id,使用者名與密碼 -->  
  11.         <property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>  
  12.         <property name="username" value="lishehe"/>  
  13.         <property name="password" value="lishehe"/>  
  14.     </bean>  
  15.     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
  16.         <property name="dataSource" ref="dataSource"/>  
  17.         <property name="hibernateProperties">  
  18.             <props>  
  19.             <!-- 配置不同資料庫的方言 -->  
  20.                 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>  
  21.                 <!-- 其實這個參數的作用主要用于:自動建立|更新|驗證資料庫表結構。如果不是此方面的需求建議set value="none".  
  22. 其它幾個參數的意思,我解釋一下:  
  23.  validate               加載hibernate時,驗證建立資料庫表結構  
  24.  create                  每次加載hibernate,重新建立資料庫表結構,這就是導緻資料庫表資料丢失的原因。  
  25.  create-drop        加載hibernate時建立,退出是删除表結構  
  26.  update                 加載hibernate自動更新資料庫結構 -->  
  27.                 <prop key="hibernate.hbm2ddl.auto">update</prop>   
  28.                 <!-- 是否顯示sql語句 -->  
  29.                 <prop key="hibernate.show_sql">true</prop>  
  30.                 <prop key="hiberante.format_sql">true</prop>  
  31.             </props>  
  32.         </property>  
  33.         <property name="configLocations">  
  34.             <list>  
  35.                 <value>  
  36.                 <!-- 讀取和實體相關的xml -->  
  37.                     classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml  
  38.                 </value>  
  39.             </list>  
  40.         </property>  
  41.     </bean>  
  42.      <!-- 定義事務管理器(聲明式的事務) -->    
  43.     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
  44.         <property name="sessionFactory" ref="sessionFactory"></property>  
  45.     </bean>  
  46.     <bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">  
  47.          <!-- 配置事務管理器 -->    
  48.         <property name="transactionManager" ref="transactionManager"></property>  
  49.          <!-- 配置事務管理器 -->    
  50.         <property name="transactionAttributes">  
  51.             <props>  
  52.     <!-- 下面就開始配置各個子產品所必須的部分,在各自的applicationContext-XXX-beans.xml配置的對于事務管理的詳細資訊。  
  53. 首先就是配置事務的傳播特性,如下: -->  
  54. <!--  配置事務傳播特性 -->  
  55.                 <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>  
  56.                 <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>  
  57.                 <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>  
  58.                 <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>  
  59.                 <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>  
  60.                 <prop key="get*">PROPAGATION_NEVER</prop>  
  61.             </props>  
  62.         </property>  
  63.     </bean>  
  64. </beans>  
  65. </span></span></span>  

第三:   建立IUserDAO

[java] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;  
  2. import java.util.List;  
  3. import com.tgb.web.controller.entity.User;  
  4. public interface IUserDAO {  
  5.     public void addUser(User user);  
  6.     public List<User> getAllUser();  
  7.     public boolean delUser(String id);  
  8.     public User getUser(String id);  
  9.     public boolean updateUser(User user);  
  10. }  
  11. </span></span>  

                  實作類UserDAo [java] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;  
  2. import java.util.List;  
  3. import org.hibernate.Query;  
  4. import org.hibernate.SessionFactory;  
  5. import com.tgb.web.controller.entity.User;  
  6. public class UserDAO implements IUserDAO  {  
  7.     private SessionFactory sessionFactory;  
  8.     public void setSessionFactory(SessionFactory sessionFactory) {  
  9.         this.sessionFactory = sessionFactory;  
  10.     }  
  11.     @Override  
  12.     public void addUser(User user) {//添加使用者  
  13.         sessionFactory.getCurrentSession().save(user);  
  14.     }  
  15.     @Override  
  16.         public List<User> getAllUser() {//查找所有使用者資訊  
  17.         String hql = "from User";  
  18.         Query query = sessionFactory.getCurrentSession().createQuery(hql);  
  19.         return query.list();  
  20.     }  
  21.     @Override  
  22.     public boolean delUser(String id) {//删除使用者  
  23.         String hql = "delete User u where u.id=?";  
  24.         Query query = sessionFactory.getCurrentSession().createQuery(hql);  
  25.         query.setString(0, id);  
  26.         return (query.executeUpdate() > 0);  
  27.     }  
  28.     @Override  
  29.     public User getUser(String id) {//根據id得到單個使用者  
  30.         String hql = "from User u where u.id=?";  
  31.         Query query = sessionFactory.getCurrentSession().createQuery(hql);//此時使用的是hql語句  
  32.         query.setString(0, id);  
  33.         return (User) query.uniqueResult();  
  34.     }  
  35.     @Override  
  36.     public boolean updateUser(User user) {//修改使用者資訊,hql語句  
  37.         String hql = "update User u set u.userName=?,u.age=? where u.id=?";  
  38.         Query query = sessionFactory.getCurrentSession().createQuery(hql);  
  39.         query.setString(0, user.getUserName());  
  40.         query.setString(1, user.getAge());  
  41.         query.setString(2, user.getId());  
  42.         return (query.executeUpdate() > 0);  
  43.     }  
  44. }  
  45. </span></span>  

第四:  建立實體User [java] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.entity;  
  2. import javax.persistence.Column;  
  3. import javax.persistence.Entity;  
  4. import javax.persistence.GeneratedValue;  
  5. import javax.persistence.Id;  
  6. import javax.persistence.Table;  
  7. import org.hibernate.annotations.GenericGenerator;  
  8. @Entity  
  9. @Table(name="T_USER")  
  10. public class User {  
  11.     @Id  
  12.     @GeneratedValue(generator = "system-uuid")  //使用uuid生成主鍵的方式  
  13.     @GenericGenerator(name = "system-uuid", strategy = "uuid")   
  14.     @Column(length=32)  
  15.     private String id;  
  16.     @Column(length=32)  
  17.     private String userName;  
  18.     @Column(length=32)  
  19.     private String age;  
  20.     public String getUserName() {  
  21.         return userName;  
  22.     }  
  23.     public void setUserName(String userName) {  
  24.         this.userName = userName;  
  25.     }  
  26.     public String getAge() {  
  27.         return age;  
  28.     }  
  29.     public void setAge(String age) {  
  30.         this.age = age;  
  31.     }  
  32.     public String getId() {  
  33.         return id;  
  34.     }  
  35.     public void setId(String id) {  
  36.         this.id = id;  
  37.     }  
  38. }  
  39. </span></span>  

                  通常是 hibernate.cfg.xml)中聲明持久性類 hibernate.cfg.test.xml [html] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC  
  2.         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
  3.         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  4. <!-- (通常是 hibernate.cfg.xml)中聲明持久性類: -->  
  5. <hibernate-configuration>  
  6.     <session-factory>  
  7.         <mapping class="com.tgb.web.controller.entity.User"/>  
  8.     </session-factory>  
  9. </hibernate-configuration></span></span>  

第五 : IUserManager

[java] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;  
  2. import java.util.List;  
  3. import com.tgb.web.controller.entity.User;  
  4. public interface IUserManager {  
  5.     public void addUser(User user);  
  6.     public List<User> getAllUser();  
  7.     public boolean delUser(String id);  
  8.     public User getUser(String id);  
  9.     public boolean updateUser(User user);  
  10. }  
  11. </span></span>  

             UserManager實作類

[java] view plain copy print ?

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;  
  2. import java.util.List;  
  3. import com.tgb.web.controller.dao.IUserDAO;  
  4. import com.tgb.web.controller.entity.User;  
  5. public class UserManager implements IUserManager {  
  6.     private IUserDAO userDao;  
  7.     public void setUserDao(IUserDAO userDao) {  
  8.         this.userDao = userDao;  
  9.     }  
  10.     @Override  
  11.     public void addUser(User user) {  
  12.         userDao.addUser(user);  
  13.     }  
  14.     @Override  
  15.     public List<User> getAllUser() {  
  16.         return userDao.getAllUser();  
  17.     }  
  18.     @Override  
  19.     public boolean delUser(String id) {  
  20.         return userDao.delUser(id);  
  21.     }  
  22.     @Override  
  23.     public User getUser(String id) {  
  24.         return userDao.getUser(id);  
  25.     }  
  26.     @Override  
  27.     public boolean updateUser(User user) {  
  28.         return userDao.updateUser(user);  
  29.     }  
  30. }  
  31. </span></span>  

第六   UserController,控制類

[java] view plain copy print ?

  1. <span style="font-size:18px;">package com.tgb.web.controller;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import java.util.List;  
  5. import javax.annotation.Resource;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.web.bind.annotation.RequestMapping;  
  10. import com.tgb.web.controller.entity.User;  
  11. import com.tgb.web.controller.service.IUserManager;  
  12. @Controller  
  13. @RequestMapping("/user")  
  14. public class UserController {  
  15.     @Resource(name="userManager")// 擷取spring配置檔案中bean的id為userManager的,并注入   
  16.     private IUserManager userManager;  
  17.     @RequestMapping("/toAddUser")  
  18.     public String toAddUser(){  
  19.         return "/addUser";  
  20.     }  
  21.     @RequestMapping("/addUser")// 請求url位址映射,類似Struts的action-mapping   
  22.     public String addUser(User user){  
  23.         userManager.addUser(user);  
  24.         return "redirect:/user/getAllUser";  
  25.     }  
  26.     @RequestMapping("/getAllUser")  
  27.     public String getAllUser(HttpServletRequest request){  
  28.         List<User> user = userManager.getAllUser();  
  29.         request.setAttribute("user", user);  
  30.         return "/userManager";  
  31.     }  
  32.     @RequestMapping("/delUser")  
  33.     public void delUser(String id,HttpServletResponse response){  
  34.         String result = "{\"result\":\"error\"}";  
  35.         if(userManager.delUser(id)){  
  36.             result = "{\"result\":\"success\"}";  
  37.         }  
  38.         PrintWriter out = null;  
  39.         response.setContentType("application/json");  
  40.         try {  
  41.             out = response.getWriter();  
  42.             out.write(result);  
  43.         } catch (IOException e) {  
  44.             e.printStackTrace();  
  45.         }  
  46.     }  
  47.     @RequestMapping("/getUser")  
  48.     public String getUser(String id,HttpServletRequest request){  
  49.         User user = userManager.getUser(id);  
  50.         request.setAttribute("user", user);  
  51.         return "/editUser";  
  52.     }  
  53.     @RequestMapping("/updateUser")  
  54.     public String updateUser(User user,HttpServletRequest request){  
  55.         if(userManager.updateUser(user)){  
  56.             user = userManager.getUser(user.getId());  
  57.             request.setAttribute("user", user);  
  58.             return "/editUser";  
  59.         }else{  
  60.             return "/error";  
  61.         }  
  62.     }  
  63. }  
  64. </span>  

第七:前台頁面(詳細内容不再詳列出,源碼分享給大家)

J2EE開發 spring+springMVC+hibernate 三大架構整合

運作效果

:

J2EE開發 spring+springMVC+hibernate 三大架構整合
J2EE開發 spring+springMVC+hibernate 三大架構整合

總結

       這個過程雖然簡單,但是自己操作的過程中還是出現了很多的問題,解決問題,快速成長,進一步驗證了一句話:實踐是檢驗真理的唯一标準!

源碼下載下傳

原文連結 http://blog.csdn.net/lishehe/article/details/38356261