美文网首页
01整合Spring+SpringMVC+MyBatis ,采用

01整合Spring+SpringMVC+MyBatis ,采用

作者: 菜芽_4528 | 来源:发表于2019-06-07 11:59 被阅读0次

项目概要:

SpringMVC-01项目:整合Spring+SpringMVC+MyBatis ,实现增删查改翻页功能,采用Mapper.xml映射方式操作数据库的sql;

源码下载:SpringMVC-01 (项目源码如何上传简书平台上吗)

开发环境

Windows:windows 10

JDK: 1.8

IDE:Eclipse Oxygen.2

Tomcat :tomcat 8.50

Database:mysql 5.7.18

Mybatis :mybatis-3.5.1

技术选型

Spring Framework 5.0.x:

Spring

SpringMVC

PageHelper

jQuery

Bootstrap

log4j-1.2.17

框架环境要求

Spring Framework 5.1.x: JDK 8-12

Spring Framework 5.0.x: JDK 8-10

Spring Framework 4.3.x: JDK 6-8

页面效果展示

访问:http://localhost:8080/springmvc-01/sys/user/list

1.列表

image

2.添加

image

3.删除

image

4.查看

image

5.编辑

image image

6.翻页

image

项目架构与功能实现##

项目目录结构

image

1.添加jar包

image

Spring 、SpringMVC、MyBatis 相关配置

1.web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- ************************* 站台名称,站台描述,大小图标  ************************* --> 
  <display-name>springmvc-01</display-name>
    <!-- <description>web.xml</description> -->
    <icon>
       <small-icon>/static/img/favicon.ico</small-icon>
       <large-icon>/static/img/favicon.ico</large-icon>
    </icon>
<!-- *************************SpringIOC的相关设置 ************************* -->
    <listener>
        <!-- 注册Spring的ServletContext监听器,监听到服务器启动时,自动执行ContextLoaderListener的方法初始化Spring -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <!-- 加载Spring的配置文件,随着监听器触发,Spring调用这里,找到Spring的核心配置文件 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-context.xml</param-value>
    </context-param> 
    
    <!-- Spring和mybatis的配置文件 -->
<!--    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-context-mybatis.xml</param-value>
    </context-param> -->
    
<!-- ************************* SpringMVC的相关设置  begin ************************* -->
    <!-- springmvc前端控制器  配置DispatchcerServlet-->
    <servlet>
        <!--SpringMVC是基于Servlet使用中央处理器处理页面请求,配置中央处理器的全路径-->
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置Spring mvc下的配置文件的位置和名称 -->
        <init-param>
            <!--当页面有请求时,DispatcherServlet对象调用这里,获取到SpringMVC的核心配置文件-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- tomcat启动的时候加载这个servlet 优先级,数字越小级别越高 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--将DispatcherServlet映射到‘/’-->
    <servlet-mapping>
        <!--指定请求的映射,链接为指定形式时,使用Servlet处理,其他链接不执行Servlet-->
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
<!--SpringMVC的相关设置 end-->
 
<!-- ************************* 解决字符编码异常的过滤器 *************************  -->
    <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>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <!-- 403错误拦截 -->
  <error-page>
    <error-code>403</error-code>
    <location>/error/403.jsp</location>
  </error-page>
  <!-- 404错误拦截 -->
  <error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
  </error-page>
  <!-- 500错误拦截 -->
  <error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
  </error-page>
  
</web-app>

2.spring-context.xml 配置

<?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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        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">
    <description>Spring的相关配置</description>
    <!-- 使用Annotation自动注册Bean,解决事物失效问题:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解。  -->
    <context:component-scan base-package="com.xl.agile.modules"><!-- base-package 如果多个,用“,”分隔 --> 
      <!-- 扫描除了注解为@Controller的类 -->
<!--      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> -->
    <!--  扫描除了注解为@ControllerAdvice的类
      <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> -->
    </context:component-scan> 
    <!-- 引入Mybatis配置 -->
     <import resource="classpath:spring-context-mybatis.xml"/>
</beans>

3.spring-mvc.xml 配置

<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        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">
    <!-- 加载配置文件 -->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:environment.properties" /> 
    <!--注解驱动-->
    <mvc:annotation-driven> </mvc:annotation-driven>
    
    <!-- 打开使用注解自动检测功能自动注册Bean,只扫描@Controller -->
    <context:component-scan base-package="com.xl.agile.modules" > 
<!--        扫描注解为@Controller的类
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        ControllerAdvice注解用来处理全局异常,可以标记在类上,故此处为扫描注解为@ControllerAdvice的类
       <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> -->     
    </context:component-scan>
 
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <!-- 视图的路径 -->
        <property name="prefix" value="${web.view.prefix}"></property>
        <!-- 视图名称后缀  -->
        <property name="suffix" value="${web.view.suffix}"></property>
    </bean>
    
    <!--静态资源映射,常用于加载html、js、css、图片、视频等静态资源-->
    <mvc:resources mapping="/js/**"  location="/static/js/"/>
    <mvc:resources mapping="/img/**" location="/static/img/"/>
    <mvc:resources mapping="/css/**" location="/static/css/"/>
    <mvc:resources mapping="/fonts/**" location="/static/fonts/"/>
    <!-- 当上面要访问的静态资源不存在与上面的配置中时,则根据此配置来访问  需要在web.xml中配置 404 500-->
    <mvc:default-servlet-handler /> 
    
    <!-- 配置文件上传 -->
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />  
       <!--  文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />  
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />  
    </bean> 
    
      <!-- 使用自定义Spring拦截器 -->
<!--     <mvc:interceptors>    
      <mvc:interceptor>    
            <mvc:mapping path="/**" />     
            <bean class="com.demo.common.core.SpringMVCInterceptor"></bean>    
        </mvc:interceptor>    
    </mvc:interceptors>   --> 
    
    <!--避免IE执行AJAX时,返回JSON出现下载文件 -->
    <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
</beans>

4.jdbc.properties 配置

jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/my_test?useUnicode=true&characterEncoding=utf8
jdbc.url=jdbc:mysql://localhost:3306/my_test?characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=321321

5.spring-context-mybatis.xml 配置

<?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:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.3.xsd
        http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
        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-4.3.xsd">
    <description>Spring和Mybatis集成配置</description>
    <!-- ******** 1. 配置数据源 ******** -->
    <!-- <1>.加载配置文件: jdbc.properties-->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties" /> 
    
    <!-- <2>.数据源配置:采用dbcp方式-->  
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 初始化连接大小 -->
        <!-- <property name="initialSize" value="${jdbc_initialSize}"></property> -->
        <!-- 连接池最大数量 -->
        <!-- <property name="maxActive" value="${jdbc_maxActive}"></property> -->
        <!-- 连接池最大空闲 -->
        <!-- <property name="maxIdle" value="${jdbc_maxIdle}"></property> -->
        <!-- 连接池最小空闲 -->
        <!-- <property name="minIdle" value="${jdbc_minIdle}"></property> -->
        <!-- 获取连接最大等待时间 -->
        <!-- <property name="maxWait" value="${jdbc_maxWait}"></property> -->
    </bean>
    
    <!-- ******** 2. 配置创建SqlSession的工厂  ******** -->
    <!-- 配置SqlSessionFactory,同时指定数据源dataSource -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 方式1:配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:sqlMapConfig.xml" />
        <!-- 方式2:扫描entity包 使用别名 同上sqlMapConfig.xml方式配置 -->
        <!-- <property name="typeAliasesPackage" value="com.xl.agile.modules" /> -->
        <!--  扫描sql配置文件:mapper需要的xml文件,**表示迭代查找,当前项目Mapper.xml与Mapper.java不在同一个包中启用  [如果*Mapper.xml和*Mapper.java dao不在一个包下,启用下面配置;否可以屏蔽下面]-->
        <property name="mapperLocations" value="classpath*:com/xl/agile/modules/sys/mapper/*Mapper.xml"></property>
    </bean>
    
    <!-- ******** 3. 配置mapper扫描器 自动扫描加载Sql映射文件/接口  ******** -->
    <!--  注册Mappe 配置 DAO接口所在包名 自动扫描包(com.xx.xx.dao)-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- basePackage:Dao 映射文件/接口所在的包(自动扫描)如果需要扫描多个包中间用半角逗号隔开-->
        <property name="basePackage" value="com.xl.agile.modules.sys.dao" />
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
    
    <!-- ******** 4. 事务管理  ******** -->
    <!-- dataSource:引用上面定义的数据源 -->
<!--    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        注入数据库连接池
        <property name="dataSource" ref="dataSource" />
    </bean> -->
    
     <!-- 配置基于注解的声明式事务 -->
    <!-- enables scanning for @Transactional annotations -->
    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
</beans>

6.sqlMapConfig.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <!-- <typeAlias type="com.xl.agile.modules.sys.entity.User" alias="User" /> -->
        <package name="com.xl.agile.modules.sys.entity"/>
    </typeAliases>
 
    <plugins>
     <!-- com.github.pagehelper为PageHelper类所在包名 -->  
    <plugin interceptor="com.github.pagehelper.PageHelper">  
        <!-- 4.0.0以后版本可以不设置该参数 -->  
        <property name="dialect" value="mysql"/>  
        <!-- 该参数默认为false -->  
        <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->  
        <!-- 和startPage中的pageNum效果一样-->  
        <property name="offsetAsPageNum" value="true"/>  
        <!-- 该参数默认为false -->  
        <!-- 设置为true时,使用RowBounds分页会进行count查询 -->  
        <property name="rowBoundsWithCount" value="true"/>  
        <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->  
        <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->  
        <property name="pageSizeZero" value="true"/>  
        <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->  
        <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->  
        <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->  
        <property name="reasonable" value="false"/>  
        <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->  
        <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->  
        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->  
        <!-- 不理解该含义的前提下,不要随便复制该配置 -->  
        <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>  
        <!-- 支持通过Mapper接口参数来传递分页参数 -->  
        <property name="supportMethodsArguments" value="false"/>  
        <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->  
        <property name="returnPageInfo" value="none"/>  
    </plugin>  
    </plugins>
 
</configuration>

增删改查翻页功能实现

image.png
image.png

**UserController **

package com.xl.agile.modules.sys.web;
 
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xl.agile.modules.sys.entity.User;
import com.xl.agile.modules.sys.service.UserService;
 
/**
 * UserController
 * 1.需要用这个注解标识这是一个控制器
 * 2.需要用@Autowired或者@Resource把service的接口对象注入到spring中
 * @author xiaolan
 *
 */
@Controller
@RequestMapping(value="/sys/user")
public class UserController {
 
        private static final Log logger = LogFactory.getLog(UserController.class);
 
        @Resource
        private UserService userService;
        /**
         * 跳转到添加的页面
         * @return
         */
        @RequestMapping(value="userAdd")
        public String insertPage(User user,Model model){
            model.addAttribute("user",user);
            return "modules/"+"sys/userAdd";
        }
        
        /**
         * 跳转到添加的页面
         * @return
         */
        @RequestMapping(value="userEdit")
        public String editPage(User user,Model model,int userid){
            user=userService.findById(userid);
            model.addAttribute("user",user);
            return "modules/"+"sys/userEdit";
        }
        
        /**
         * 添加用户
         * @param user
         * @return
         */
        @RequestMapping(value="insert")
        public String insertUser(User user){
            userService.insertUser(user);
            return "redirect:list";
        }
        
        /**
         * 根据ID删除用户
         * @param user
         * @return
         */
        @RequestMapping(value="delete")
        public String deleteUserById(int userid){
            userService.deleteUserById(userid);
            return "redirect:list";
        }
        
        /**
         * 根据ID查找用户
         * @param user
         * @return
         */
        @RequestMapping(value="details")
        public String findById(HttpServletRequest request,Model model,int userid){
            User user=userService.findById(userid);
            model.addAttribute("user", user);
            return "modules/"+"sys/userInfo";
        }
        
        /**
         * 更新用户
         * @param user
         * @return
         */
        @RequestMapping(value="update",method=RequestMethod.POST)
        public String updateUser(User user,Model model){
            userService.updateUser(user);
            return "redirect:list";
        }
 
        /**
         * 查询所有用户
         * @param request
         * @param pageNum  第N页
         * @param pageSize 每页N条记录
         * @param model
         * @return
         * 分页采用:使用PageInfo的用法
         */
        @RequestMapping(value="list")
        public ModelAndView list(User user, HttpServletRequest request,
                @RequestParam(required=true,defaultValue="1") Integer pageNum,
                @RequestParam(required=false,defaultValue="10") Integer pageSize,
                Model model){
            pageNum = pageNum == null?1:pageNum;
            pageSize = pageSize == null?10:pageSize;
            //1.startPage(第几页, 多少条数据)
            PageHelper.startPage(pageNum, pageSize);
            // where
            String str_name="";
            String str_info="";
            if(StringUtils.isNoneBlank(user.getName())) {
                str_name=user.getName();
            }
            if(StringUtils.isNoneBlank(user.getInfo())) {
                str_info=user.getInfo();
            }
            //2.排序
            PageHelper.orderBy("id desc");
            //2.Mybatis查询分页数据
            List<User> list=userService.findAll(str_name,str_info);
            //3.用PageInfo对结果进行包装 (分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>)
            PageInfo<User> page=new PageInfo<User>(list);
            
            //返回ModelAndView
            ModelAndView modelAndView = new ModelAndView();
            //相当于request的setAttribute方法,在jsp页面中通过pageInfo取数据
            modelAndView.addObject("pageInfo", page);
            //指定视图
            modelAndView.setViewName("modules/"+"sys/userList");
            return modelAndView;
        }
 
}

user表结构

 
Create Table
 
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `pwd` varchar(255) NOT NULL,
  `sex` varchar(255) NOT NULL,
  `home` varchar(255) NOT NULL,
  `info` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1294 DEFAULT CHARSET=utf8

image.png

相关文章

网友评论

      本文标题:01整合Spring+SpringMVC+MyBatis ,采用

      本文链接:https://www.haomeiwen.com/subject/ycbcxctx.html