【專案實踐】手把手帶你搞定SSM
阿新 • • 發佈:2021-01-18
> 以專案驅動學習,以實踐檢驗真知
# 前言
現在使用Java後端開發使用的技術棧基本上比較統一:Spring + SpringMVC + Mybatis,即大家常說的SSM。雖然現在流行的做法是使用SpringBoot來快速搭建、配置好SSM專案,但還是有必要知道如何不用SpringBoot來組合好這三者,因為SpringBoot也只是幫助我們做好了許多配置,並不是說捨棄掉了那些配置,所以知道原生的SSM如何整合可以更好幫助我們理解SSM也能更好的理解SpringBoot帶來的好處!而且有的老專案就是沒有用SpringBoot,如果你對原生SSM整合與配置一無所知那維護老專案起來會極其難受。
SSM整合相比起SpringBoot的快速搭建自然是繁瑣無比,但是不用擔心,本文會一步一步演示如何整合這三者,並且會講解每個配置的含義。老套路,文章最後還放上了思維導圖和專案Github地址,**clone下來即可直接執行,如果想自己做一個完整的SSM專案,直接用這套架子進行開發也是完全沒問題的!**
# 整合
## 專案搭建
### 建立專案
這裡使用idea進行專案建立,maven來管理依賴包。首先我們在idea上新建一個project,選擇Maven,然後選擇web應用:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083748176-1257745938.png)
點選下一步後輸入GroupId和ArtifactId後點擊下一步直到完成。專案建立完畢後整個專案結構如下:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083748564-854599442.png)
### 配置web專案
現在還先彆著急配置SSM,我們先得配置一下這個idea下的web專案才行。大家也可以看到,專案建立起來後這個web.xml檔案裡寫的是2.3版本,這個版本太老了,不行。
我們按住`catl + shift + alt + S`開啟idea的Project Structure,然後點選左側的Modules,再點選Web,然後點選右邊的刪除按鈕,確定,最後點選APPLY先將這個預設的刪除:
![](https://img2020.cnblogs.com/news/1496775/202101/1496775-20210118083749120-846951733.png)
此時我們會發現預設的web.xml檔案已經被刪除了。然後我們再點選右側的新增按鈕,點選web.xml進行新增:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083749423-612198844.png)
這裡我們選擇3.1版本,選擇好後點擊彈出框的OK,再點選下方的OK即可建立完畢:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083749767-615731323.png)
建立完畢後就會發現我們的web.xml內容已經變成了3.1了。
![](https://img2020.cnblogs.com/news/1496775/202101/1496775-20210118083750168-2110318472.png)
### 建立專案結構
此時還先不要著急去配置SSM,我們現在專案連個基本的結構都沒有呢,你核心程式碼寫在哪,你測試在哪些,你資源放哪這些都是我們要去建立的。
首先,我們在src路徑下新建test資料夾,然後在src/main路徑下新建java和resources資料夾。建立好資料夾後,右鍵點選資料夾,然後拖到下方,選擇Mark Directory as,然後選擇對應的目錄結構。
java資料夾對應SourcesRoot,代表標記為專案原始碼路徑,程式碼就寫在這裡。
resources資料夾對應ResourcesRoot,代表標記為資源路徑,所有資源比如配置檔案就放在這。
test資料夾對應TestSourcesRoot,代表標記為測試路徑,測試程式碼都會放在這裡。
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083750451-95754788.png)
資料夾指定好後,我們就要在java資料夾下建立我們的程式碼包結構。包的話就分為最基本的controller、service、mapper、entity。包建好後目錄結構如下:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083750773-411266759.png)
## 匯入必備依賴包
基本的專案結構整理好後,接下來我們就要開始對SSM進行整合了。首先肯定要做的就是在pom.xml檔案中匯入必備的依賴包,直接複製貼上就好了,各個地方都做了註釋說明:
```xml
UTF-8
1.8
1.8
5.1.48
5.2.0.RELEASE
2.10.0
junit
junit
4.12
test
ch.qos.logback
logback-classic
1.2.3
org.projectlombok
lombok
1.18.10
provided
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
1.1.12
org.mybatis
mybatis
3.4.6
javax
javaee-api
8.0
provided
javax.servlet
jstl
1.2
com.fasterxml.jackson.core
jackson-core
${jackson.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
com.fasterxml.jackson.core
jackson-annotations
${jackson.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.aspectj
aspectjweaver
1.9.4
org.springframework
spring-test
${spring.version}
test
org.mybatis
mybatis-spring
1.3.2
```
## Spring與Mybatis整合
### 資料庫配置
在進行整合之前我們來準備一下資料庫,好接下來進行一個完整的演示。我這裡用的是MySQL 5.7.25,咱們建立一個名為ssm_demo的資料庫,執行語句新建一張user表並插入兩條測試資料:
```sql
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '賬戶名',
`password` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '賬戶密碼',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `user` VALUES (1, 'admin', '123456');
INSERT INTO `user` VALUES (2, 'rudecrab', '654321');
```
然後我們在entity包下建立和資料庫表對應的實體類User:
```java
@Data // lombok註解,自動生成Getter、Setter、toString方法
public class User implements Serializable {
private Long id;
private String name;
private String password;
}
```
然後我們在resources資料夾下建立`database.properties`檔案來配置資料庫連線的相關資訊(這裡根據自己的資料庫資訊配置哦),等下整合Mybatis要用到的:
```properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_demo?characterEncoding=utf-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
```
### logback日誌配置
真實專案中一般是要觀察日誌輸出的,我們再配置一下日誌。在resources目錄下新建`logback.xml`檔案。**注意啊,在尾部需要指定某個包,這個根據自己專案結構包名來設定**:
```xml
%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%-5p]) %highlight([%t]) %boldMagenta([%C]) %green([%L]) %m%n
ERROR
DENY
ACCEPT
[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n
${LOG_INFO_HOME}//%d.log
30
ERROR
[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n
${LOG_ERROR_HOME}//%d.log
30
```
### Mybatis全域性設定
現在我們開始終於可以進行Spring和Mybatis的整合了。我們先在resources資料夾下新建`mybatis-config.xml`檔案來對Mybatis進行全域性配置,這裡我習慣配置這些,根據自己的需求來就好:
```xml
```
### Spring-Myabtis整合配置
再來新建`spring-mybatis.xml`檔案,這個檔案就是用來做整合的!**注意啊,其中很多設定需要指定某個包,這個根據自己專案結構包名來設定**,註釋寫的很清楚了:
```xml
```
### JUnit測試
至此Spring和Myabtis已經整合配置好了,口說無憑,咱們還是得測試一下看下效果。在測試之前我們得先建立好mapper介面檔案、myabtis對映xml檔案、service介面和實現類:
![](https://img2020.cnblogs.com/news/1496775/202101/1496775-20210118083751198-1324796407.png)
UserMapper介面專門用來宣告各種資料庫操作方法,`@Repository`註解將其定義為Spring所管理的Bean:
```java
@Repository
public interface UserMapper {
/**
* 從資料庫中查詢出所有的User物件
* @return User物件集合
*/
List selectAll();
}
```
UserMapper.xml對映檔案用來寫方法對應要執行的SQL語句:
```xml
```
UserService介面用來宣告關於User的業務方法:
```java
public interface UserService {
/**
* 從資料庫中查詢出所有的User物件
* @return User物件集合
*/
List getAll();
}
```
UserServiceImpl實體類用來實現關於User的業務邏輯,`@Service`註解和`@Repository`註解用處一樣,將其定義為Bean。`@Transactional`註解為宣告式事務,如果該業務層的方法有異常丟擲則會觸發事務回滾。然後使用`@Autowired`註解在私有屬性上,自動載入Bean,無需我們手動建立UserMapper了:
```java
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List getAll() {
return userMapper.selectAll();
}
}
```
相關類和檔案都建好了,現在我們在test資料夾下建立一個測試類UserServiceTest,**一定要在測試類上加上那兩個註解**,否則無法正常使用Spring相關功能:
```java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void getAll() {
System.out.println(userService.getAll());
System.out.println(userService.getAll());
}
}
```
執行後我們就可以看到執行結果了:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083751463-1381176145.png)
可以看到結果正常顯示,並且日誌也列印在了控制檯上。**這代表我們已經完成了Spring和Mybatis的整合!**
### 思路
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083751838-625943082.png)
## SpringMVC
### spring-mvc.xml
我們接下來配置SpringMVC,在resources目錄下新建`spring-mvc.xml`檔案進行配置。**注意啊,其中設定需要指定某個包,這個根據自己專案結構包名來設定**:
```xml
```
### web.xml
最後一個配置自然就是在web.xml裡進行整合了,主要配置三點:
1. 配置Spring IOC容器,為了mybatis做準備
2. 配置SpringMVC的前端控制器
3. 配置字元編碼過濾器
```xml
contextConfigLocation
classpath:spring-mybatis.xml
org.springframework.web.context.ContextLoaderListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
SpringMVC
/
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
```
### 最終測試
以上,所有的配置都弄好了,那麼接下來咱們就跑一個最簡單的web專案來看看是否整合成功!還記得我們在在`spring-mvc.xml`檔案中配置的檢視解析字首嘛,我們在**/WEB-INF/views/**資料夾下新建一個index.jsp檔案:
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首頁-RudeCrab
<%--迴圈提取userList中的元素--%>
```
接下來再在controller包下新建一個控制器類來定義訪問介面:
```java
@Controller
@RequestMapping(value = "user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/getList")
public String getList(Model model) {
// 將資料存到model物件裡,這樣jsp就能訪問資料
model.addAttribute("userList", userService.getAll());
// 返回jsp檔名
return "index";
}
@GetMapping("/getJson")
@ResponseBody
public List getList() {
// 如果想做前後端分離的話可以加上@ResponseBody註解,直接返回資料物件,這樣前端就可以通過獲取json來渲染資料了
return userService.getAll();
}
}
```
然後我們啟動Tomcat,在瀏覽器中訪問介面:
![](https://img2020.cnblogs.com/news/1496775/202101/1496775-20210118083752357-194813007.png)
可以看到我們成功的訪問到了資料,至此SSM完全整合完畢!
# 總結
## 思維導圖
整體的整合配置思路已經畫好思維導圖了,其中每個節點上都寫好了比較詳細的備註,可以下載檔案後觀看。檔案放在末位的github地址中:
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210118083752607-547416551.png)
## github地址
https://github.com/RudeCrab/rude-java
上面包含了整個專案,clone下來用idea開啟即可執行!同時也放上了思維導圖檔案。如果對你有幫助麻煩點一個star,專案中還有其他的【專案實踐】,將來我也會不斷更新更多的專案實踐!
![](https://img2020.cnblogs.com/blog/1496775/202101/1496775-20210108125800650-1747993
- ${user}