基於SpringBoot整合SSMP的詳細教程
基於SpringBoot實現SSMP整合
SpringBoot之所以好用,就是它能方便快捷的整合其他技術,這裡我們先介紹四種技術的整合:
- 整合JUnit
- 整合MyBatis
- 整合MyBatis-Plus
- 整合Druid
整合JUnit
SpringBoot技術的定位用於簡化開發,再具體點是簡化Spring程序的開發。所以在整合任意技術的時候,如果你想直觀感觸到簡化的效果,你必須先知道使用非SpringBoot技術時對應的整合是如何做的,然後再看基於SpringBoot的整合是如何做的,才能比對出來簡化在瞭哪裡。
我們先來看一下不使用SpringBoot技術時,Spring整合JUnit的制作方式
//加載spring整合junit專用的類運行器 @RunWith(SpringJUnit4ClassRunner.class) //指定對應的配置信息 @ContextConfiguration(classes = SpringConfig.class) public class AccountServiceTestCase { //註入你要測試的對象 @Autowired private AccountService accountService; @Test public void testGetById(){ //執行要測試的對象對應的方法 System.out.println(accountService.findById(2)); } }
其中核心代碼是前兩個註解:
第一個註解@RunWith是設置Spring專用的測試類運行器,簡單說就是Spring程序執行程序有自己的一套獨立的運行程序的方式,不能使用JUnit提供的類運行方式瞭,必須指定一下,但是格式是固定的,琢磨一下,每次都指定一樣的東西,這個東西寫起來沒有技術含量啊
第二個註解@ContextConfiguration是用來設置Spring核心配置文件或配置類的,簡單說就是加載Spring的環境你要告訴Spring具體的環境配置是在哪裡寫的,雖然每次加載的文件都有可能不同,但是仔細想想,如果文件名是固定的,這個貌似也是一個固定格式。既然有可能是固定格式,那就有可能每次都寫一樣的東西,也是一個沒有技術含量的內容書寫
SpringBoot就抓住上述兩條沒有技術含量的內容書寫進行開發簡化,能走默認值的走默認值,能不寫的就不寫,具體格式如下:
@SpringBootTest class Springboot04JunitApplicationTests { //註入你要測試的對象 @Autowired private BookDao bookDao; @Test void contextLoads() { //執行要測試的對象對應的方法 bookDao.save(); System.out.println("two..."); } }
看看這次簡化成什麼樣瞭,一個註解就搞定瞭,而且還沒有參數,再體會SpringBoot整合其他技術的優勢在哪裡,就兩個字——簡化。使用一個註解@SpringBootTest替換瞭前面兩個註解。至於內部是怎麼回事?和之前一樣,隻不過都走默認值。
這個時候有人就問瞭,你加載的配置類或者配置文件是哪一個?就是我們前面啟動程序使用的引導類。如果想手工指定引導類有兩種方式,第一種方式使用屬性的形式進行,在註解@SpringBootTest中添加classes屬性指定配置類:
@SpringBootTest(classes = 引導類的名字.class) class Springboot04JunitApplicationTests { //註入你要測試的對象 @Autowired private BookDao bookDao; @Test void contextLoads() { //執行要測試的對象對應的方法 bookDao.save(); System.out.println("two..."); } }
第二種方式回歸原始配置方式,仍然使用@ContextConfiguration註解進行,效果是一樣的:
@SpringBootTest @ContextConfiguration(classes = Springboot04JunitApplication.class) class Springboot04JunitApplicationTests { //註入你要測試的對象 @Autowired private BookDao bookDao; @Test void contextLoads() { //執行要測試的對象對應的方法 bookDao.save(); System.out.println("two..."); } }
溫馨提示
使用SpringBoot整合JUnit需要保障導入test對應的starter,由於初始化項目時此項是默認導入的,所以此處沒有提及
總結
- 導入測試對應的starter
- 測試類使用@SpringBootTest修飾
- 使用自動裝配的形式添加要測試的對象
- 測試類如果存在於引導類所在包或子包中無需指定引導類
- 測試類如果不存在於引導類所在的包或子包中需要通過classes屬性指定引導類
整合MyBatis
老規矩我們還是先寫一下原始整合方案:
導入坐標,MyBatis坐標不能少,Spring整合MyBatis還有自己專用的坐標,此外Spring進行數據庫操作的jdbc坐標是必須的,剩下還有mysql驅動坐標,本例中使用瞭Druid數據源,這個倒是可以不要
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--1.導入mybatis與spring整合的jar包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!--導入spring操作數據庫必選的包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
Spring核心配置
@Configuration @ComponentScan("com.nefu") @PropertySource("jdbc.properties") public class SpringConfig { }
MyBatis要交給Spring接管的bean
//定義mybatis專用的配置類 @Configuration public class MyBatisConfig { // 定義創建SqlSessionFactory對應的bean @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){ //SqlSessionFactoryBean是由mybatis-spring包提供的,專用於整合用的對象 SqlSessionFactoryBean sfb = new SqlSessionFactoryBean(); //設置數據源替代原始配置中的environments的配置 sfb.setDataSource(dataSource); //設置類型別名替代原始配置中的typeAliases的配置 sfb.setTypeAliasesPackage("com.nefu.domain"); return sfb; } // 定義加載所有的映射配置 @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.nefu.dao"); return msc; } }
數據源對應的bean,此處使用Druid數據源
@Configuration public class JdbcConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } }
數據庫連接信息(properties格式)
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false jdbc.username=root jdbc.password=*********
上述格式基本上是最簡格式瞭,要寫的東西還真不少。
這裡是最簡格式,所以我們沒有寫業務層,我們測試的時候直接通過dao的自動生成對象去操作數據庫
下面看看SpringBoot整合MyBaits格式:
步驟①:創建模塊
步驟②:勾選要使用的技術,MyBatis,由於要操作數據庫,還要勾選對應數據庫
或者手工導入對應技術的starter,和對應數據庫的坐標
<dependencies> <!--1.導入對應的starter--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
步驟③:配置數據源相關信息,沒有這個信息你連接哪個數據庫都不知道
#2.配置相關信息 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db username: root password: ****************
結束瞭,對,這就結束瞭,SpringBoot把配置中所有可能出現的通用配置都簡化瞭。下面寫一個MyBatis程序運行需要的Dao(或者Mapper)就可以運行瞭
實體類
public class Book { private Integer id; private String type; private String name; private String description; ······ }
映射接口(Dao)
@Mapper public interface BookDao { @Select("select * from tbl_book where id = #{id}") public Book getById(Integer id); }
測試類
@SpringBootTest class Springboot05MybatisApplicationTests { @Autowired private BookDao bookDao; @Test void contextLoads() { System.out.println(bookDao.getById(1)); } }
結果:
註意:當前使用的SpringBoot版本是2.5.4,對應的坐標設置中Mysql驅動使用的是8x版本。使用SpringBoot2.4.3(不含)之前版本會出現一個小BUG,就是MySQL驅動升級到8以後要求強制配置時區,如果不設置會出問題。解決方案很簡單,驅動url上面添加上對應設置就行瞭
#2.配置相關信息 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: ********
這裡設置的UTC是全球標準時間,你也可以理解為是英國時間,中國處在東八區,需要在這個基礎上加上8小時,這樣才能和中國地區的時間對應的,也可以修改配置為Asia/Shanghai,同樣可以解決這個問題。
#2.配置相關信息 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=Asia/Shanghai username: root password: *********
如果不想每次都設置這個東西,也可以去修改mysql中的配置文件mysql.ini,在mysqld項中添加default-time-zone=+8:00也可以解決這個問題。其實方式方法很多,這裡就說這麼多吧。
此外在運行程序時還會給出一個提示,說數據庫驅動過時的警告,根據提示修改配置即可,棄用com.mysql.jdbc.Driver,換用com.mysql.cj.jdbc.Driver。前面的例子中已經更換瞭驅動瞭,在此說明一下。
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
總結
- 整合操作需要勾選MyBatis技術,也就是導入MyBatis對應的starter
- 數據庫連接相關信息轉換成配置
- 數據庫SQL映射需要添加@Mapper被容器識別到
- MySQL 8.X驅動強制要求設置時區
- 修改url,添加serverTimezone設定
- 修改MySQL數據庫配置
- 驅動類過時,提醒更換為com.mysql.cj.jdbc.Driver
整合MyBatis-Plus
經過前面兩種技術的整合,我們發現第三方技術的整合無非就是兩步:
- 導入對應技術的starter坐標
- 根據對應技術的要求做配置
接下來在MyBatis的基礎上再升級一下,整合MyBaitsPlus(簡稱MP)
步驟①:導入對應的starter
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
關於這個坐標,此處要說明一點,之前我們看的starter都是spring-boot-starter-???,也就是說都是下面的格式
Spring-boot-start-***
而MyBatis與MyBatisPlus這兩個坐標的名字書寫比較特殊,是第三方技術名稱在前,boot和starter在後。此處簡單提一下命名規范,後期原理篇會再詳細講解
starter所屬 | 命名規則 | 示例 |
---|---|---|
官方提供 | spring-boot-starter-技術名稱 | spring-boot-starter-web spring-boot-starter-test |
第三方提供 | 第三方技術名稱-spring-boot-starter | mybatis-spring-boot-starter druid-spring-boot-starter |
第三方提供 | 第三方技術名稱-boot-starter(第三方技術名稱過長,簡化命名) | mybatis-plus-boot-starter |
溫馨提示
有些小夥伴在創建項目時想通過勾選的形式找到這個名字,別翻瞭,沒有。截止目前,SpringBoot官網還未收錄此坐標,而我們Idea創建模塊時讀取的是SpringBoot官網的Spring Initializr,所以也沒有。如果換用阿裡雲的url創建項目可以找到對應的坐標。
步驟②:配置數據源相關信息
#2.配置相關信息 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db username: root password: root
沒瞭,就這麼多,剩下的就是寫MyBaitsPlus的程序瞭
映射接口(Dao)
@Mapper public interface BookDao extends BaseMapper<Book> { }
核心在於Dao接口繼承瞭一個BaseMapper的接口,這個接口中幫助開發者預定瞭若幹個常用的API接口,簡化瞭通用API接口的開發工作。
溫馨提示
目前數據庫的表名定義規則是tbl_模塊名稱,為瞭能和實體類相對應,需要做一個配置,相關知識我前面mybatis-plus的文章中已經有詳細解釋,此處僅給出解決方案。配置application.yml文件,添加如下配置即可,設置所有表名的通用前綴名
mybatis-plus: global-config: db-config: table-prefix: tbl_ #設置所有表的通用前綴名稱為tbl_
總結
- 手工添加MyBatis-Plus對應的starter
- 數據層接口使用BaseMapper簡化開發
- 需要使用的第三方技術無法通過勾選確定時,需要手工添加坐標 整合Druid
前面整合MyBatis和MyBatisPlus的時候,使用的數據源對象都是SpringBoot默認的數據源對象,下面我們手工控制一下,自己指定瞭一個數據源對象,Druid。
在沒有指定數據源時,我們的配置如下:
#2.配置相關信息 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=Asia/Shanghai username: root password: root
此時雖然沒有指定數據源,但是根據SpringBoot的德行,肯定幫我們選瞭一個它認為最好的數據源對象,這就是HiKari。通過啟動日志可以查看到對應的身影。
2021-11-29 09:39:15.202 INFO 12260 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 – Starting…
2021-11-29 09:39:15.208 WARN 12260 — [ main] com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation.
2021-11-29 09:39:15.551 INFO 12260 — [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 – Start completed.
上述信息中每一行都有HiKari的身影,如果需要更換數據源,其實隻需要兩步即可。
- 導入對應的技術坐標
- 配置使用指定的數據源類型
下面就切換一下數據源對象
步驟①:導入對應的坐標(註意,是坐標,此處不是starter)
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> </dependencies>
步驟②:修改配置,在數據源配置中有一個type屬性,專用於指定數據源類型
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: ********* type: com.alibaba.druid.pool.DruidDataSource
這裡其實要提出一個問題的,目前的數據源配置格式是一個通用格式,不管你換什麼數據源都可以用這種形式進行配置。但是新的問題又來瞭,如果對數據源進行個性化的配置,例如配置數據源對應的連接數量,這個時候就有新的問題瞭。每個數據源技術對應的配置名稱都一樣嗎?肯定不是啊,各個廠商不可能提前商量好都寫一樣的名字啊,怎麼辦?就要使用專用的配置格式瞭。這個時候上面這種通用格式就不能使用瞭,怎麼辦?還能怎麼辦?按照SpringBoot整合其他技術的通用規則來套啊,導入對應的starter,進行相應的配置即可。
步驟①:導入對應的starter
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> </dependencies>
步驟②:修改配置
spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC username: root password: *************
註意觀察,配置項中,在datasource下面並不是直接配置url這些屬性的,而是先配置瞭一個druid節點,然後再配置的url這些東西。言外之意,url這個屬性是druid下面的屬性,那你能想到什麼?除瞭這4個常規配置外,還有druid專用的其他配置。通過提示功能可以打開druid相關的配置查閱
與druid相關的配置超過200條以上,這就告訴你,如果想做druid相關的配置,使用這種格式就可以瞭,這裡就不展開描述瞭,太多瞭。
這是我們做的第4個技術的整合方案,還是那兩句話:導入對應starter,使用對應配置。沒瞭,SpringBoot整合其他技術就這麼簡單粗暴。
總結
- 整合Druid需要導入Druid對應的starter
- 根據Druid提供的配置方式進行配置
- 整合第三方技術通用方式
- 導入對應的starter
- 根據提供的配置格式,配置非默認值對應的配置項
到此這篇關於SpringBoot如何整合SSMP的文章就介紹到這瞭,更多相關SpringBoot如何整合SSMP內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringBoot環境Druid數據源使用及特點
- Springboot2 集成 druid 加密數據庫密碼的配置方法
- SpringBoot內置數據源的持久化與解決方案
- springboot 整合druid及配置依賴
- Springboot如何根據實體類生成數據庫表