SpringBoot深入刨析數(shù)據(jù)層技術(shù)
前置導(dǎo)入
之前做SSMP整合的時(shí)候數(shù)據(jù)層解決方案涉及到了,MySQL數(shù)據(jù)庫與MyBatisPlus框架,后面又涉及到了Druid數(shù)據(jù)源的配置,所以現(xiàn)在數(shù)據(jù)層解決方案可以說是Mysql+Druid+MyBatisPlus。而三個(gè)技術(shù)分別對(duì)應(yīng)了數(shù)據(jù)層操作的三個(gè)層面:
- 數(shù)據(jù)源技術(shù):Druid
- 持久化技術(shù):MyBatisPlus
- 數(shù)據(jù)庫技術(shù):MySQL
? 下面的研究就分為三個(gè)層面進(jìn)行研究,對(duì)應(yīng)上面列出的三個(gè)方面,咱們就從第一個(gè)數(shù)據(jù)源技術(shù)開始說起。
數(shù)據(jù)源技術(shù)
目前我們使用的數(shù)據(jù)源技術(shù)是Druid,運(yùn)行時(shí)可以在日志中看到對(duì)應(yīng)的數(shù)據(jù)源初始化信息,具體如下:
INFO 28600 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
INFO 28600 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
? 如果不使用Druid數(shù)據(jù)源,程序運(yùn)行后是什么樣子呢?是獨(dú)立的數(shù)據(jù)庫連接對(duì)象還是有其他的連接池技術(shù)支持呢?將Druid技術(shù)對(duì)應(yīng)的starter去掉再次運(yùn)行程序可以在日志中找到如下初始化信息:
INFO 31820 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
INFO 31820 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
? 雖然沒有DruidDataSource相關(guān)的信息了,但是我們發(fā)現(xiàn)日志中有HikariDataSource這個(gè)信息,就算不懂這是個(gè)什么技術(shù),看名字也能看出來,以DataSource結(jié)尾的名稱,這一定是一個(gè)數(shù)據(jù)源技術(shù)。我們又沒有手工添加這個(gè)技術(shù),這個(gè)技術(shù)哪里來的呢?它就是springboot內(nèi)嵌數(shù)據(jù)源。
? 數(shù)據(jù)層技術(shù)是每一個(gè)企業(yè)級(jí)應(yīng)用程序都會(huì)用到的,而其中必定會(huì)進(jìn)行數(shù)據(jù)庫連接的管理。springboot根據(jù)開發(fā)者的習(xí)慣出發(fā),開發(fā)者提供了數(shù)據(jù)源技術(shù),就用你提供的,開發(fā)者沒有提供,那總不能手工管理一個(gè)一個(gè)的數(shù)據(jù)庫連接對(duì)象啊,怎么辦?我給你一個(gè)默認(rèn)的就好了,這樣省心又省事,大家都方便。
? springboot提供了3款內(nèi)嵌數(shù)據(jù)源技術(shù),分別如下:
- HikariCP
- Tomcat提供DataSource
- Commons DBCP
? 第一種,HikartCP,這是springboot官方推薦的數(shù)據(jù)源技術(shù),作為默認(rèn)內(nèi)置數(shù)據(jù)源使用。啥意思?你不配置數(shù)據(jù)源,那就用這個(gè)。
? 第二種,Tomcat提供的DataSource,如果不想用HikartCP,并且使用tomcat作為web服務(wù)器進(jìn)行web程序的開發(fā),使用這個(gè)。為什么是Tomcat,不是其他web服務(wù)器呢?因?yàn)閣eb技術(shù)導(dǎo)入starter后,默認(rèn)使用內(nèi)嵌tomcat,既然都是默認(rèn)使用的技術(shù)了,那就一用到底,數(shù)據(jù)源也用它的。有人就提出怎么才能不使用HikartCP用tomcat提供的默認(rèn)數(shù)據(jù)源對(duì)象呢?把HikartCP技術(shù)的坐標(biāo)排除掉就OK了。
? 第三種,DBCP,這個(gè)使用的條件就更苛刻了,既不使用HikartCP也不使用tomcat的DataSource時(shí),默認(rèn)給你用這個(gè)。
? springboot這心操的,也是稀碎啊,就怕你自己管不好連接對(duì)象,給你一頓推薦,真是開發(fā)界的最強(qiáng)輔助。既然都給你奶上了,那就受用吧,怎么配置使用這些東西呢?之前我們配置druid時(shí)使用druid的starter對(duì)應(yīng)的配置如下:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ************
? 換成是默認(rèn)的數(shù)據(jù)源HikariCP后,直接把druid刪掉就行了,如下:
注意:這個(gè)地方同時(shí)還要把Druid的starter給刪掉才行
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *****************
? 當(dāng)然,也可以寫上是對(duì)hikari做的配置,但是url地址要單獨(dú)配置,如下(也就是另一種寫法):
spring:
datasource:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
hikari:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: *************
? 這就是配置hikari數(shù)據(jù)源的方式。如果想對(duì)hikari做進(jìn)一步的配置,可以繼續(xù)配置其獨(dú)立的屬性。例如:
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數(shù)據(jù)源,使用tomcat的數(shù)據(jù)源或者DBCP配置格式也是一樣的。以后我們做數(shù)據(jù)層時(shí),數(shù)據(jù)源對(duì)象的選擇就不再是單一的使用druid數(shù)據(jù)源技術(shù)了,可以根據(jù)需要自行選擇。
總結(jié)
springboot技術(shù)提供了3種內(nèi)置的數(shù)據(jù)源技術(shù),分別是Hikari、tomcat內(nèi)置數(shù)據(jù)源、DBCP
持久化技術(shù)
說完數(shù)據(jù)源解決方案,再來說一下持久化解決方案。springboot充分發(fā)揮其最強(qiáng)輔助的特征,給開發(fā)者提供了一套現(xiàn)成的數(shù)據(jù)層技術(shù),叫做JdbcTemplate。其實(shí)這個(gè)技術(shù)不能說是springboot提供的,因?yàn)椴皇褂胹pringboot技術(shù),一樣能使用它,誰提供的呢?spring技術(shù)提供的,所以在springboot技術(shù)范疇中,這個(gè)技術(shù)也是存在的,畢竟springboot技術(shù)是加速spring程序開發(fā)而創(chuàng)建的。
? 這個(gè)技術(shù)其實(shí)就是回歸到j(luò)dbc最原始的編程形式來進(jìn)行數(shù)據(jù)層的開發(fā),下面直接上操作步驟:
步驟①:導(dǎo)入jdbc對(duì)應(yīng)的坐標(biāo),記得是starter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
步驟②:自動(dòng)裝配JdbcTemplate對(duì)象
@SpringBootTest class Springboot15SqlApplicationTests { @Test void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){ } }
步驟③:使用JdbcTemplate實(shí)現(xiàn)查詢操作(非實(shí)體類封裝數(shù)據(jù)的查詢操作)
@Test void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){ String sql = "select * from tbl_book"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); System.out.println(maps); }
結(jié)果:
步驟④:使用JdbcTemplate實(shí)現(xiàn)查詢操作(實(shí)體類封裝數(shù)據(jù)的查詢操作)
@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); }
結(jié)果:
步驟⑤:使用JdbcTemplate實(shí)現(xiàn)增刪改操作
@Test void testJdbcTemplateSave(@Autowired JdbcTemplate jdbcTemplate){ String sql = "insert into tbl_book values(3,'springboot1','springboot2','springboot3')"; jdbcTemplate.update(sql); }
? 如果想對(duì)JdbcTemplate對(duì)象進(jìn)行相關(guān)配置,可以在yml文件中進(jìn)行設(shè)定,具體如下:
spring:
jdbc:
template:
query-timeout: -1 # 查詢超時(shí)時(shí)間
max-rows: 500 # 最大行數(shù)
fetch-size: -1 # 緩存行數(shù)
fetch-size
可以提高我們的查詢性能。比如現(xiàn)在我們查了一萬條數(shù)據(jù),那么一次給我們幾條呢?這個(gè)就可以由fetch-size
來控制。假如一次給五十條,而我們也就用到了這五十條,那么效率會(huì)很高。而如果我們使用到50條之外的,它就會(huì)再來一次,效率降低。
總結(jié)
- SpringBoot內(nèi)置JdbcTemplate持久化解決方案
- 使用JdbcTemplate需要導(dǎo)入spring-boot-starter-jdbc的坐標(biāo)
數(shù)據(jù)庫技術(shù)
截止到目前,springboot給開發(fā)者提供了內(nèi)置的數(shù)據(jù)源解決方案和持久化解決方案,在數(shù)據(jù)層解決方案三件套中還剩下一個(gè)數(shù)據(jù)庫,莫非springboot也提供有內(nèi)置的解決方案?還真有,還不是一個(gè),有三個(gè)
? springboot提供了3款內(nèi)置的數(shù)據(jù)庫,分別是:
- H2
- HSQL
- Derby
? 以上三款數(shù)據(jù)庫除了可以獨(dú)立安裝之外,還可以像是tomcat服務(wù)器一樣,采用內(nèi)嵌的形式運(yùn)行在spirngboot容器中。內(nèi)嵌在容器中運(yùn)行,那必須是java對(duì)象啊,對(duì),這三款數(shù)據(jù)庫底層都是使用java語言開發(fā)的。
? 我們一直使用MySQL數(shù)據(jù)庫就挺好的,為什么有需求用這個(gè)呢?原因就在于這三個(gè)數(shù)據(jù)庫都可以采用內(nèi)嵌容器的形式運(yùn)行,在應(yīng)用程序運(yùn)行后,如果我們進(jìn)行測(cè)試工作,此時(shí)測(cè)試的數(shù)據(jù)無需存儲(chǔ)在磁盤上,但是又要測(cè)試使用,內(nèi)嵌數(shù)據(jù)庫就方便了,運(yùn)行在內(nèi)存中,該測(cè)試測(cè)試,該運(yùn)行運(yùn)行,等服務(wù)器關(guān)閉后,一切煙消云散,多好,省得你維護(hù)外部數(shù)據(jù)庫了。這也是內(nèi)嵌數(shù)據(jù)庫的最大優(yōu)點(diǎn),方便進(jìn)行功能測(cè)試。
? 下面以H2數(shù)據(jù)庫為例講解如何使用這些內(nèi)嵌數(shù)據(jù)庫,操作步驟也非常簡(jiǎn)單,簡(jiǎn)單才好用嘛
步驟①:導(dǎo)入H2數(shù)據(jù)庫對(duì)應(yīng)的坐標(biāo),一共2個(gè)
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
步驟②:將工程設(shè)置為web工程,啟動(dòng)工程時(shí)啟動(dòng)H2數(shù)據(jù)庫
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
步驟③:通過配置開啟H2數(shù)據(jù)庫控制臺(tái)訪問程序,也可以使用其他的數(shù)據(jù)庫連接軟件操作
spring:
h2:
console:
enabled: true
path: /h2
做完之后我們啟動(dòng)服務(wù)器,然后訪問localhost/h2(已經(jīng)提前設(shè)置端口為80),頁面顯示:
? web端訪問路徑/h2,訪問密碼123456,如果訪問失敗,先配置下列數(shù)據(jù)源,啟動(dòng)程序運(yùn)行后再次訪問/h2路徑就可以正常訪問了(成功訪問之后把以下內(nèi)容去掉也是可以訪問的)
datasource:
url: jdbc:h2:~/test
hikari:
driver-class-name: org.h2.Driver
username: sa
password: 123456
然后我們就進(jìn)入了如下網(wǎng)頁:
我們可以先創(chuàng)建一張表:
然后我們查看一下表:
我們往里面加兩條數(shù)據(jù):
insert into tbl_book values(1,'springboot','springboot','springboot')
insert into tbl_book values(2,'springboot2','springboot2','springboot2')
我們?cè)偃ゲ榭匆幌卤恚l(fā)現(xiàn)數(shù)據(jù)已經(jīng)成功添加了:
步驟④:使用JdbcTemplate或MyBatisPlus技術(shù)操作數(shù)據(jù)庫
這里我們只說了JdbcTemplate,MyBatisPlus技術(shù)與以前使用方法一樣。
此時(shí)數(shù)據(jù)源要寫好:
數(shù)據(jù)源的配置信息我們?cè)诘谝淮芜M(jìn)入h2網(wǎng)頁的時(shí)候上面有寫
我們測(cè)試一下往里面添加數(shù)據(jù):
? 其實(shí)我們只是換了一個(gè)數(shù)據(jù)庫而已,其他的東西都不受影響。一個(gè)重要提醒,別忘了,上線時(shí),把內(nèi)存級(jí)數(shù)據(jù)庫關(guān)閉,采用MySQL數(shù)據(jù)庫作為數(shù)據(jù)持久化方案,關(guān)閉方式就是設(shè)置enabled屬性為false即可。
總結(jié)
- H2內(nèi)嵌式數(shù)據(jù)庫啟動(dòng)方式,添加坐標(biāo),添加配置
- H2數(shù)據(jù)庫線上運(yùn)行時(shí)請(qǐng)務(wù)必關(guān)閉
? 到這里SQL相關(guān)的數(shù)據(jù)層解決方案我們就說完了,現(xiàn)在的可選技術(shù)就豐富的多了。
- 數(shù)據(jù)源技術(shù):Druid、Hikari、tomcat DataSource、DBCP
- 持久化技術(shù):MyBatisPlus、MyBatis、JdbcTemplate
- 數(shù)據(jù)庫技術(shù):MySQL、H2、HSQL、Derby
? 現(xiàn)在開發(fā)程序時(shí)就可以在以上技術(shù)中任選一種組織成一套數(shù)據(jù)庫解決方案了。
到此這篇關(guān)于SpringBoot深入刨析數(shù)據(jù)層技術(shù)的文章就介紹到這了,更多相關(guān)SpringBoot數(shù)據(jù)層 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用SpringSecurity+defaultSuccessUrl不跳轉(zhuǎn)指定頁面的問題解決方法
本人是用springsecurity的新手,今天遇到defaultSuccessUrl不跳轉(zhuǎn)指定頁面的問題,真是頭疼死了,網(wǎng)上找遍了解決方法都解決不了,今天給大家分享使用SpringSecurity+defaultSuccessUrl不跳轉(zhuǎn)指定頁面的問題解決方法,感興趣的朋友一起看看吧2023-12-12Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享
這篇文章主要介紹了Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享的相關(guān)資料,需要的朋友可以參考下2022-12-12SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼
這篇文章主要介紹了SpringBoot+Mybatis-Plus實(shí)現(xiàn)mysql讀寫分離方案的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03