项目概要:
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.列表

2.添加

3.删除

4.查看

5.编辑


6.翻页

项目架构与功能实现##
项目目录结构

1.添加jar包

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>
增删改查翻页功能实现


**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

网友评论