spring+springMVC+Mybatis整合_注解(声明式)示例
1.概述
spring+springMVC+Mybatis整合 注解(声明)配置方式 基于偷懒对重复的代码采取复制粘贴,对xml配置略作更改,但改变项目为maven支撑。
1.1 测试环境说明
名称 | 版本 | 备注 |
操作系统 | windows 10 专业版 1809_X64 | |
JDK | jdk1.8.0_121 WIN_X64 | |
数据库 | mysql5.7 WIN_X64 | |
web服务器 | Tomcat8.5 WIN_X64 |
2.入门示例
2.1示例流程简述
第一步:创建一个maven项目
第二步:在pom.xml中添加包,并更改当前项目JDK到1.8版本
第三步:创建一个访问页面
第四步:修改WEB.XML配置文件,添加spring处理器
第五步:创建spring核心配置类
第六步:添加mybatis配置类
第七步:添加springMVC配置类
第八步:创建访问处理接口。
第九步:创建 实体类
第十步:创建mapper 数据访问接口
第十一步:创建服务接口与实现类
第十二步:创建响应页面
第十三步:测试
2.2 目录架构
2.3 操作示例
2.3.1 创建MAVEN项目,设置项目支撑包,更改jdk版本 /rbac/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 基本信息 -->
<modelVersion>4.0.0</modelVersion>
<groupId>cn.slm</groupId>
<artifactId>rbac</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>rbac Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 包版本管理 -->
<properties>
<spring.version>5.0.13.RELEASE</spring.version>
<jsp.version>2.0</jsp.version>
<servlet.version>3.0.1</servlet.version>
<mybatis.version>3.5.1</mybatis.version>
<mybatis-spring.version>2.0.1</mybatis-spring.version>
<mysql.version>5.1.47</mysql.version>
<commons-io.version>2.6</commons-io.version>
<commons-logging.version>1.2</commons-logging.version>
<commons-dbcp2.version>2.6.0</commons-dbcp2.version>
<commons-pool2.version>2.6.2</commons-pool2.version>
</properties>
<!-- 支撑包 -->
<dependencies>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<!-- provided 只编译时加载,打包时不加载 -->
<scope>provided</scope>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons-dbcp2.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
</dependencies>
<!-- 插件管理 -->
<build>
<finalName>rbac</finalName>
<plugins>
<!-- 项目安装Tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
<!-- 编译器设置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- JDK 版本 -->
<source>1.8</source>
<!-- 编译版本 -->
<target>1.8</target>
<!-- 编译编码 -->
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.3.2 创建一个访问页面 /rbac/src/main/webapp/index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<%@ page language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset=
"UTF-8"
>
<title>Insert title here</title>
</head>
<body>
<form action=
"${pageContext.request.contextPath}/depart/addDepart"
method=
"post"
>
<label>部门名称</label><input type=
"text"
name=
"departName"
/><br/>
<label>上级部门</label><input type=
"text"
name=
"departSupperId"
/><br/>
<label>简 介</label><input type=
"text"
name=
"departDescribe"
/><br/>
<input type=
"submit"
value=
"保存"
/>
</form>
</body>
</html>
|
2.3.3 修改WEB.XML配置文件,添加spring处理器 /rbac/src/main/webapp/WEB-INF/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"
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>rbac</display-name>
<!-- 编码处理 -->
<filter>
<filter-name>encodingFilter</filter-name>
<!-- 编码处理类 包依赖:spring-web-4.3.16.RELEASE.jar -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 编码设置 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 加载spring核心处理器配置 -->
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<!-- 依赖包 spring-webmvc-4.3.16.RELEASE.jar -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载配置类包 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>cn.slm.config</param-value>
</init-param>
<!-- 配置类解析依赖 依赖包spring-web-5.0.13.RELEASE.jar -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- spring核心处理器映射 所有以/开头的请求都交由spring处理Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 首页设置 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
2.3.4 创建spring核心配置类、mybatis配置类与数据源文件
2.3.4.1 spring核心配置类 /rbac/src/main/java/cn/slm/config/ContextConfig.java
package cn.slm.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;
@Configuration//声明该类是配置类
@ComponentScan(basePackages="cn.slm",excludeFilters=@Filter(type=FilterType.REGEX,pattern=".pojo")) //声明进行Spring包扫描
@PropertySource(encoding="UTF-8",value="classpath:db.properties")//声明属性与加载的数据源文件位置
public class ContextConfig {
}
2.3.4.2 mybatis配置类 /rbac/src/main/java/cn/slm/config/DataBaseConfig.java
package cn.slm.config;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration//声明配置类
@MapperScan(basePackages="cn.slm.mapper",annotationClass=Mapper.class)//mapper包扫描
@EnableTransactionManagement//声明事物管理类
public class DataBaseConfig {
//数据源属性注入
@Value("${db.driverClassName}")
private String driverClassName;
@Value("${db.url}")
private String url;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
//声明数据源
@Bean(name="dataSource")
public DataSource getDataSource() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(driverClassName);
basicDataSource.setUrl(url);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
return basicDataSource;
}
// 声明mybatis的SqlSessionFactoryBean
@Bean(name="sqlSessionFactory")
public SqlSessionFactory getSqlSessionFactory() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(this.getDataSource());
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(configuration);
try {
sqlSessionFactoryBean.afterPropertiesSet();
return sqlSessionFactoryBean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//声明事务管理器
@Bean
public DataSourceTransactionManager getDataDourceTransactionManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(this.getDataSource());
return dataSourceTransactionManager;
}
}
2.3.4.3 数据源文件 /rbac/src/main/resources/db.properties
db.driverClassName=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://localhost:3306/ssm_demo
db.username=root
db.password=123456
2.3.5 添加springMVC配置类 /rbac/src/main/java/cn/slm/config/WebMvcConfig.java
package cn.slm.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration//声明这是一个配置类
@EnableWebMvc//声明启用springMVC注解 等价于<mvc:annotation-driver>标签
public class WebMvcConfig extends WebMvcConfigurerAdapter{
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
configurer.enable();
}
}
2.3.6 创建访问处理接口。/rbac/src/main/java/cn/slm/action/TDepartmentAction.java
package cn.slm.action;
import java.util.Date;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.annotation.SessionScope;
import cn.slm.pojo.TDepartment;
import cn.slm.service.DepartmentService;
@Controller // 访问控制器声明
@SessionScope // 同用户共享声明 单一session只创建一次对象,减少缓存数据
@RequestMapping("/depart")
public class TDepartmentAction{
@Autowired
private DepartmentService dps;
@RequestMapping(value="/addDepart")
public String addDepart(TDepartment depart) {
System.out.println("测试添加!"+depart.getDepartName());
depart.setDepartCreateTime(new Date());
int num = dps.addDepartment(depart);
System.out.println("受影响的行数:"+num);
/*if(num>0) {
request.setAttribute("page_depart_findDepart_msg","添加部门成功!");
}else {
request.setAttribute("page_depart_findDepart_msg","添加部门失败!");
}*/
return "forward:/test.jsp";
}
@RequestMapping("/logicDelDepart")
public String logicDelDepart(@RequestParam TDepartment depart,HttpServletRequest request) {
int num = dps.LogicDelDepartment(depart);
if(num>0) {
request.setAttribute("page_depart_findDepart_msg","添加部门成功!");
}else {
request.setAttribute("page_depart_findDepart_msg","添加部门失败!");
}
return "department/findDepart";
}
@RequestMapping("/findDepartById")
public String findDepartById(@RequestParam TDepartment depart,HttpSession session){
HashMap<String, Object> hashMap = new HashMap<String,Object>();
TDepartment Depart = dps.findDepartmentByID(depart);
session.setAttribute("depart", depart);
return "department/findDepart";
}
}
2.3.7 创建 实体类 /rbac/src/main/java/cn/slm/pojo/TDepartment.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package
cn.slm.pojo;
import
java.util.Date;
public
class
TDepartment {
private
int
departId;;
// dp_id int 11 0 0 -1 0 0 0 0 部门编号 -1 0
private
String departName;
// dp_name varchar 50 0 0 0 0 0 0 0 部门名称 utf8 utf8_bin 0 0
private
String departSupperId;
//dp_supperId int 11 0 0 0 0 0 0 0 上级部门 0 0
private
Date departCreateTime;
// dp_createTime timestamp 0 0 0 0 0 0 0 CURRENT_TIMESTAMP -1 创建时间 0 0
private
String departDescribe;
// dp_describe varchar 255 0 -1 0 0 0 0 这是一个有活力的部门 0 部门描述 utf8 utf8_bin 0 0
public
int
getDepartId() {
return
departId;
}
public
void
setDepartId(
int
departId) {
this
.departId = departId;
}
public
String getDepartName() {
return
departName;
}
public
void
setDepartName(String departName) {
this
.departName = departName;
}
public
String getDepartSupperId() {
return
departSupperId;
}
public
void
setDepartSupperId(String departSupperId) {
this
.departSupperId = departSupperId;
}
public
Date getDepartCreateTime() {
return
departCreateTime;
}
public
void
setDepartCreateTime(Date departCreateTime) {
this
.departCreateTime = departCreateTime;
}
public
String getDepartDescribe() {
return
departDescribe;
}
public
void
setDepartDescribe(String departDescribe) {
this
.departDescribe = departDescribe;
}
}
|
2.3.8 创建mapper 数据访问接口 /rbac/src/main/java/cn/slm/mapper/TDepartmentMapper.java
package cn.slm.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import cn.slm.pojo.TDepartment;
@Mapper
public interface TDepartmentMapper {
@Insert("insert into t_department(dp_name,dp_supperId,dp_createTime,dp_describe) values(#{departName},#{departSupperId},#{departCreateTime},#{departDescribe})")
int insert(TDepartment depart);
int update(TDepartment depart);
int logicDel(TDepartment depart);
int delete(TDepartment depart);
TDepartment select(int id);
TDepartment selectByName(String name);
List<TDepartment> selectAll();
/*List<TDepartment> selectByPage(@Param int startnum,@Param int endnum)*/
}
2.3.9 创建服务接口 /rbac/src/main/java/cn/slm/service/DepartmentService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package
cn.slm.service;
import
java.util.List;
import
cn.slm.pojo.TDepartment;
public
interface
DepartmentService {
public
int
addDepartment(TDepartment depart);
public
int
updateDepartment(TDepartment depart);
public
int
LogicDelDepartment(TDepartment depart);
public
int
delDepartment(TDepartment depart);
public
TDepartment findDepartmentByID(TDepartment depart);
public
TDepartment findDepartmentByName(TDepartment depart);
public
List<TDepartment> findDepartmentByPage(
int
start ,
int
end);
public
List<TDepartment> findAllDepartment();
}
|
2.3.10 创建服务接口实现类 /rbac/src/main/java/cn/slm/service/impl/DepartmentServiceImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package
cn.slm.service.impl;
import
java.util.List;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service;
import
cn.slm.mapper.TDepartmentMapper;
import
cn.slm.pojo.TDepartment;
import
cn.slm.service.DepartmentService;
@Service
//声明服务层
public
class
DepartmentServiceImpl
implements
DepartmentService {
@Autowired
//自动注入TDepartmentMapper
private
TDepartmentMapper dpartMapper;
@Override
public
int
addDepartment(TDepartment depart) {
return
dpartMapper.insert(depart);
}
@Override
public
int
updateDepartment(TDepartment depart) {
// TODO Auto-generated method stub
return
dpartMapper.update(depart);
}
@Override
public
int
LogicDelDepartment(TDepartment depart) {
return
dpartMapper.logicDel(depart);
}
@Override
public
int
delDepartment(TDepartment depart) {
return
dpartMapper.delete(depart);
}
@Override
public
TDepartment findDepartmentByID(TDepartment depart) {
return
dpartMapper.select(depart.getDepartId());
}
@Override
public
TDepartment findDepartmentByName(TDepartment depart) {
return
dpartMapper.selectByName(depart.getDepartName());
}
@Override
public
List<TDepartment> findDepartmentByPage(
int
start,
int
end) {
// TODO Auto-generated method stub
return
null
;
}
@Override
public
List<TDepartment> findAllDepartment() {
return
dpartMapper.selectAll();
}
}
|
2.3.11 创建响应页面 /rbac/src/main/webapp/test.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<%@ page language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<!DOCTYPE html>
<html>
<head>
<meta charset=
"UTF-8"
>
<title>Insert title here</title>
</head>
<body>
这是一个测试页面,用于测试跳转。
当你看到这行字的时候,说明跳转正常!
</body>
</html>
|
2.3.12 测试
2.3.14.1 请求页面
1
|
|
2.3.14.2 响应页面
1
|
|
2.3.14.3 数据库
2.3.14.4 控制台