Spring, SpringMVC, Hibernate整合

前言:当前Web项目开发的框架主流应该非Spring+SpringMVC+Hibernate莫属,不管是工作还是学习中涉及框架技术,首先是要搭建一套运行环境,虽然网上框架整合的教程很多,但我还是输出此文,一是自己总结整理可巩固理解,二是可供有需要学习的同仁参考。本着负责人的态度,本文所有内容测试通过,运行环境为JDK8+Tomcat8,Spring4.3.9,Hibernate5.2.10.

本篇文章重点关注以下问题:

  • 框架配置文件的编写
  • 后台Controller、Service、Dao层编写
  • 在Dao层封装基本CRUD操作
  • 前台页面编写

备注:本文为简明扼要,只在代码中对关键之处进行说明,有关框架的具体使用细节,可查阅相关资料,当然,自认为代码中的说明已够详细。另外,所有配置都是基于注解的方式实现。

项目结构:

 

 

1. 配置文件

1.1 web.xml

      web.xml为web项目的入口,因此首先配置web.xml. 文件中配置的编码格式和session并不是必须的,但又是很常用的,所以就一并附上了。

Xml代码   收藏代码
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <web-app version=“3.1”   
  3.         xmlns=“http://xmlns.jcp.org/xml/ns/javaee”   
  4.         xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”   
  5.         xsi:schemaLocation=”http://xmlns.jcp.org/xml/ns/javaee  
  6.                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd”>  
  7.   
  8.     <!– 配置Spring初始化参数(配置文件位置). –>  
  9.     <context-param>  
  10.         <param-name>contextConfigLocation</param-name>  
  11.         <param-value>/WEB-INF/applicationContext.xml</param-value>  
  12.     </context-param>  
  13.     <!– 配置Spring监听器. –>  
  14.     <listener>  
  15.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  16.     </listener>  
  17.     <!– 配置SpringMVC –>  
  18.     <servlet>  
  19.         <servlet-name>springMVC</servlet-name>  
  20.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  21.         <init-param>  
  22.               <param-name>contextConfigLocation</param-name>  
  23.               <param-value>/WEB-INF/spring-mvc.xml</param-value>  
  24.         </init-param>  
  25.          <load-on-startup>1</load-on-startup>  
  26.     </servlet>  
  27.     <servlet-mapping>  
  28.         <servlet-name>springMVC</servlet-name>  
  29.         <url-pattern>*.action</url-pattern>  
  30.     </servlet-mapping>  
  31.       
  32.     <!– 配置编码格式. –>  
  33.     <filter>  
  34.         <filter-name>encodingFilter</filter-name>  
  35.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  36.         <init-param>  
  37.             <param-name>encoding</param-name>  
  38.             <param-value>UTF-8</param-value>  
  39.         </init-param>  
  40.         <init-param>  
  41.             <param-name>forceEncoding</param-name>  
  42.             <param-value>true</param-value>  
  43.         </init-param>  
  44.     </filter>  
  45.     <filter-mapping>  
  46.         <filter-name>encodingFilter</filter-name>  
  47.         <url-pattern>/*</url-pattern>  
  48.     </filter-mapping>  
  49.       
  50.     <!– 配置session –>  
  51.     <filter>  
  52.         <filter-name>openSession</filter-name>  
  53.         <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>  
  54.     </filter>  
  55.     <filter-mapping>  
  56.         <filter-name>openSession</filter-name>  
  57.         <url-pattern>/*</url-pattern>  
  58.     </filter-mapping>  
  59.       
  60.     <welcome-file-list>  
  61.         <welcome-file>login.jsp</welcome-file>  
  62.     </welcome-file-list>  
  63. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

    <!-- 配置Spring初始化参数(配置文件位置). -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <!-- 配置Spring监听器. -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 配置SpringMVC -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/spring-mvc.xml</param-value>
        </init-param>
         <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

    <!-- 配置编码格式. -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 配置session -->
    <filter>
        <filter-name>openSession</filter-name>
        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSession</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

  1.2 SpringMVC配置文件

Xml代码   收藏代码
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <beans  xmlns=“http://www.springframework.org/schema/beans”  
  3.         xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  4.         xmlns:context=“http://www.springframework.org/schema/context”  
  5.         xmlns:mvc=“http://www.springframework.org/schema/mvc”  
  6.         xsi:schemaLocation=”http://www.springframework.org/schema/beans   
  7.                             http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
  8.                             http://www.springframework.org/schema/context  
  9.                             http://www.springframework.org/schema/context/spring-context-4.3.xsd  
  10.                             http://www.springframework.org/schema/mvc  
  11.                             http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd”>  
  12.       
  13.     <!– 注解扫描包(SpringMVC只关注控制器类上的注解) –>  
  14.     <context:component-scan base-package=“com.wj.control” />  
  15.   
  16.     <!– 开启注解 –>  
  17.     <mvc:annotation-driven />  
  18.       
  19.     <!– 静态资源(js/image)的访问 –>  
  20.     <!– 针对SpringMVC拦截所有请求的情况下才需要配置,以防对静态资源的访问也被拦截. –>  
  21.     <!– <mvc:resources location=”/js/” mapping=”/js/**”/> –>  
  22.   
  23.     <!– 定义视图解析器(此处针对Jsp) –>  
  24.     <bean id=“viewResolver” class=“org.springframework.web.servlet.view.InternalResourceViewResolver”>  
  25.         <!– 所有URI的前缀. –>  
  26.         <property name=“prefix” value=“/jsp/”></property>  
  27.         <!– 所有URI的后缀. –>  
  28.         <property name=“suffix” value=“.jsp”></property>  
  29.     </bean>  
  30. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.3.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!-- 注解扫描包(SpringMVC只关注控制器类上的注解) -->
    <context:component-scan base-package="com.wj.control" />

    <!-- 开启注解 -->
    <mvc:annotation-driven />

    <!-- 静态资源(js/image)的访问 -->
    <!-- 针对SpringMVC拦截所有请求的情况下才需要配置,以防对静态资源的访问也被拦截. -->
    <!-- <mvc:resources location="/js/" mapping="/js/**"/> -->

    <!-- 定义视图解析器(此处针对Jsp) -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 所有URI的前缀. -->
        <property name="prefix" value="/jsp/"></property>
        <!-- 所有URI的后缀. -->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

 1.3 Spring配置文件

Xml代码   收藏代码
  1. <?xml version=“1.0” encoding=“UTF-8”?>  
  2. <beans  xmlns=“http://www.springframework.org/schema/beans”  
  3.         xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  4.         xmlns:context=“http://www.springframework.org/schema/context”  
  5.         xmlns:tx=“http://www.springframework.org/schema/tx”  
  6.         xmlns:mvc=“http://www.springframework.org/schema/mvc”  
  7.         xsi:schemaLocation=”http://www.springframework.org/schema/beans   
  8.                             http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
  9.                             http://www.springframework.org/schema/context  
  10.                             http://www.springframework.org/schema/context/spring-context-4.3.xsd  
  11.                             http://www.springframework.org/schema/tx  
  12.                             http://www.springframework.org/schema/tx/spring-tx-2.0.xsd”>  
  13.       
  14.     <!– 指定Spring需要扫描的包,需要Spring管理的Bean必须在此包里. –>  
  15.     <!– 当然,由SpringMVC已扫描的bean此处并不需要扫描.(可指明不需要哪些bean,此处未实现) –>  
  16.     <context:component-scan base-package=“com.wj” />  
  17.       
  18.     <!– 使用annotation定义事务 –>  
  19.     <tx:annotation-driven transaction-manager=“transactionManager” />  
  20.       
  21.     <!– 配置数据源 –>  
  22.     <bean id=“dataSource” class=“org.springframework.jdbc.datasource.DriverManagerDataSource” >  
  23.         <property name=“driverClassName” value=“com.mysql.jdbc.Driver”></property>  
  24.         <property name=“url” value=“jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf-8”></property>  
  25.         <property name=“username” value=“root”></property>  
  26.         <property name=“password” value=“root”></property>  
  27.     </bean>  
  28.       
  29.     <!– 配置SessionFactory –>  
  30.     <bean id=“sessionFactory” class=“org.springframework.orm.hibernate5.LocalSessionFactoryBean”>  
  31.         <property name=“dataSource” ref=“dataSource” />  
  32.         <property name=“hibernateProperties”>  
  33.             <props>  
  34.                 <!– 指定Hibernate的连接方言 –>  
  35.                 <prop key=“hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>  
  36.                 <!–是否根据Hiberante映射创建数据表 –>  
  37.                 <prop key=“hibernate.hbm2ddl.auto”>update</prop>  
  38.                 <prop key=“hibernate.show_sql”>true</prop>  
  39.                 <prop key=“hibernate.format_sql”>true</prop>  
  40.             </props>  
  41.         </property>  
  42.         <!– 指明与数据库表对应的实体类(这种特殊的类我更倾向在配置文件中指明,一目了然) –>  
  43.         <property name=“annotatedClasses”>  
  44.             <list>  
  45.                 <value>com.wj.entity.User</value>  
  46.             </list>  
  47.         </property>  
  48.     </bean>  
  49.       
  50.     <!– 配置一个事务管理器 –>  
  51.     <bean id=“transactionManager” class=“org.springframework.orm.hibernate5.HibernateTransactionManager”>  
  52.         <property name=“sessionFactory” ref=“sessionFactory”/>  
  53.     </bean>  
  54.       
  55. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.3.xsd
                            http://www.springframework.org/schema/tx
                            http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <!-- 指定Spring需要扫描的包,需要Spring管理的Bean必须在此包里. -->
    <!-- 当然,由SpringMVC已扫描的bean此处并不需要扫描.(可指明不需要哪些bean,此处未实现) -->
    <context:component-scan base-package="com.wj" />

    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=utf-8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

    <!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <!-- 指定Hibernate的连接方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <!--是否根据Hiberante映射创建数据表 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
        <!-- 指明与数据库表对应的实体类(这种特殊的类我更倾向在配置文件中指明,一目了然) -->
        <property name="annotatedClasses">
            <list>
                <value>com.wj.entity.User</value>
            </list>
        </property>
    </bean>

    <!-- 配置一个事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

</beans>

 2. 后台Controller、Service、Dao层编写

2.1 首先定义实体类

Java代码   收藏代码
  1. package com.wj.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”)  
  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 getId() {  
  28.         return id;  
  29.     }  
  30.   
  31.     public void setId(String id) {  
  32.         this.id = id;  
  33.     }  
  34.   
  35.     public String getUserName() {  
  36.         return userName;  
  37.     }  
  38.   
  39.     public void setUserName(String userName) {  
  40.         this.userName = userName;  
  41.     }  
  42.   
  43.     public String getAge() {  
  44.         return age;  
  45.     }  
  46.   
  47.     public void setAge(String age) {  
  48.         this.age = age;  
  49.     }  
  50.   
  51.     @Override  
  52.     public String toString() {  
  53.         return “User [id=” + id + “, userName=” + userName + “, age=” + age + “]”;  
  54.     }  
  55. }  
package com.wj.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="T_USER")
public class User {

    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name = "system-uuid",strategy="uuid")
    @Column(length=32)
    private String id;

    @Column(length=32)
    private String userName;

    @Column(length=32)
    private String age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", age=" + age + "]";
    }
}

2.2 Controller层

      Spring提倡的主题之一就是面向接口编程,但是Controller层我并未定义接口,因为Controller层我仅写了几个测试方法,实现CRUD,定义接口并没有太大意义。

Java代码   收藏代码
  1. package com.wj.control;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import org.springframework.beans.factory.annotation.Autowired;  
  11. import org.springframework.stereotype.Controller;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13.   
  14. import com.wj.entity.User;  
  15. import com.wj.service.IUserService;  
  16.   
  17. @Controller                     // 指明当前类是控制器  
  18. @RequestMapping(“/jsp/user”)    // 根路径  
  19. public class UserController {  
  20.   
  21.     @Autowired                  // 以类型的方式注入(Spring有多种方式实现自动注入,但按类型注入更简单清晰)  
  22.     private IUserService userService;  
  23.   
  24.     @RequestMapping(“/getAllUser.action”)  
  25.     public String getAllUser(HttpServletRequest request){  
  26.         List<User> userList = userService.getAllUser();  
  27.         request.setAttribute(”userList”, userList);  
  28.         return “user/index”;  
  29.     }  
  30.       
  31.     @RequestMapping(“/getUser.action”)  
  32.     public String getUser(String id,HttpServletRequest request){  
  33.         User user = userService.getUser(id);  
  34.         request.setAttribute(”user”, user);  
  35.         return “user/editUser”;  
  36.     }  
  37.       
  38.     @RequestMapping(“/toAddUser.action”)  
  39.     public String toAddUser(){  
  40.         return “user/addUser”;  
  41.     }  
  42.       
  43.     @RequestMapping(“/addUser.action”)  
  44.     public String addUser(User user,HttpServletRequest request){  
  45.         userService.addUser(user);  
  46.         return “redirect:/jsp/user/getAllUser.action”;  
  47.     }  
  48.       
  49.     @RequestMapping(“/delUser.action”)  
  50.     public void delUser(String id,HttpServletResponse response){  
  51.         String result = ”{\”result\”:\”error\”}”;  
  52.         if(userService.delUser(id)){  
  53.             result = ”{\”result\”:\”success\”}”;  
  54.         }  
  55.         response.setContentType(”application/json”);  
  56.           
  57.         try {  
  58.             PrintWriter out = response.getWriter();  
  59.             out.write(result);  
  60.         } catch (IOException e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.     }  
  64.       
  65.     @RequestMapping(“/updateUser”)  
  66.     public String updateUser(User user,HttpServletRequest request){  
  67.           
  68.         if(userService.updateUser(user)){  
  69.             user = userService.getUser(user.getId());  
  70.             request.setAttribute(”user”, user);  
  71.             return “redirect:/jsp/user/getAllUser.action”;  
  72.         }else{  
  73.             return “user/error”;  
  74.         }  
  75.     }  
  76. }  
package com.wj.control;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wj.entity.User;
import com.wj.service.IUserService;

@Controller                     // 指明当前类是控制器
@RequestMapping("/jsp/user")    // 根路径
public class UserController {

    @Autowired                  // 以类型的方式注入(Spring有多种方式实现自动注入,但按类型注入更简单清晰)
    private IUserService userService;

    @RequestMapping("/getAllUser.action")
    public String getAllUser(HttpServletRequest request){
        List<User> userList = userService.getAllUser();
        request.setAttribute("userList", userList);
        return "user/index";
    }

    @RequestMapping("/getUser.action")
    public String getUser(String id,HttpServletRequest request){
        User user = userService.getUser(id);
        request.setAttribute("user", user);
        return "user/editUser";
    }

    @RequestMapping("/toAddUser.action")
    public String toAddUser(){
        return "user/addUser";
    }

    @RequestMapping("/addUser.action")
    public String addUser(User user,HttpServletRequest request){
        userService.addUser(user);
        return "redirect:/jsp/user/getAllUser.action";
    }

    @RequestMapping("/delUser.action")
    public void delUser(String id,HttpServletResponse response){
        String result = "{\"result\":\"error\"}";
        if(userService.delUser(id)){
            result = "{\"result\":\"success\"}";
        }
        response.setContentType("application/json");

        try {
            PrintWriter out = response.getWriter();
            out.write(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping("/updateUser")
    public String updateUser(User user,HttpServletRequest request){

        if(userService.updateUser(user)){
            user = userService.getUser(user.getId());
            request.setAttribute("user", user);
            return "redirect:/jsp/user/getAllUser.action";
        }else{
            return "user/error";
        }
    }
}

 2.3 Service层

       先定义业务层的业务接口:

Java代码   收藏代码
  1. package com.wj.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.wj.entity.User;  
  6.   
  7. public interface IUserService {  
  8.   
  9.     /** 
  10.      * 根据id获取指定用户 
  11.      * @param id 
  12.      * @return 
  13.      */  
  14.     public User getUser(String id);  
  15.       
  16.     /** 
  17.      * 查询所有用户 
  18.      * @return 
  19.      */  
  20.     public List<User> getAllUser();  
  21.       
  22.     /** 
  23.      * 新增用户 
  24.      * @param user 
  25.      */  
  26.     public void addUser(User user);  
  27.       
  28.     /** 
  29.      * 根据id删除指定用户 
  30.      * @param id 
  31.      * @return 
  32.      */  
  33.     public boolean delUser(String id);  
  34.       
  35.     /** 
  36.      * 更新用户信息 
  37.      * @param user 
  38.      * @return 
  39.      */  
  40.     public boolean updateUser(User user);  
  41. }  
package com.wj.service;

import java.util.List;

import com.wj.entity.User;

public interface IUserService {

    /**
     * 根据id获取指定用户
     * @param id
     * @return
     */
    public User getUser(String id);

    /**
     * 查询所有用户
     * @return
     */
    public List<User> getAllUser();

    /**
     * 新增用户
     * @param user
     */
    public void addUser(User user);

    /**
     * 根据id删除指定用户
     * @param id
     * @return
     */
    public boolean delUser(String id);

    /**
     * 更新用户信息
     * @param user
     * @return
     */
    public boolean updateUser(User user);
}

        此样例中业务层并没有复杂业务,只是增删改查:

扫描二维码关注公众号,回复: 2681351 查看本文章
Java代码   收藏代码
  1. package com.wj.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Service;  
  7. import org.springframework.transaction.annotation.Transactional;  
  8.   
  9. import com.wj.dao.IUserDao;  
  10. import com.wj.entity.User;  
  11.   
  12. @Service  
  13. public class UserService implements IUserService {  
  14.   
  15.     @Autowired  
  16.     private IUserDao userDao;  
  17.       
  18.     @Override  
  19.     public User getUser(String id) {  
  20.         return userDao.getUser(id);  
  21.     }  
  22.   
  23.     @Override  
  24.     public List<User> getAllUser() {  
  25.         return userDao.getAllUser();  
  26.     }  
  27.   
  28.     @Override  
  29.     @Transactional  
  30.     public void addUser(User user) {  
  31.         userDao.addUser(user);  
  32.     }  
  33.   
  34.     @Override  
  35.     @Transactional  
  36.     public boolean delUser(String id) {  
  37.         return userDao.delUser(id);  
  38.     }  
  39.   
  40.     @Override  
  41.     @Transactional  
  42.     public boolean updateUser(User user) {  
  43.         return userDao.updateUser(user);  
  44.     }  
  45.   
  46. }  
package com.wj.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.wj.dao.IUserDao;
import com.wj.entity.User;

@Service
public class UserService implements IUserService {

    @Autowired
    private IUserDao userDao;

    @Override
    public User getUser(String id) {
        return userDao.getUser(id);
    }

    @Override
    public List<User> getAllUser() {
        return userDao.getAllUser();
    }

    @Override
    @Transactional
    public void addUser(User user) {
        userDao.addUser(user);
    }

    @Override
    @Transactional
    public boolean delUser(String id) {
        return userDao.delUser(id);
    }

    @Override
    @Transactional
    public boolean updateUser(User user) {
        return userDao.updateUser(user);
    }

}

 2.4 Dao层

       首先定义接口:

Java代码   收藏代码
  1. package com.wj.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.wj.entity.User;  
  6.   
  7. public interface IUserDao {  
  8.   
  9.     public User getUser(String id);  
  10.       
  11.     public List<User> getAllUser();  
  12.       
  13.     public void addUser(User user);  
  14.       
  15.     public boolean delUser(String id);  
  16.       
  17.     public boolean updateUser(User user);  
  18. }  
package com.wj.dao;

import java.util.List;

import com.wj.entity.User;

public interface IUserDao {

    public User getUser(String id);

    public List<User> getAllUser();

    public void addUser(User user);

    public boolean delUser(String id);

    public boolean updateUser(User user);
}

        再贴上Dao层的实现:

Java代码   收藏代码
  1. package com.wj.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.stereotype.Repository;  
  6.   
  7. import com.wj.entity.User;  
  8.   
  9. @Repository  
  10. public class UserDao extends BaseDao<User> implements IUserDao {  
  11.   
  12.     @Override  
  13.     public User getUser(String id) {  
  14.         return get(User.class, id);  
  15.     }  
  16.   
  17.     @Override  
  18.     public List<User> getAllUser() {  
  19.         return findAll(User.class);  
  20.     }  
  21.   
  22.     @Override  
  23.     public void addUser(User user) {  
  24.         save(user);  
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean delUser(String id) {  
  29.         return delete(User.class, id);  
  30.     }  
  31.   
  32.     @Override  
  33.     public boolean updateUser(User user) {  
  34.         update(user);  
  35.         return true;  
  36.           
  37. //        String hql = “update User u set u.userName = ?0,u.age=?1 where u.id = ?2”;  
  38.           
  39. //        Query<User> query = sessionFactory.getCurrentSession().createQuery(hql);  
  40. //        query.setParameter(0, user.getUserName());  
  41. //        query.setParameter(1, user.getAge());  
  42. //        query.setParameter(2, user.getId());  
  43. //          
  44. //        return (query.executeUpdate() > 0);  
  45.     }  
  46. }  
package com.wj.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.wj.entity.User;

@Repository
public class UserDao extends BaseDao<User> implements IUserDao {

    @Override
    public User getUser(String id) {
        return get(User.class, id);
    }

    @Override
    public List<User> getAllUser() {
        return findAll(User.class);
    }

    @Override
    public void addUser(User user) {
        save(user);
    }

    @Override
    public boolean delUser(String id) {
        return delete(User.class, id);
    }

    @Override
    public boolean updateUser(User user) {
        update(user);
        return true;

//        String hql = "update User u set u.userName = ?0,u.age=?1 where u.id = ?2";

//        Query<User> query = sessionFactory.getCurrentSession().createQuery(hql);
//        query.setParameter(0, user.getUserName());
//        query.setParameter(1, user.getAge());
//        query.setParameter(2, user.getId());
//        
//        return (query.executeUpdate() > 0);
    }
}

       仔细观察Dao层,发现CRUD操作都是基于BaseDao提供的API进行的,显得相当简便,下面贴上BaseDao的实现。

3. 在Dao层封装基本CRUD操作

      首先定义CRUD操作的接口,为适配各实体类,此处引入泛型:

Java代码   收藏代码
  1. package com.wj.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. public interface IBaseDao<T> {  
  7.       
  8.     /** 
  9.      * 根据ID加载实体 
  10.      * @param entityClazz 
  11.      * @param id 
  12.      * @return 
  13.      */  
  14.     T get(Class<T> entityClazz , Serializable id);  
  15.       
  16.     /** 
  17.      * 保存实体 
  18.      * @param entity 
  19.      * @return 
  20.      */  
  21.     Serializable save(T entity);  
  22.       
  23.     /** 
  24.      * 更新实体 
  25.      * @param entity 
  26.      */  
  27.     void update(T entity);  
  28.       
  29.     /** 
  30.      * 删除实体 
  31.      * @param entity 
  32.      */  
  33.     void delete(T entity);  
  34.       
  35.     /** 
  36.      * 根据ID删除实体 
  37.      * @param entityClazz 
  38.      * @param id 
  39.      */  
  40.     boolean delete(Class<T> entityClazz , Serializable id);  
  41.       
  42.     /** 
  43.      * 获取所有实体 
  44.      * @param entityClazz 
  45.      * @return 
  46.      */  
  47.     List<T> findAll(Class<T> entityClazz);  
  48.       
  49.     /** 
  50.      * 获取实体总数 
  51.      * @param entityClazz 
  52.      * @return 
  53.      */  
  54.     long findCount(Class<T> entityClazz);  
  55.       
  56. }  
package com.wj.dao;

import java.io.Serializable;
import java.util.List;

public interface IBaseDao<T> {

    /**
     * 根据ID加载实体
     * @param entityClazz
     * @param id
     * @return
     */
    T get(Class<T> entityClazz , Serializable id);

    /**
     * 保存实体
     * @param entity
     * @return
     */
    Serializable save(T entity);

    /**
     * 更新实体
     * @param entity
     */
    void update(T entity);

    /**
     * 删除实体
     * @param entity
     */
    void delete(T entity);

    /**
     * 根据ID删除实体
     * @param entityClazz
     * @param id
     */
    boolean delete(Class<T> entityClazz , Serializable id);

    /**
     * 获取所有实体
     * @param entityClazz
     * @return
     */
    List<T> findAll(Class<T> entityClazz);

    /**
     * 获取实体总数
     * @param entityClazz
     * @return
     */
    long findCount(Class<T> entityClazz);

}

       CRUD的具体实现如下:

Java代码   收藏代码
  1. package com.wj.dao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. import org.hibernate.SessionFactory;  
  7. import org.hibernate.query.Query;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9.   
  10. public class BaseDao<T> implements IBaseDao<T> {  
  11.   
  12.     @Autowired  
  13.     protected SessionFactory sessionFactory;  
  14.       
  15.     @Override  
  16.     public T get(Class<T> entityClazz, Serializable id) {  
  17.         return sessionFactory.getCurrentSession().get(entityClazz, id);  
  18.     }  
  19.   
  20.     @Override  
  21.     public Serializable save(T entity) {  
  22.         return sessionFactory.getCurrentSession().save(entity);  
  23.     }  
  24.   
  25.     @Override  
  26.     public void update(T entity) {  
  27.         sessionFactory.getCurrentSession().saveOrUpdate(entity);  
  28.     }  
  29.   
  30.     @Override  
  31.     public void delete(T entity) {  
  32.         sessionFactory.getCurrentSession().delete(entity);  
  33.     }  
  34.   
  35.     @Override  
  36.     @SuppressWarnings(“unchecked”)  
  37.     public boolean delete(Class<T> entityClazz, Serializable id) {  
  38.         String hql = ”delete ” + entityClazz.getSimpleName() + “ en where en.id = ?0”;  
  39.         Query<T> query = sessionFactory.getCurrentSession()  
  40.                                  .createQuery(hql)  
  41.                                  .setParameter(”0”, id);  
  42.         return (query.executeUpdate() > 0);  
  43.     }  
  44.   
  45.     @Override  
  46.     public List<T> findAll(Class<T> entityClazz) {  
  47.         String hql = ”select en from ” + entityClazz.getSimpleName() + “ en”;  
  48.         return find(hql);  
  49.     }  
  50.   
  51.     @Override  
  52.     public long findCount(Class<T> entityClazz) {  
  53.         String  hql  = ”select count(*) from ” + entityClazz.getSimpleName();  
  54.         List<T> list = find(hql);  
  55.         if (list != null && list.size() == 1) {  
  56.             return (Long) list.get(0);  
  57.         }  
  58.         return 0;  
  59.     }  
  60.   
  61.     /** 
  62.      * 根据HQL语句查询实体 
  63.      * @param hql           待查询的HQL语句 
  64.      * @return 
  65.      */  
  66.     @SuppressWarnings(“unchecked”)  
  67.     protected List<T> find(String hql) {  
  68.         return sessionFactory.getCurrentSession()  
  69.                              .createQuery(hql)  
  70.                              .list();  
  71.     }  
  72.       
  73.     /** 
  74.      * 根据带占位符参数HQL语句查询实体 
  75.      * @param hql           待查询的HQL语句 
  76.      * @param params        参数 
  77.      * @return 
  78.      */  
  79.     @SuppressWarnings(“unchecked”)  
  80.     protected List<T> find(String hql, Object… params) {  
  81.         Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);  
  82.           
  83.         for (int i=0, len=params.length; i<len; i++) {  
  84.             query.setParameter(i + ”“, params[i]);  
  85.         }  
  86.         return query.list();  
  87.     }  
  88.       
  89.     /** 
  90.      * 使用hql 语句进行分页查询操作 
  91.      * @param hql       需要查询的hql语句 
  92.      * @param pageNo    查询第pageNo页的记录 
  93.      * @param pageSize  每页需要显示的记录数 
  94.      * @return          当前页的所有记录 
  95.      */  
  96.     @SuppressWarnings(“unchecked”)  
  97.     protected List<T> findByPage(String hql, int pageNo, int pageSize) {  
  98.         Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);  
  99.         return query.setFirstResult((pageNo-1) * pageSize)  
  100.                     .setMaxResults(pageSize)  
  101.                     .list();  
  102.     }  
  103.       
  104.     /** 
  105.      * 使用hql 语句进行分页查询操作 
  106.      * @param hql       需要查询的hql语句 
  107.      * @param pageNo    查询第pageNo页的记录 
  108.      * @param pageSize  每页需要显示的记录数 
  109.      * @param params    如果hql带占位符参数,params用于传入占位符参数 
  110.      * @return          当前页的所有记录 
  111.      */  
  112.     @SuppressWarnings(“unchecked”)  
  113.     protected List<T> findByPage(String hql , int pageNo, int pageSize, Object… params) {  
  114.         Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);  
  115.         for (int i=0, len=params.length; i<len; i++) {  
  116.             query.setParameter(i + ”“, params[i]);  
  117.         }  
  118.         return query.setFirstResult((pageNo - 1) + pageSize)  
  119.                     .setMaxResults(pageSize)  
  120.                     .list();  
  121.     }  
  122. }  
package com.wj.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;

public class BaseDao<T> implements IBaseDao<T> {

    @Autowired
    protected SessionFactory sessionFactory;

    @Override
    public T get(Class<T> entityClazz, Serializable id) {
        return sessionFactory.getCurrentSession().get(entityClazz, id);
    }

    @Override
    public Serializable save(T entity) {
        return sessionFactory.getCurrentSession().save(entity);
    }

    @Override
    public void update(T entity) {
        sessionFactory.getCurrentSession().saveOrUpdate(entity);
    }

    @Override
    public void delete(T entity) {
        sessionFactory.getCurrentSession().delete(entity);
    }

    @Override
    @SuppressWarnings("unchecked")
    public boolean delete(Class<T> entityClazz, Serializable id) {
        String hql = "delete " + entityClazz.getSimpleName() + " en where en.id = ?0";
        Query<T> query = sessionFactory.getCurrentSession()
                                 .createQuery(hql)
                                 .setParameter("0", id);
        return (query.executeUpdate() > 0);
    }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        String hql = "select en from " + entityClazz.getSimpleName() + " en";
        return find(hql);
    }

    @Override
    public long findCount(Class<T> entityClazz) {
        String  hql  = "select count(*) from " + entityClazz.getSimpleName();
        List<T> list = find(hql);
        if (list != null && list.size() == 1) {
            return (Long) list.get(0);
        }
        return 0;
    }

    /**
     * 根据HQL语句查询实体
     * @param hql           待查询的HQL语句
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String hql) {
        return sessionFactory.getCurrentSession()
                             .createQuery(hql)
                             .list();
    }

    /**
     * 根据带占位符参数HQL语句查询实体
     * @param hql           待查询的HQL语句
     * @param params        参数
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String hql, Object... params) {
        Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);

        for (int i=0, len=params.length; i<len; i++) {
            query.setParameter(i + "", params[i]);
        }
        return query.list();
    }

    /**
     * 使用hql 语句进行分页查询操作
     * @param hql       需要查询的hql语句
     * @param pageNo    查询第pageNo页的记录
     * @param pageSize  每页需要显示的记录数
     * @return          当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String hql, int pageNo, int pageSize) {
        Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);
        return query.setFirstResult((pageNo-1) * pageSize)
                    .setMaxResults(pageSize)
                    .list();
    }

    /**
     * 使用hql 语句进行分页查询操作
     * @param hql       需要查询的hql语句
     * @param pageNo    查询第pageNo页的记录
     * @param pageSize  每页需要显示的记录数
     * @param params    如果hql带占位符参数,params用于传入占位符参数
     * @return          当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String hql , int pageNo, int pageSize, Object... params) {
        Query<T> query = sessionFactory.getCurrentSession().createQuery(hql);
        for (int i=0, len=params.length; i<len; i++) {
            query.setParameter(i + "", params[i]);
        }
        return query.setFirstResult((pageNo - 1) + pageSize)
                    .setMaxResults(pageSize)
                    .list();
    }
}

 4. 前台页面编写

       本文重在展示框架的整合,前台测试代码此处就不贴了,有兴趣的可下载附件中的zip包。

完整项目下载链接:http://pan.baidu.com/s/1qY8vWTI 密码:grx7

猜你喜欢

转载自blog.csdn.net/chenyunqiang/article/details/81476010