本篇博客来讲解如何整合SSM(SpringMVC+Spring+Mybatis),代码已上传至GIT在正式整合之前,有几个概念需要提前了解下:
1、Spring框架,也有人称呼为容器框架,编程领域的容器指的是有一种或多种手段将第三方框架、组件等纳入到容器中,进行生命周期等的管理,从而使得我们可以在容器中直接通过某个类来使用或操作某个组成或功能,不需要在单独使用对应框架API;
2、Mybatis框架有三个需要注意的地方,所以如何正确地处理这三点是整合的重点:
- mybatis-config.xml:mybatis的配置文件,里面包含框架的配置属性、类型处理、插件、数据源等信息,在整合SpringMVC时,如有必要,可以执行该文件位置
- Mapper接口:由于java是面向接口的编程,所有我们在实际使用中,需要有一些java接口文件来直接使用Mybatis提供的功能;
- *Mapper.xml:在这里面直接定义了具体的sql,不解释;
下面开始整合:
1、首先展示下项目结构目录,请大家一定按照这个结构进行构建,否则能产生因为路径不一致而报错,程序不是智能地,只有正确地指定,程序才可能正确地执行出结果,谨记!
2、修改pom.xml文件依赖,本次需要引入如下依赖,引入完成后具体pom.xml内容如下:
- 引入spring-jdbc依赖,用以提供事务管理器
- 引入mysql的驱动jar依赖,用以提供连接mysql数据库
- 引入阿里巴巴的德鲁伊数据源依赖,使用德鲁伊数据源
- 引入mybatis-spring依赖,用以整合springmvc和mybatis的关键依赖
- 引入mybatis框架依赖,用以使用mybatis框架
- 引入lombok依赖,用以简化实体类中构造方法、Seter/Getter方法等
- 引入切面jar包依赖,对spring-aop提供支持
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dongnao</groupId>
<artifactId>SpringMVC-Sample</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>SpringMVC-Sample</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- 引入SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- 引入Spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- 引入mybatis-spring,整合ssm的核心文件 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 引入mybatis框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 引入mysql驱动器 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 引入德鲁伊数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<!-- 引入切面依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<!-- 引入Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 引入JSP -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- 引入JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3、打开mysql数据库,找到默认提供的test库,新建一个简单的user表,内容如下:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(36) DEFAULT NULL,
`mobile` char(11) DEFAULT NULL,
`email` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', '张三', '17712345678', '[email protected]');
4、接下来在com.dongnao.entity包下面创建User实体类,在com.dongnao.dao包下面创建UserMapper,在resources/mappers目录下创建UserMapper.xml,三个文件内容由于比较简单,如下:
package com.dongnao.entity;
import lombok.Data;
import java.io.Serializable;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:46
**/
@Data
public class User implements Serializable {
private Integer id;
private String name;
private String mobile;
private String email;
}
package com.dongnao.dao;
import com.dongnao.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper {
User getById(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dongnao.dao.UserMapper">
<select id="getById" resultType="com.dongnao.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
5、新增一个com.dongnao.controller.UserController,com.dongnao.service.UserService,内容如下,不解释:
package com.dongnao.controller;
import com.dongnao.entity.User;
import com.dongnao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.servlet.ModelAndView;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:51
**/
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users/{id}")
public ModelAndView getUser(@PathVariable("id") Integer id){
// 获取用户信息
User user = userService.getUserById(id);
ModelAndView mv = new ModelAndView("userDetail");
mv.addObject("user",user);
return mv;
}
}
package com.dongnao.service;
import com.dongnao.dao.UserMapper;
import com.dongnao.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @description:
* @author: YuXD
* @create: 2018-11-09 20:51
**/
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Integer userId){
return userMapper.getById(userId);
}
}
6、在resources目录下,增加一个mybatis-config.xml文件,这个文件为mybatis的配置文件,学过mybatis的肯定都会有印象,特别说明的是在通spring整合时,这个文件有无都没有什么影响,并不是mybatis不需要配置了,而是我们可以直接在下面用到的SqlSessionFactoryBean中直接通过注入的方式进行属性配置,我之所以保留它的原因在于相比于前者,它读起来直观,当然也是为了演示,具体内容如下,里面的属性值大家可以查阅官方配置资料自行学习:
<?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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
</configuration>
7、接下来进行至关重要的下面四个文件的配置如下:
web.xml的作用不用说了,这里解释下另外三个文件的作用:
- SpringMVC-servlet.xml:controller配置文件,该文件的主要作用是配置Controller来接收请求、将逻辑视图转换为物理视图、处理静态资源;
- applicationContext.xml:业务类配置文件,扫描业务类,开启aop支持等业务相关配置;
- applicationContext-mybatis.xml:DB相关配置文件,配置数据源、整合mybatis、配置事务等所有涉及DB层面的配置都在此配置文件中;
后期如果使用缓存啦、消息服务、第三方插件等,都可按照这个格式自行扩展,好了,上内容:
SpringMVC-servlet.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/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 配置自动扫描controller包下面带有@Controller注解的类 -->
<context:component-scan base-package="com.dongnao.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 开启MVC注解驱动,请求分发必须 -->
<mvc:annotation-driven />
<!-- 配置静态资源处理 -->
<mvc:resources mapping="/static/**" location="/resources/" />
<!-- 配置视图解析器 将逻辑视图名映射为物理视图名 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value="/WEB-INF/views/"></property>
<property name = "suffix" value = ".jsp"></property>
</bean>
</beans>
applicationContext.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"
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.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-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/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- 扫描业务代码 -->
<context:component-scan base-package="com.dongnao">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service"></context:include-filter>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
<!-- 开启aop支持 -->
<aop:aspectj-autoproxy />
</beans>
applicationContext-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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-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/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 引入外部的数据源配置属性 -->
<context:property-placeholder location="classpath:datasource.properties"/>
<!-- 配置Druid数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${database.driverClass}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="maxWait" value="60000" />
<property name="minIdle" value="1" />
<property name="validationQuery" value="SELECT 1" /> <!-- 验证连接是否成功, SQL SELECT 指令至少要返回一行 (测试/验证连接池连接的SQL语句也因数据库而异)-->
<property name="testOnBorrow" value="false" /> <!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 -->
<property name="testOnReturn" value="false" /> <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 -->
<property name="minEvictableIdleTimeMillis" value="300000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 -->
<property name="testWhileIdle" value="true" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<property name="maxOpenPreparedStatements" value="20" /><!-- 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。 -->
<!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启。 -->
<property name="poolPreparedStatements" value="true" />
<!-- 指定每个PSCache连接上PSCache的大小 -->
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 配置监控统计拦截的filters 去掉后监控界面sql无法统计
开启web监控、开启sql防火墙 -->
<property name="filters" value="stat,wall"></property>
</bean>
<!-- 在整合时,SqlSessionFactoryBean提供了mybatis框架中SqlSessionFactory的功能 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 为mybatis提供数据源,无需在mybatis-config文件中指定 -->
<property name="dataSource" ref="dataSource" />
<!-- 引入mybatis配置文件,所有关于mybatis属性配置的内容都可以在该文件中配置 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 引入*Mapper.xml的扫描,配置此属性后,Spring框架自动加载扫描匹配以下路径的所有Mapper.xml文件 -->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml" />
</bean>
<!-- 同mybatis中的SqlSession同等作用,用的时候直接注入即可 ,如果项目里面不需要,可不写,此处注释掉
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>-->
<!-- 用来扫描com.dongnao.dao包下面,所有被@Repository所修饰的Mapper接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dongnao.dao" />
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 开启事务注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 创建事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
在上面配置文件中,引入了一个resources/datasource.properties文件,内容如下:
database.driverClass=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
database.username=root
database.password=root
8、在WEB-INF/views文件夹下面新建userDetail.jsp文件,内容如下,请忽略样式^_^
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>用户详情</title>
</head>
<body>
用户姓名:${user.name}<br />
手机号码:${user.mobile}<br />
用户邮箱:${user.email}
</body>
</html>
到此为止,配置完毕,启动服务器,在地址栏输入 http://localhost:8080/mvc/users/1 ,进行测试,看到页面内容如下:
本次配置,用到的各种依赖都属于比较新,可以直接在项目中使用,配置并不难,关键在于怎么去理解配置过程中的冲突点,只有理解了这个冲突点,才能更轻松的配置出来!