SpringBoot深入刨析數據層技術
前置導入
之前做SSMP整合的時候數據層解決方案涉及到了,MySQL數據庫與MyBatisPlus框架,后面又涉及到了Druid數據源的配置,所以現在數據層解決方案可以說是Mysql+Druid+MyBatisPlus。而三個技術分別對應了數據層操作的三個層面:
- 數據源技術:Druid
- 持久化技術:MyBatisPlus
- 數據庫技術:MySQL
? 下面的研究就分為三個層面進行研究,對應上面列出的三個方面,咱們就從第一個數據源技術開始說起。
數據源技術
目前我們使用的數據源技術是Druid,運行時可以在日志中看到對應的數據源初始化信息,具體如下:
INFO 28600 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
INFO 28600 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
? 如果不使用Druid數據源,程序運行后是什么樣子呢?是獨立的數據庫連接對象還是有其他的連接池技術支持呢?將Druid技術對應的starter去掉再次運行程序可以在日志中找到如下初始化信息:
INFO 31820 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
INFO 31820 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
? 雖然沒有DruidDataSource相關的信息了,但是我們發(fā)現日志中有HikariDataSource這個信息,就算不懂這是個什么技術,看名字也能看出來,以DataSource結尾的名稱,這一定是一個數據源技術。我們又沒有手工添加這個技術,這個技術哪里來的呢?它就是springboot內嵌數據源。
? 數據層技術是每一個企業(yè)級應用程序都會用到的,而其中必定會進行數據庫連接的管理。springboot根據開發(fā)者的習慣出發(fā),開發(fā)者提供了數據源技術,就用你提供的,開發(fā)者沒有提供,那總不能手工管理一個一個的數據庫連接對象啊,怎么辦?我給你一個默認的就好了,這樣省心又省事,大家都方便。
? springboot提供了3款內嵌數據源技術,分別如下:
- HikariCP
- Tomcat提供DataSource
- Commons DBCP
? 第一種,HikartCP,這是springboot官方推薦的數據源技術,作為默認內置數據源使用。啥意思?你不配置數據源,那就用這個。
? 第二種,Tomcat提供的DataSource,如果不想用HikartCP,并且使用tomcat作為web服務器進行web程序的開發(fā),使用這個。為什么是Tomcat,不是其他web服務器呢?因為web技術導入starter后,默認使用內嵌tomcat,既然都是默認使用的技術了,那就一用到底,數據源也用它的。有人就提出怎么才能不使用HikartCP用tomcat提供的默認數據源對象呢?把HikartCP技術的坐標排除掉就OK了。
? 第三種,DBCP,這個使用的條件就更苛刻了,既不使用HikartCP也不使用tomcat的DataSource時,默認給你用這個。
? springboot這心操的,也是稀碎啊,就怕你自己管不好連接對象,給你一頓推薦,真是開發(fā)界的最強輔助。既然都給你奶上了,那就受用吧,怎么配置使用這些東西呢?之前我們配置druid時使用druid的starter對應的配置如下:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ************
? 換成是默認的數據源HikariCP后,直接把druid刪掉就行了,如下:
注意:這個地方同時還要把Druid的starter給刪掉才行
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *****************
? 當然,也可以寫上是對hikari做的配置,但是url地址要單獨配置,如下(也就是另一種寫法):
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *************
? 這就是配置hikari數據源的方式。如果想對hikari做進一步的配置,可以繼續(xù)配置其獨立的屬性。例如:
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: **************
maximum-pool-size: 50
? 如果不想使用hikari數據源,使用tomcat的數據源或者DBCP配置格式也是一樣的。以后我們做數據層時,數據源對象的選擇就不再是單一的使用druid數據源技術了,可以根據需要自行選擇。
總結
springboot技術提供了3種內置的數據源技術,分別是Hikari、tomcat內置數據源、DBCP
持久化技術
說完數據源解決方案,再來說一下持久化解決方案。springboot充分發(fā)揮其最強輔助的特征,給開發(fā)者提供了一套現成的數據層技術,叫做JdbcTemplate。其實這個技術不能說是springboot提供的,因為不使用springboot技術,一樣能使用它,誰提供的呢?spring技術提供的,所以在springboot技術范疇中,這個技術也是存在的,畢竟springboot技術是加速spring程序開發(fā)而創(chuàng)建的。
? 這個技術其實就是回歸到jdbc最原始的編程形式來進行數據層的開發(fā),下面直接上操作步驟:
步驟①:導入jdbc對應的坐標,記得是starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
步驟②:自動裝配JdbcTemplate對象
@SpringBootTest
class Springboot15SqlApplicationTests {
@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
}
}
步驟③:使用JdbcTemplate實現查詢操作(非實體類封裝數據的查詢操作)
@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
String sql = "select * from tbl_book";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
System.out.println(maps);
}
結果:

步驟④:使用JdbcTemplate實現查詢操作(實體類封裝數據的查詢操作)
@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
String sql = "select * from tbl_book";
RowMapper<Book> rm = new RowMapper<Book>() {
@Override
public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
Book temp = new Book();
temp.setId(rs.getInt("id"));
temp.setName(rs.getString("name"));
temp.setType(rs.getString("type"));
temp.setDescription(rs.getString("description"));
return temp;
}
};
List<Book> list = jdbcTemplate.query(sql, rm);
System.out.println(list);
}結果:

步驟⑤:使用JdbcTemplate實現增刪改操作
@Test
void testJdbcTemplateSave(@Autowired JdbcTemplate jdbcTemplate){
String sql = "insert into tbl_book values(3,'springboot1','springboot2','springboot3')";
jdbcTemplate.update(sql);
}? 如果想對JdbcTemplate對象進行相關配置,可以在yml文件中進行設定,具體如下:
spring:
jdbc:
template:
query-timeout: -1 # 查詢超時時間
max-rows: 500 # 最大行數
fetch-size: -1 # 緩存行數
fetch-size可以提高我們的查詢性能。比如現在我們查了一萬條數據,那么一次給我們幾條呢?這個就可以由fetch-size來控制。假如一次給五十條,而我們也就用到了這五十條,那么效率會很高。而如果我們使用到50條之外的,它就會再來一次,效率降低。
總結
- SpringBoot內置JdbcTemplate持久化解決方案
- 使用JdbcTemplate需要導入spring-boot-starter-jdbc的坐標
數據庫技術
截止到目前,springboot給開發(fā)者提供了內置的數據源解決方案和持久化解決方案,在數據層解決方案三件套中還剩下一個數據庫,莫非springboot也提供有內置的解決方案?還真有,還不是一個,有三個
? springboot提供了3款內置的數據庫,分別是:
- H2
- HSQL
- Derby
? 以上三款數據庫除了可以獨立安裝之外,還可以像是tomcat服務器一樣,采用內嵌的形式運行在spirngboot容器中。內嵌在容器中運行,那必須是java對象啊,對,這三款數據庫底層都是使用java語言開發(fā)的。
? 我們一直使用MySQL數據庫就挺好的,為什么有需求用這個呢?原因就在于這三個數據庫都可以采用內嵌容器的形式運行,在應用程序運行后,如果我們進行測試工作,此時測試的數據無需存儲在磁盤上,但是又要測試使用,內嵌數據庫就方便了,運行在內存中,該測試測試,該運行運行,等服務器關閉后,一切煙消云散,多好,省得你維護外部數據庫了。這也是內嵌數據庫的最大優(yōu)點,方便進行功能測試。
? 下面以H2數據庫為例講解如何使用這些內嵌數據庫,操作步驟也非常簡單,簡單才好用嘛
步驟①:導入H2數據庫對應的坐標,一共2個
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
步驟②:將工程設置為web工程,啟動工程時啟動H2數據庫
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
步驟③:通過配置開啟H2數據庫控制臺訪問程序,也可以使用其他的數據庫連接軟件操作
spring:
h2:
console:
enabled: true
path: /h2
做完之后我們啟動服務器,然后訪問localhost/h2(已經提前設置端口為80),頁面顯示:

? web端訪問路徑/h2,訪問密碼123456,如果訪問失敗,先配置下列數據源,啟動程序運行后再次訪問/h2路徑就可以正常訪問了(成功訪問之后把以下內容去掉也是可以訪問的)
datasource:
url: jdbc:h2:~/test
hikari:
driver-class-name: org.h2.Driver
username: sa
password: 123456
然后我們就進入了如下網頁:

我們可以先創(chuàng)建一張表:

然后我們查看一下表:

我們往里面加兩條數據:
insert into tbl_book values(1,'springboot','springboot','springboot')
insert into tbl_book values(2,'springboot2','springboot2','springboot2')
我們再去查看一下表,發(fā)現數據已經成功添加了:

步驟④:使用JdbcTemplate或MyBatisPlus技術操作數據庫
這里我們只說了JdbcTemplate,MyBatisPlus技術與以前使用方法一樣。
此時數據源要寫好:

數據源的配置信息我們在第一次進入h2網頁的時候上面有寫
我們測試一下往里面添加數據:


? 其實我們只是換了一個數據庫而已,其他的東西都不受影響。一個重要提醒,別忘了,上線時,把內存級數據庫關閉,采用MySQL數據庫作為數據持久化方案,關閉方式就是設置enabled屬性為false即可。

總結
- H2內嵌式數據庫啟動方式,添加坐標,添加配置
- H2數據庫線上運行時請務必關閉
? 到這里SQL相關的數據層解決方案我們就說完了,現在的可選技術就豐富的多了。
- 數據源技術:Druid、Hikari、tomcat DataSource、DBCP
- 持久化技術:MyBatisPlus、MyBatis、JdbcTemplate
- 數據庫技術:MySQL、H2、HSQL、Derby
? 現在開發(fā)程序時就可以在以上技術中任選一種組織成一套數據庫解決方案了。

到此這篇關于SpringBoot深入刨析數據層技術的文章就介紹到這了,更多相關SpringBoot數據層 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA配置maven環(huán)境的詳細教程(Unable to import maven project報錯問題的解決)
這篇文章主要介紹了IDEA配置maven環(huán)境的詳細教程(Unable to import maven project問題的解決),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
基于OpenID?Connect及Token?Relay實現Spring?Cloud?Gateway
這篇文章主要介紹了基于OpenID?Connect及Token?Relay實現Spring?Cloud?Gateway,Spring?Cloud?Gateway旨在提供一種簡單而有效的方式來路由到API,并為API提供跨領域的關注點,如:安全性、監(jiān)控/指標和彈性2022-06-06

