1. 程式人生 > >【專案實踐】手把手帶你搞定SSM

【專案實踐】手把手帶你搞定SSM

> 以專案驅動學習,以實踐檢驗真知 # 前言 現在使用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中的元素--%>
  • ${user}
``` 接下來再在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