其實這是我實習生涯開始後的第一個任務,但是當時太忙了一直沒有時間記錄,就按照教程走了。剛好現在實習結束了有些時間,把整個搭建的過程還有一些坑記錄下來還是很有必要的。
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整合成功!