• Spring4 MVC Hibernate4集成 Annotation


    一、本文所用环境

    二、工程目录

    三、Maven添加依赖

    四、新建数据库表

    五、配置文件

    六、Model层

    七、DAO层

     八、Service层

    九、JSP页面和Controller

    十、运行结果

    已经充分封装DAO层和Service层

    一、    本文所用环境

    Spring4.0.3.RELEASE、Hibernate4.3.5.Final、Mysql

    二、    工程目录

     

    三、    Maven添加依赖

    用Maven创建项目,pom.xml如下: 

     View Code

    四、    新建数据库表

    数据库采用Mysql,新建user表,我们演示操作此表对user进行增删改查

    复制代码
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `age` int(11) DEFAULT NULL,
      `nice_name` varchar(32) DEFAULT NULL,
      `name` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
    复制代码

    在model层下,创建Entity类Users.java见下

    复制代码
    package com.lei.demo.model;
    
    import java.io.Serializable;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity(name="User")
    public class User implements Serializable {
        
        private static final long serialVersionUID = 1L;
    
        public User(){
            super();
        }
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="id")
        private Long id;
        
        @Column(name="name",length=32)
        private String name;
        
        @Column(name="age")
        private Integer age;
        
        @Column(name="nice_name",length=32)
        private String nice_name;
    
        @Override
        public String toString() {
            return "User [id=" + id + ", user_name=" + name + ", age=" + age
                    + ", nice_name=" + nice_name + "]";
        }
    
        public final Long getId() {
            return id;
        }
    
        public final void setId(Long id) {
            this.id = id;
        }
    
        public final String getName() {
            return name;
        }
    
        public final void setName(String name) {
            this.name = name;
        }
    
        public final Integer getAge() {
            return age;
        }
    
        public final void setAge(Integer age) {
            this.age = age;
        }
    
        public final String getNice_name() {
            return nice_name;
        }
    
        public final void setNice_name(String nice_name) {
            this.nice_name = nice_name;
        }
    
    }
    复制代码

    五、    配置文件

    1.        首先看一下Web.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:web="http://java.sun.com/xml/ns/javaee" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
            id="WebApp_ID" version="3.0">
      <display-name>Archetype Created Web Application</display-name>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/spring-*.xml</param-value>
      </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!-- 定义DispatcherServlet -->
      <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <!-- 默认/WEB-INF/[servlet名字]-servlet.xml加载上下文, 
              如果配置了contextConfigLocation参数,
              将使用classpath:/mvc-dispatcher-servlet.xml加载上下文
          -->
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:/mvc-dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <!-- 拦截匹配的请求,这里所有请求采用名字为mvc-dispatcher的DispatcherServlet处理 -->
      <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    复制代码

    2.        mvc-dispatcher-servlet.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            ">
            
        <!-- 启动自动扫描该包下所有的Bean(例如@Controller) -->
        <context:component-scan base-package="com.lei.demo" />
        
        <!-- 基于注释的事务,当注释中发现@Transactional时,使用id为“transactionManager”的事务管理器  -->
        <!-- 如果没有设置transaction-manager的值,则spring以缺省默认的事务管理器来处理事务,默认事务管理器为第一个加载的事务管理器 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        
        <!-- 定义视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/jsp/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
       
    </beans>
    复制代码

    3.        Spring-hibernate的整合

    spring-hibernate.xml文件

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            ">
    
        <!-- Hibernate4 -->
        <!-- 加载资源文件  其中包含变量信息,必须在Spring配置文件的最前面加载,即第一个加载-->
        <context:property-placeholder location="classpath:persistence-mysql.properties" />
        
        <bean id="sessionFactory" 
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="packagesToScan">
                <list>
                    <!-- 可以加多个包 -->
                    <value>com.lei.demo.model</value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                </props>
            </property>
        </bean>
        
        <!-- 数据库映射 -->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="${jdbc.driverClassName}" />
          <property name="url" value="${jdbc.url}" />
          <property name="username" value="${jdbc.user}" />
          <property name="password" value="${jdbc.pass}" />
       </bean>
       
        <!-- 配置Hibernate事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.orm.hibernate4.HibernateTransactionManager">
          <property name="sessionFactory" ref="sessionFactory" />
       </bean>
       
       <!-- 配置事务异常封装 -->
       <bean id="persistenceExceptionTranslationPostProcessor" 
           class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
        
    </beans>
    复制代码

    资源文件persistence-mysql.properties如下:

    复制代码
    # jdbc.X
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://192.168.150.63:3306/test?createDatabaseIfNotExist=true
    jdbc.user=root
    jdbc.pass=root111111
    
    # hibernate.X
    hibernate.connection.driverClass=org.gjt.mm.mysql.Driver
    hibernate.connection.url=jdbc:mysql://192.168.150.63:3306/test
    hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    hibernate.connection.username=root
    hibernate.connection.password=root111111
    hibernate.show_sql=true
    复制代码

    六、    Model层

    此处model层只有一个User类,见前文user.java。

    七、    DAO层

    DAO层包括3个包,各个包中类如下:

    com.lei.demo.dao.common: IOperations, AbstractHibernateDao

    com.lei.demo.dao: IUserDao

    com.lei.demo.dao.impl: UserDao

    代码如下:

    IOperations.java,通用的操作接口

    复制代码
    package com.lei.demo.dao.common;
    
    import java.io.Serializable;
    import java.util.List;
    
    /*
     * 通用的操作接口
     */
    public interface IOperations<T extends Serializable> {
         
            T findOne(final long id);
    
            List<T> findAll();
    
            void create(final T entity);
    
            T update(final T entity);
    
            void delete(final T entity);
    
            void deleteById(final long entityId);
    
    }
    复制代码

    AbstractHibernateDao.java实现了IOperations接口,所有DAO都需要继承此类,这样就避免重复的写一些CURD。

    复制代码
    package com.lei.demo.dao.common;
    
    import java.io.Serializable;
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    
    import com.google.common.base.Preconditions;
    
    @SuppressWarnings("unchecked")
    public abstract class AbstractHibernateDao<T extends Serializable> implements IOperations<T> {
        
        private Class<T> clazz;
        
        @Resource(name="sessionFactory")
        private SessionFactory sessionFactory;
    
        protected final void setClazz(final Class<T> clazzToSet) {
            this.clazz = Preconditions.checkNotNull(clazzToSet);
        }
        
        protected final Session getCurrentSession() {
            return sessionFactory.getCurrentSession();
        }
    
        @Override
        public final T findOne(final long id) {
            return (T)getCurrentSession().get(clazz, id);
        }
    
        @Override
        public final List<T> findAll() {
            return getCurrentSession().createQuery("from " + clazz.getName()).list();
        }
    
        @Override
        public final void create(final T entity) {
             Preconditions.checkNotNull(entity);
             // getCurrentSession().persist(entity);
             getCurrentSession().saveOrUpdate(entity);
        }
    
        @Override
        public final T update(final T entity) {
            Preconditions.checkNotNull(entity);
            getCurrentSession().update(entity);
            return entity;
            //return (T)getCurrentSession().merge(entity);
        }
    
        @Override
        public final void delete(final T entity) {
             Preconditions.checkNotNull(entity);
             getCurrentSession().delete(entity);
        }
    
        @Override
        public final void deleteById(final long entityId) {
            final T entity = findOne(entityId);
            Preconditions.checkState(entity != null);
            delete(entity);
        }
        
    }
    复制代码

    IUserDao.java具体的DAO的接口,继承了IOperations

    复制代码
    package com.lei.demo.dao;
    
    import com.lei.demo.dao.common.IOperations;
    import com.lei.demo.model.User;
    
    public interface IUserDao extends IOperations<User> {
        //让所有的DAO都实现基本的操作接口IOperations
        //除了实现IOperations中的基本操作之外,特定的DAO要实现其他操作可以在对应的接口DAO中定义方法,
        //此处UserDao的接口IUserDao不需要实现其他方法
    }
    复制代码

    UserDao.java具体的DAO实现

    复制代码
    package com.lei.demo.dao.impl;
    
    import org.springframework.stereotype.Repository;
    
    import com.lei.demo.dao.IUserDao;
    import com.lei.demo.dao.common.AbstractHibernateDao;
    import com.lei.demo.model.User;
    
    @Repository("usersDao")
    public class UserDao extends AbstractHibernateDao<User> implements IUserDao {
    
        public UserDao() {
            super();
            
            setClazz(User.class);
        }
    }
    复制代码

    至此,DAO层已经完成。

    八、    Service层

    Service层包括3个包,各个包中类如下:

    com.lei.demo.service.common: AbstractService

    com.lei.demo.service: IUserService

    com.lei.demo.service.impl: UserService

    AbstractService.java,实现了IOperations,所有的Service都要继承此类,这样就避免了重复实现通用的方法,注意类前的注释“@Transactional

    ”,表示其中所有的方法都需要引入事务,代码如下:

    复制代码
    package com.lei.demo.service.common;
    
    import java.io.Serializable;
    import java.util.List;
    
    import org.springframework.transaction.annotation.Transactional;
    
    import com.lei.demo.dao.common.IOperations;
    
    @Transactional
    public abstract class AbstractService<T extends Serializable> implements IOperations<T> {
        
        protected abstract IOperations<T> getDao();
    
        @Override
        public T findOne(final long id) {
            return getDao().findOne(id);
        }
    
        @Override
        public List<T> findAll() {
            return getDao().findAll();
        }
    
        @Override
        public void create(final T entity) {
            getDao().create(entity);
        }
    
        @Override
        public T update(final T entity) {
            return getDao().update(entity);
        }
    
        @Override
        public void delete(final T entity) {
            getDao().delete(entity);
        }
    
        @Override
        public void deleteById(long entityId) {
            getDao().deleteById(entityId);
        }
    
    }
    复制代码

    IUserService.java接口

    复制代码
    package com.lei.demo.service;
    
    import com.lei.demo.dao.common.IOperations;
    import com.lei.demo.model.User;
    
    public interface IUserService extends IOperations<User> {
    
    }
    复制代码

    UserService.java,具体的Service实现类就很简单了,因为大部分通用的方法都在其继承的虚类AbstractService中实现了,这里只要注入具体的dao即可:

    复制代码
    package com.lei.demo.service.impl;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.lei.demo.dao.IUserDao;
    import com.lei.demo.dao.common.IOperations;
    import com.lei.demo.model.User;
    import com.lei.demo.service.IUserService;
    import com.lei.demo.service.common.AbstractService;
    
    @Service("userService")
    public class UserService extends AbstractService<User> implements IUserService {
    
        @Resource(name="usersDao")
        private IUserDao dao;
        
        public UserService() {
            super();
        }
    
        @Override
        protected IOperations<User> getDao() {
            return this.dao;
        }
    }
    复制代码

    九、    JSP页面和Controller

    Jsp页面放在WEB-INF/jsp/user/…下,分别是user的增删改查页面,

    WEB-INF/jsp/user/add.jsp

    WEB-INF/jsp/user/edit.jsp

    WEB-INF/jsp/user/list.jsp

    WEB-INF/jsp/user/detail.jsp

    以下是具体页面代码

    WEB-INF/jsp/user/add.jsp

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
     <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Add User</title>
    </head>
    <body>
        <form action="add" method="post">
            
            Name:<input id="name" name="name" type="text" />
            <br>
            Nice Name:<input id="nice_name" name="nice_name" type="text" />
            <br>
            Age:<input id="age" name="age" type="text" />
            <br>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    复制代码

    WEB-INF/jsp/user/edit.jsp

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Edit user</title>
    </head>
    <body>
        <c:url var="saveUrl" value="/user/save/${userAttribute.id }" />
        <form:form modelAttribute="userAttribute" action="${saveUrl }">
            <table>
                <tr>
                    <td>ID:</td>
                    <td><form:input path="id" readonly="true"/></td>
                </tr>
                <tr>
                    <td>Name:</td>
                    <td><form:input path="name"/></td>
                </tr>
                <tr>
                    <td>Nice name:</td>
                    <td><form:input path="nice_name"/></td>
                </tr>
                <tr>
                    <td>Age:</td>
                    <td><form:input path="age"/></td>
                </tr>
            </table>
            <input type="submit" value="Save">
        </form:form>
    </body>
    </html>
    复制代码

    WEB-INF/jsp/user/list.jsp

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>User List</title>
    </head>
    <body>
        <a href="add">Add</a>
        <table>
            <tr>
                <td>ID</td>
                <td>Name</td>
                <td>NiceName</td>
                <td>Age</td>
            </tr>
            <c:forEach var="user" items="${userList }" >
                <tr>
                    <td>${user.id }</td>
                    <td>${user.name }</td>
                    <td>${user.nice_name }</td>
                    <td>${user.age }</td>
                    <td><a href="show/${user.id }">详细</a></td>
                    <td><a href="edit/${user.id }">编辑</a></td>
                    <td><a href="del/${user.id }">删除</a></td>
                </tr>
            </c:forEach>
        </table>
    </body>
    </html>
    复制代码

    WEB-INF/jsp/user/detail.jsp

    复制代码
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Show user</title>
    </head>
    <body>
        <c:out value="${user.id }"></c:out>
        <br>
        <c:out value="${user.name }"></c:out>
        <br>
        <c:out value="${user.nice_name }"></c:out>
        <br>
        <c:out value="${user.age }"></c:out>
    </body>
    </html>
    复制代码

    写Controller访问上边的jsp,UserController.java

    复制代码
    package com.lei.demo.controller;
    
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.lei.demo.model.User;
    import com.lei.demo.service.IUserService;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @Resource(name="userService")
        private IUserService userService;
        
        @RequestMapping(value="/count",method=RequestMethod.GET)
        public ModelAndView userCount() {
            
            int count = userService.findAll().size();
            
            ModelAndView mv = new ModelAndView();
            mv.addObject("userCount", count);
            mv.setViewName("user/userCount");
            return mv;
        }
        
        @RequestMapping(value="/list",method=RequestMethod.GET)
        public ModelAndView getUserlist(Model model){
            
            ModelAndView mv = new ModelAndView();
            List<User> userList = userService.findAll();
            System.out.println("log======table 'user' all records:"+userList.size());
            mv.addObject("userList", userList);
            mv.setViewName("user/list");
            return mv;
        }
        
        @RequestMapping(value="/add",method=RequestMethod.GET)
        public ModelAndView getAdd(){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("user/add");
            return mv;
        }
        
        @RequestMapping(value="/add",method=RequestMethod.POST)
        public String add(@ModelAttribute("user") User user){
            userService.create(user);
            return "redirect:/user/list";
        }
        
        @RequestMapping(value="/show/{userid}",method=RequestMethod.GET)
        public ModelAndView show(@PathVariable Long userid){
            User user = userService.findOne(userid);
            
            ModelAndView mv = new ModelAndView();
            mv.addObject("user", user);
            mv.setViewName("user/detail");
            return mv;
        }
        
        @RequestMapping(value="/del/{userid}",method=RequestMethod.GET)
        public String del(@PathVariable Long userid){
            userService.deleteById(userid);
            
            return "redirect:/user/list";
        }
        
        @RequestMapping(value="/edit/{userid}",method=RequestMethod.GET)
        public ModelAndView getEdit(@PathVariable Long userid,Model model){
            User user = userService.findOne(userid);
            model.addAttribute("userAttribute", user);
            ModelAndView mv = new ModelAndView();
            mv.setViewName("user/edit");
            return mv;
        }
        
        @RequestMapping(value="/save/{userid}",method=RequestMethod.POST)
        public String saveEdit(@ModelAttribute("userAttribute") User user,@PathVariable Long userid){
            userService.update(user);
            return "redirect:/user/list";
        }
    }
    复制代码

    十、    运行结果

     

  • 相关阅读:
    docker 安装ELK
    关于centOS安装配置mysql5.6那点事
    关于centOS安装配置xampp那点事
    PowerDesigner16.5连接Oracle数据库生成E-R图
    Microsoft Visual Studio 中工具箱不显示DevExpress控件的解决办法
    Linux 基础命令
    oracle数据库表空间创建&导入&导出
    weblogic10.3.6漏洞修改方案
    oracle数据库表空间追加数据库文件方法
    转移博客
  • 原文地址:https://www.cnblogs.com/smallfa/p/11690444.html
Copyright © 2020-2023  润新知