zoukankan      html  css  js  c++  java
  • 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";
        }
    }
    复制代码

    十、    运行结果

     

  • 相关阅读:
    spark streaming 概述
    spark sql 的性能调优
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal (用中序和后序树遍历来建立二叉树)
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal (用先序和中序树遍历来建立二叉树)
    LeetCode 90. Subsets II (子集合之二)
    LeetCode 88. Merge Sorted Array(合并有序数组)
    LeetCode 81. Search in Rotated Sorted Array II(在旋转有序序列中搜索之二)
    LeetCode 80. Remove Duplicates from Sorted Array II (从有序序列里移除重复项之二)
    LeetCode 79. Word Search(单词搜索)
    LeetCode 78. Subsets(子集合)
  • 原文地址:https://www.cnblogs.com/smallfa/p/11690444.html
Copyright © 2011-2022 走看看