学习笔记_J2EE_SSM_02_spring+springMVC+Mybatis整合_注解示例
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 控制台