其实这是我实习生涯开始后的第一个任务,但是当时太忙了一直没有时间记录,就按照教程走了。刚好现在实习结束了有些时间,把整个搭建的过程还有一些坑记录下来还是很有必要的。
DEMO
https://github.com/mgsky1/aboutSpring/tree/master/ssm_csdn
环境
- IDEA 15.0.5
- JDK 1.8
- tomcat 7.0.69
- Maven 3.3.9
思路
首先需要说明的是,Spring框架中包含了SpringMVC,所以说二者是可以天然整合的。而Mybatis需要一个中间件,像“胶水”一样,把它和Spring框架粘合在一起。Spring可以看成是一个java bean的管理器,它贯穿与整个整合过程。如下图
整合步骤(有干货哦!)
在写整合步骤的过程中,虽然都是SSM整合,但是我的风格更偏向与实用性,不会只是简单的将SSM搭起来就完事了。在整合的测试用例选用上,我使用输出JSON格式字符串来进行测试。这也是目前后端比较流行的一种方式,能够与前端有效解耦。
注:如有看到Optional字样,表示可选步骤
最终项目结构
利用IDEA的Maven模板创建项目
在IDEA模板中,有两个webapp,记得要选择下图选中所示的
项目构建完成后,在配置tomcat的项目运行war包时,可能你会看到下图所示的情况,没有Artifacts选项
解决办法如下:
1、打开file -> project structure->factes,添加web项目
2、修改factes的Web Resources Directory
路径,记得要定位到项目的webapp目录下
3、进入Artifacts选项卡,按如下图选择,添加项目打包配置
4、修改路径
保存后再进行server配置时就可以看到有Artifacts选项了
项目创建完成后,可以尝试启动一下,如果没有报错,可以进行下一步
添加Maven依赖
首先是版本
- 版本不唯一,数据库可以用Oracle,这里以MySQL为例
- 数据库连接池也可以使用阿里的
<properties>
<!--Spring-->
<spring.version>4.1.3.RELEASE</spring.version>
<!--Json处理-->
<json.version>2.7.4</json.version>
<jackson.version>2.7.4</jackson.version>
<!-- mybatis-->
<mybatis.version>3.2.6</mybatis.version>
<!-- mybatis与Spring的粘合剂-->
<mybatis-spring.version>1.2.2</mybatis-spring.version>
<!-- mysql数据库驱动-->
<mysql-connector-java.version>5.1.30</mysql-connector-java.version>
<!-- 数据库连接池-->
<commons-dbcp.version>1.2.2</commons-dbcp.version>
</properties>
Optional
<!--日志管理-->
<log4j.version>1.2.17</log4j.version>
<sl4j.version>1.6.1</sl4j.version>
依赖配置
<dependencies>
<!-- spring核心包 包括SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--JSON解析-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${json.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${json.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 整合Mybatis和Spring使用 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
</dependencies>
Optional
<!-- 日志文件管理包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${sl4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${sl4j.version}</version>
</dependency>
项目构建配置
为了在项目打包时能够将mybatis的*.xml的Mapper配置文件加载进去,在<build></build>
标签中添加以下内容
<resources>
<!--包含xml Mapper文件-->
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
依赖配置完成后,让Maven重新导包一下
日志文件配置Optional
在src/main
下新建一个Resources
文件夹,并把它标记为Resources Root
在Resources
下添加文件log4j.properties
文件内容如下:
#定义开启级别,测试阶段一般设置DEBUG,Console,File
log4j.rootLogger=DEBUG,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定输出目录以及日志名称
log4j.appender.File.File=logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize=10MB
#输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-ddHH\:mm\:ss}][%c]%m%n
在/webapp/WEB-INF/web.xml下追加以下内容
<!--日志监听-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
Spring与SpringMVC整合
因为SpringMVC是Spring的一部分,它们有得天独厚的整合关系,所以就先处理它们两个
添加java文件夹,并设置成Sources Root,建立Java Web项目最基本的项目结构
在Resources文件夹下添加ssm.xml文件
这个便是SSM框架的核心配置文件,这里先填写与SpringMVC有关的部分,不过约束头给出的是SSM全部的,不过不影响
文件内容如下
约束头:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
</beans>
在<beans></beans>
标签中间添加SpringMVC相关配置
<!--配置Handler,也就是控制器,使用组件扫描-->
<context:component-scan base-package="com.example" />
<!--使用mvc:annotation-driven会加载很多的参数绑定方法 包括JSON解析-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--注解映射器和适配器必须配对使用-->
<!--视图解析器
解析jsp解析,默认使用jstl标签,classpath下的所有jstl包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
配置web.xml
在/webapp/WEB-INF/web.xml下追加如下内容
<!--SpringMVC前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--contextConfigLocation配置SpringMVC加载的配置文件(配置处理器映射器、适配器等)-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ssm.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中servlet-mapping
中的 url-pattern
有两种写法,一种是例子中的,还有一种是*.action,如果是后者,在访问控制器的时候要加.action后缀,否则会404
测试
在com.example.controller
包下添加MainController.java文件,编写一个简单的控制器
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Martin Huang on 2018/7/1.
*/
@Controller
@RequestMapping("/main")
public class MainController {
@RequestMapping("/testMVC")
@ResponseBody
public Map<String,Object> testMVC(){
Map<String,Object> responseMap = new HashMap<String,Object>();
responseMap.put("name","martin");
return responseMap;
}
}
这个控制器的作用就是输出一个JSON字符串,key为name,value为martin
运行后如果浏览器返回以下JSON字符串结果,表示整合成功
Spring与Mybatis整合
编写数据库配置文件jdbc_mysql.properties
在Resources文件下新建文件,名为jdbc_mysql.properties,内容如下
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://HOST:PORT/mydb
user=YOUR_USER
password=YOUR_PASSWORD
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
请自行将HOST:PORT
替换为自己的数据库ip:端口号、YOUR_USER
替换为数据库用户名、YOUR_PASSWORD
替换为数据库用户名对应密码
配置ssm.xml
在原ssm.xml中追加以下内容
<!--引入配置文件-->
<context:property-placeholder location="classpath*:jdbc_mysql.properties"/>
<!--配置mysql-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" ></property>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:/com/example/dao/xml_mysql/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
测试
这里做一个简单的查询,数据库mydb中有一张ssm_role
表,内容是这样的
我们将查询这张表的全部内容,使用JSON字符串输出,这里使用的是Mapper代理开发。
在dao层创建RoleMapper接口
import java.util.List;
/**
* Created by Martin Huang on 2018/7/1.
*/
public interface RoleMapper {
List getAllRoles();
}
在dao层新建xml_mysql包,并创建RoleMapper.xml文件
<?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.example.dao.RoleMapper">
<select id="getAllRoles" resultType="java.util.Map">
SELECT * FROM ssm_role
</select>
</mapper>
在service层创建RoleService接口
import java.util.List;
import java.util.Map;
/**
* Created by Martin Huang on 2018/7/1.
*/
public interface RoleService {
public List<Map<String,Object>> getAllRoles() throws Exception;
}
在service层新建impl包,并新增RoleServiceImpl实现类
import com.example.dao.RoleMapper;
import com.example.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* Created by Martin Huang on 2018/7/1.
*/
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleMapper roleMapper;
@Override
public List<Map<String, Object>> getAllRoles() throws Exception {
return roleMapper.getAllRoles();
}
}
在MainController中添加私有属性和一个新的方法
@Autowired
private RoleService roleService;
@RequestMapping("/testSQL")
@ResponseBody
public List<Map<String,Object>> testSQL(){
try
{
return roleService.getAllRoles();
}catch (Exception e){
e.printStackTrace();
return null;
}
}
运行项目后,如果浏览器显示以下JSON字符串,表示SSM整合成功!