文章轉自黑馬程序員SpringBoot學習筆記,學習網址:黑馬程序員SpringBoot2教程
1.整合JUnit
? SpringBoot技術的定位用于簡化開發(fā),再具體點是簡化Spring程序的開發(fā)。所以在整合任意技術的時候,如果你想直觀感觸到簡化的效果,你必須先知道使用非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(){
//執(zhí)行要測試的對象對應的方法
System.out.println(accountService.findById(2));
}
}
? 其中核心代碼是前兩個注解,第一個注解@RunWith是設置Spring專用于測試的類運行器,簡單說就是Spring程序執(zhí)行程序有自己的一套獨立的運行程序的方式,不能使用JUnit提供的類運行方式了,必須指定一下,但是格式是固定的,琢磨一下,每次都指定一樣的東西,這個東西寫起來沒有技術含量啊,第二個注解@ContextConfiguration是用來設置Spring核心配置文件或配置類的,簡單說就是加載Spring的環(huán)境你要告訴Spring具體的環(huán)境配置是在哪里寫的,雖然每次加載的文件都有可能不同,但是仔細想想,如果文件名是固定的,這個貌似也是一個固定格式。似然有可能是固定格式,那就有可能每次都寫一樣的東西,也是一個沒有技術含量的內容書寫
? SpringBoot就抓住上述兩條沒有技術含量的內容書寫進行開發(fā)簡化,能走默認值的走默認值,能不寫的就不寫,具體格式如下
@SpringBootTest
class Springboot04JunitApplicationTests {
//注入你要測試的對象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//執(zhí)行要測試的對象對應的方法
bookDao.save();
System.out.println("two...");
}
}
? 看看這次簡化成什么樣了,一個注解就搞定了,而且還沒有參數(shù),再體會SpringBoot整合其他技術的優(yōu)勢在哪里,就兩個字——簡化。使用一個注解@SpringBootTest替換了前面兩個注解。至于內部是怎么回事?和之前一樣,只不過都走默認值。
? 這個時候有人就問了,你加載的配置類或者配置文件是哪一個?就是我們前面啟動程序使用的引導類。如果想手工指定引導類有兩種方式,第一種方式使用屬性的形式進行,在注解@SpringBootTest中添加classes屬性指定配置類
@SpringBootTest(classes = Springboot04JunitApplication.class)
class Springboot04JunitApplicationTests {
//注入你要測試的對象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//執(zhí)行要測試的對象對應的方法
bookDao.save();
System.out.println("two...");
}
}
? 第二種方式回歸原始配置方式,仍然使用@ContextConfiguration注解進行,效果是一樣的
@SpringBootTest
@ContextConfiguration(classes = Springboot04JunitApplication.class)
class Springboot04JunitApplicationTests {
//注入你要測試的對象
@Autowired
private BookDao bookDao;
@Test
void contextLoads() {
//執(zhí)行要測試的對象對應的方法
bookDao.save();
System.out.println("two...");
}
}
? 溫馨提示
? 使用SpringBoot整合JUnit需要保障導入test對應的starter,由于初始化項目時此項是默認導入的,所以此處沒有提及,其實和之前學習的內容一樣,用什么技術導入對應的starter即可。
總結文章來源地址http://www.zghlxwxcb.cn/news/detail-422349.html
- 導入測試對應的starter
- 測試類使用@SpringBootTest修飾
- 使用自動裝配的形式添加要測試的對象
- 測試類如果存在于引導類所在包或子包中無需指定引導類
- 測試類如果不存在于引導類所在的包或子包中需要通過classes屬性指定引導類
2.整合MyBatis
? 整合完JUnit下面再來說一下整合MyBatis,這個技術是大部分公司都要使用的技術,務必掌握。如果對Spring整合MyBatis不熟悉的小伙伴好好復習一下,下面列舉出原始整合的全部內容,以配置類的形式為例進行
-
導入坐標,MyBatis坐標不能少,Spring整合MyBatis還有自己專用的坐標,此外Spring進行數(shù)據(jù)庫操作的jdbc坐標是必須的,剩下還有mysql驅動坐標,本例中使用了Druid數(shù)據(jù)源,這個倒是可以不要
<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操作數(shù)據(jù)庫必選的包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
-
Spring核心配置
@Configuration @ComponentScan("com.itheima") @PropertySource("jdbc.properties") public class SpringConfig { }
-
MyBatis要交給Spring接管的bean
//定義mybatis專用的配置類 @Configuration public class MyBatisConfig { // 定義創(chuàng)建SqlSessionFactory對應的bean @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){ //SqlSessionFactoryBean是由mybatis-spring包提供的,專用于整合用的對象 SqlSessionFactoryBean sfb = new SqlSessionFactoryBean(); //設置數(shù)據(jù)源替代原始配置中的environments的配置 sfb.setDataSource(dataSource); //設置類型別名替代原始配置中的typeAliases的配置 sfb.setTypeAliasesPackage("com.itheima.domain"); return sfb; } // 定義加載所有的映射配置 @Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.itheima.dao"); return msc; } }
-
數(shù)據(jù)源對應的bean,此處使用Druid數(shù)據(jù)源
@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; } }
-
數(shù)據(jù)庫連接信息(properties格式)
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false jdbc.username=root jdbc.password=root
上述格式基本上是簡格式了,要寫的東西還真不少。下面看看SpringBoot整合MyBaits格式
步驟①:創(chuàng)建模塊時勾選要使用的技術,MyBatis,由于要操作數(shù)據(jù)庫,還要勾選對應數(shù)據(jù)庫
? 或者手工導入對應技術的starter,和對應數(shù)據(jù)庫的坐標
<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>
步驟②:配置數(shù)據(jù)源相關信息,沒有這個信息你連接哪個數(shù)據(jù)庫都不知道
#2.配置相關信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db
username: root
password: root
? 完了,就這么多,沒了。有人就很納悶,這就結束了?對,這就結束了,SpringBoot把配置中所有可能出現(xiàn)的通用配置都簡化了。下面就可以寫一下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));
}
}
? 完美,開發(fā)從此變的就這么簡單。再體會一下SpringBoot如何進行第三方技術整合的,是不是很優(yōu)秀?具體內部的原理到原理篇再展開講解
? 注意:當前使用的SpringBoot版本是2.5.4,對應的坐標設置中Mysql驅動使用的是8x版本。當SpringBoot2.4.3(不含)版本之前會出現(xiàn)一個小BUG,就是MySQL驅動升級到8以后要求強制配置時區(qū),如果不設置會出問題。解決方案很簡單,驅動url上面添加上對應設置就行了
#2.配置相關信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root
? 這里設置的UTC是全球標準時間,你也可以理解為是英國時間,中國處在東八區(qū),需要在這個基礎上加上8小時,這樣才能和中國地區(qū)的時間對應的,也可以修改配置不寫UTC,寫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: root
? 如果不想每次都設置這個東西,也可以去修改mysql中的配置文件mysql.ini,在mysqld項中添加default-time-zone=+8:00也可以解決這個問題。其實方式方法很多,這里就說這么多吧。
? 此外在運行程序時還會給出一個提示,說數(shù)據(jù)庫驅動過時的警告,根據(jù)提示修改配置即可,棄用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
-
數(shù)據(jù)庫連接相關信息轉換成配置
-
數(shù)據(jù)庫SQL映射需要添加@Mapper被容器識別到
-
MySQL 8.X驅動強制要求設置時區(qū)
- 修改url,添加serverTimezone設定
- 修改MySQL數(shù)據(jù)庫配置
-
驅動類過時,提醒更換為com.mysql.cj.jdbc.Driver
3.整合MyBatis-Plus
? 做完了兩種技術的整合了,各位小伙伴要學會總結,我們做這個整合究竟哪些是核心?總結下來就兩句話
- 導入對應技術的starter坐標
- 根據(jù)對應技術的要求做配置
? 雖然看起來有點虛,但是確實是這個理兒,下面趁熱打鐵,再換一個技術,看看是不是上面這兩步。
? 接下來在MyBatis的基礎上再升級一下,整合MyBaitsPlus(簡稱MP),國人開發(fā)的技術,符合中國人開發(fā)習慣,誰用誰知道。來吧,一起做整合
步驟①:導入對應的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-***
? 而這個坐標的名字書寫比較特殊,是第三方技術名稱在前,boot和starter在后。
starter所屬 | 命名規(guī)則 | 示例 |
---|---|---|
官方提供 | spring-boot-starter-技術名稱 | spring-boot-starter-web spring-boot-starter-test |
第三方提供 | 第三方技術名稱-spring-boot-starter | druid-spring-boot-starter |
第三方提供 | 第三方技術名稱-boot-starter(第三方技術名稱過長,簡化命名) | mybatis-plus-boot-starter |
溫馨提示
? 有些小伙伴在創(chuàng)建項目時想通過勾選的形式找到這個名字,別翻了,沒有。截止目前,SpringBoot官網還未收錄此坐標,而我們Idea創(chuàng)建模塊時讀取的是SpringBoot官網的Spring Initializr,所以也沒有。如果換用阿里云的url創(chuàng)建項目可以找到對應的坐標
步驟②:配置數(shù)據(jù)源相關信息
#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的接口,這個接口中幫助開發(fā)者預定了若干個常用的API接口,簡化了通用API接口的開發(fā)工作。
? 下面就可以寫一個測試類進行測試了,此處省略。
溫馨提示
? 目前數(shù)據(jù)庫的表名定義規(guī)則是tbl_模塊名稱,為了能和實體類相對應,需要做一個配置,相關知識各位小伙伴可以到MyBatisPlus課程中去學習,此處僅給出解決方案。配置application.yml文件,添加如下配置即可,設置所有表名的通用前綴名
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_ #設置所有表的通用前綴名稱為tbl_
總結
- 手工添加MyBatis-Plus對應的starter
- 數(shù)據(jù)層接口使用BaseMapper簡化開發(fā)
- 需要使用的第三方技術無法通過勾選確定時,需要手工添加坐標
4.整合Druid
? 使用SpringBoot整合了3個技術了,發(fā)現(xiàn)套路基本相同,導入對應的starter,然后做配置,各位小伙伴需要一直強化這套思想。下面再整合一個技術,繼續(xù)深入強化此思想。
? 前面整合MyBatis和MP的時候,使用的數(shù)據(jù)源對象都是SpringBoot默認的數(shù)據(jù)源對象,下面我們手工控制一下,自己指定了一個數(shù)據(jù)源對象,Druid。
? 在沒有指定數(shù)據(jù)源時,我們的配置如下:
#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
? 此時雖然沒有指定數(shù)據(jù)源,但是根據(jù)SpringBoot的德行,肯定幫我們選了一個它認為最好的數(shù)據(jù)源對象,這就是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的身影,如果需要更換數(shù)據(jù)源,其實只需要兩步即可。
- 導入對應的技術坐標
- 配置使用指定的數(shù)據(jù)源類型
? 下面就切換一下數(shù)據(jù)源對象
步驟①:導入對應的坐標(注意,是坐標,此處不是starter)
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
</dependencies>
步驟②:修改配置,在數(shù)據(jù)源配置中有一個type屬性,專用于指定數(shù)據(jù)源類型
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
? 這里其實要提出一個問題的,目前的數(shù)據(jù)源配置格式是一個通用格式,不管你換什么數(shù)據(jù)源都可以用這種形式進行配置。但是新的問題又來了,如果對數(shù)據(jù)源進行個性化的配置,例如配置數(shù)據(jù)源對應的連接數(shù)量,這個時候就有新的問題了。每個數(shù)據(jù)源技術對應的配置名稱都一樣嗎?肯定不是啊,各個廠商不可能提前商量好都寫一樣的名字啊,怎么辦?就要使用專用的配置格式了。這個時候上面這種通用格式就不能使用了,怎么辦?還能怎么辦?按照SpringBoot整合其他技術的通用規(guī)則來套啊,導入對應的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: root
? 注意觀察,配置項中,在datasource下面并不是直接配置url這些屬性的,而是先配置了一個druid節(jié)點,然后再配置的url這些東西。言外之意,url這個屬性時druid下面的屬性,那你能想到嗎?除了這4個常規(guī)配置外,還有druid專用的其他配置。通過提示功能可以打開druid相關的配置查閱
? 與druid相關的配置超過200條以上,這就告訴你,如果想做druid相關的配置,使用這種格式就可以了,這里就不展開描述了,太多了。
? 這是我們做的第4個技術的整合方案,還是那兩句話:導入對應starter,使用對應配置。沒了,SpringBoot整合其他技術就這么簡單粗暴。文章來源:http://www.zghlxwxcb.cn/news/detail-422349.html
總結
- 整合Druid需要導入Druid對應的starter
- 根據(jù)Druid提供的配置方式進行配置
- 整合第三方技術通用方式
- 導入對應的starter
- 根據(jù)提供的配置格式,配置非默認值對應的配置項
到了這里,關于SpringBoot整合JUnit--MyBatis--MyBatis-Plus--Druid的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!