zoukankan      html  css  js  c++  java
  • spring+springMVC+hibernate整合

    首先我们要知道hibernate五大对象:,本实例通过深入的使用这五大对象和spring+springMVC相互结合,体会到框架的好处,提高我们的开发效率

             Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration 。这五个接口构成了Hibernate运行的基本要素,可以执行存取,持久化,事务管理等操作。这五个接口可以位于系统的业务逻辑层和持久化层。下面是一张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对象用于配置并根启动HibernateHibernate应用通过Configuration实例来指定对象关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。我们可以查看Configuration的源代码,它的configure()方法是这样实现的:



    了解了这五大对象之后,,以上博客我们配置好了spring+springMVC的环境,现在我们继续集成hibernate的相关配置,框架图如下:



    第一步:引入相关的包

                (对于每个包,我们要有意识的去了解其功能,这样今后的时候项目中报错之后我们也可以及时知道错误出在哪里?)





    第二:   继续配置hibernatexml文件( springAnnotation-hibernate.xml)


    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.   
    6. <beans>  
    7. <!-- 配置hibernate相关数据库的操作 -->  
    8.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    9.     <!-- 数据库的驱动 -->  
    10.         <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
    11.         <!-- 数据库的Id,用户名与密码 -->  
    12.         <property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>  
    13.         <property name="username" value="lishehe"/>  
    14.         <property name="password" value="lishehe"/>  
    15.     </bean>  
    16.       
    17.     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
    18.         <property name="dataSource" ref="dataSource"/>  
    19.         <property name="hibernateProperties">  
    20.             <props>  
    21.             <!-- 配置不同数据库的方言 -->  
    22.                 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>  
    23.                 <!-- 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".  
    24. 其它几个参数的意思,我解释一下:  
    25.  validate               加载hibernate时,验证创建数据库表结构  
    26.  create                  每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。  
    27.  create-drop        加载hibernate时创建,退出是删除表结构  
    28.  update                 加载hibernate自动更新数据库结构 -->  
    29.                 <prop key="hibernate.hbm2ddl.auto">update</prop>   
    30.                 <!-- 是否显示sql语句 -->  
    31.                 <prop key="hibernate.show_sql">true</prop>  
    32.                 <prop key="hiberante.format_sql">true</prop>  
    33.             </props>  
    34.         </property>  
    35.         <property name="configLocations">  
    36.             <list>  
    37.                 <value>  
    38.                 <!-- 读取和实体相关的xml -->  
    39.                     classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml  
    40.                 </value>  
    41.             </list>  
    42.         </property>  
    43.     </bean>  
    44.      <!-- 定义事务管理器(声明式的事务) -->    
    45.     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
    46.         <property name="sessionFactory" ref="sessionFactory"></property>  
    47.     </bean>  
    48.       
    49.     <bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">  
    50.          <!-- 配置事务管理器 -->    
    51.         <property name="transactionManager" ref="transactionManager"></property>  
    52.          <!-- 配置事务管理器 -->    
    53.         <property name="transactionAttributes">  
    54.             <props>  
    55.               
    56.               
    57.     <!-- 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。  
    58.   
    59. 首先就是配置事务的传播特性,如下: -->  
    60.   
    61. <!--  配置事务传播特性 -->  
    62.               
    63.                 <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>  
    64.                 <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>  
    65.                 <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>  
    66.                 <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>  
    67.                 <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>  
    68.                 <prop key="get*">PROPAGATION_NEVER</prop>  
    69.             </props>  
    70.         </property>  
    71.     </bean>  
    72.       
    73.       
    74. </beans>  
    75. </span></span></span>  



    第三:   新建IUserDAO

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


                      实现类UserDAo

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


    第四:  新建实体User

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


                      通常是 hibernate.cfg.xml)中声明持久性类 hibernate.cfg.test.xml

    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

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


                 UserManager实现类

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



    第六   UserController,控制类


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



    第七:前台页面(详细内容不再详列出,源码分享给大家)




    运行效果

    :



    总结


           这个过程虽然简单,但是自己操作的过程中还是出现了很多的问题,解决问题,快速成长,进一步验证了一句话:实践是检验真理的唯一标准!

    转自 http://blog.csdn.net/lishehe/article/details/38356261

    源码下载 http://download.csdn.net/detail/lishehe/7708997

    源码下载 https://pan.baidu.com/s/1kVeDlcV

  • 相关阅读:
    RN8209校正软件开发心得(1)
    Chrome 31版本导出Excel问题
    ComBox选择
    网页设计的一般步骤
    .NET一套开发工具
    关于用sql语句实现一串数字位数不足在左侧补0的技巧
    python jieba模块详解
    python内置函数详细描述与实例演示
    Markdown的基本语法记录
    python configparser模块详解
  • 原文地址:https://www.cnblogs.com/tiancai/p/6727809.html
Copyright © 2011-2022 走看看