面試官:數據持久化方式有哪幾種?怎麼配置多數據源?

2020-12-11 騰訊網

Spring Boot整合持久層的三種方式

在實際的Java開發中,不可避免的要對數據持久化,常用的持久化技術有MyBatis、Spring自帶的JdbcTemplate和Spring Boot提供的Jpa規範。在這篇文章中,我們會逐個講解這三種方式的使用及多數據源的配置。

目錄

Spring Boot整合JdbcTemplate

Spring Boot整合MyBatis

Spring Boot整合Jpa

1、SpringBoot整合JdbcTemplate

大家一定都有這樣的經歷,剛開始學Java操作資料庫時,當時沒有什麼框架可以使用,就使用原生的JDBC來操作數據,導致代碼繁瑣且冗餘度高。為了解決這樣的問題,Spring對JDBC做了封裝形成了JdbcTemplate,它可以使用Spring的注入功能將數據源(DataSource)注入到JdbcTemplate中,Spring中的IOC容器可以將數據源當做Java Bean一樣管理,以此簡化了對資料庫的操作。

1.1基本配置

POM文件配置

JdbcTemplate使用很簡單,只需要我們在Spring Boot項目中添加資料庫驅動和Druid數據源依賴即可

NOTE:選取數據源依賴時,有兩種選擇,分別是druid和druid-spring-boot-starter,它們的區別是druid-spring-boot-starter可以配置多數據源

application.properties文件配置

application.properties主要是連結資料庫的一些基本信息,如資料庫的用戶名、密碼、數據源類型、驅動等等。具體的配置如下:

1.2使用

在使用之前,我們首先創建一個實體類與指定資料庫中的表對應起來,我們這裡創建一個User Bean

接下來就是使用JdbcTemplate進行增刪改查,除了幾個查詢的API,增刪改都是採用update操作,只需要在update方法中傳入SQL語句即可。

1.3配置多數據源

我們在開發中不可避免的要配置多數據源,JdbcTemplate配置多數據源相對MyBatis和Jpa簡單些,只需要修改數據源依賴、添加多數據源信息和增加相應的配置文件即可,下面我們逐個詳細介紹

1.3.1修改druid依賴

將依賴由druid改為druid-spring-boot-starter

1.3.2添加資料庫信息

在application.properties定義兩個資料庫信息spring-boot-study和spring-boot-study2

1.3.3編寫配置文件

因為我們在application.properties文件中修改了配置信息,所以我麼需要重新定義數據源配置文件(DataSourceConfig)和JdbcTemplateConfig

DataSourceConfig配置

JdbcTemplateConfig配置

2、SpringBoot整合MyBatis

MyBatis是採用java編寫的一個持久層框架,它同樣封裝了jdbc操作的很多細節,使開發者只需要關注sql語句本身,而無需關注註冊驅動、創建連結等繁雜過程,使用ORM思想實現了對結果集的封裝。

2.1基本配置

POM文件

和JdbcTemplate不同的是,MyBatis是第三方框架,因此在添加資料庫驅動的基礎上,需要添加MyBatis引入依賴,

application.properties

和JdbcTemplate相同,都需要在application.properties文件上配置連接資料庫的信息

2.2使用

在使用之前,需要創建實體類與資料庫中的表對應,並創建Mapper.xml用於操作SQL語句

定義 Bean

定義配置文件mapper.xml

mapper.xml文件是建立起資料庫表與實體類的映射,使用SQL語句將結果返回給具體的方法。mapper.xml是默認放在resources目錄下,其目錄設置要同mapper方法接口的層級結構相同。如果想將mapper.xml放在其他位置,需要重新配置文件的掃描路徑,假如mapper.xml同mapper接口方法接口放在同一包下,則需要對pom修改為

2.3配置多數據源

上文中的2.1和2.2是對單個資料庫表進行的配置操作,在實際的應用場景中,需要對多個不同的資料庫表進行操作,所以非常有必要學習多數據源的配置。

2.3.1修改druid依賴

同JdbcTemplate一樣,當使用多個數據源時,需要將druid依賴由druid改為druid-spring-boot-starter。

2.3.2 添加資料庫信息

同JdbcTemplate一樣,需要在application.properties定義兩個資料庫信息spring-boot-study和spring-boot-study2作為測試

2.3.3編寫配置文件

因為我們配置兩個資料庫表,所以我們需要分別編寫配置文件來各自處理不同的mapper。

2.3.3.1配置DataSourceConfig

同JdbcTemplate相同,我們需要編寫配置文件(DataSourceConfig)來分別處理

2.3.3.2配置MyBatisConfig1

配置MyBatisConfig1是為了對應mapper1

在單資料庫表下,使用MyBatis框架持久化數據是按照以下流程

對應的代碼為

而在我們配置文件MyBatisConfig1用到了SqlSessionFactory、SqlSessionTemplate,SqlSessionFactoryBean,因此會有同學有疑問,SqlSessionFactory、SqlSessionTemplate,SqlSessionFactoryBean和SqlSession之間的關係是什麼

SqlSession

SqlSession實現了Closeable接口,是一種可關閉的連接,可以表示資料庫客戶端和資料庫服務端之間的一種會話,並維護了兩者之間的狀態信息。SqlSession接口內有用於操作資料庫執行sql語句的select、insert、update等方法。

SqlSessionTemplate

SqlSessionTemplate是SqlSession的具體實現類,除了實現SqlSession,它還實現了DisposableBean接口,這表明,SqlSessionTemplate的實例被Bean工廠發現後,會把他們納入整個spring bean生命周期的管理過程之中,當BeanFactory嘗試銷毀時,Beans的管理者會以回調的方式調用SqlSessionTemplate的destroy()方法。因此,我們就可以執行Dao層的sql語句

SqlSessionFactory

SqlSessionFactory也是一個接口,是生產SqlSession工廠(採用動態代理的方式),它可以打開一個SqlSession會話,而且重載了許多不同的參數,你可以改變這些參數自定義會話過程中的一些默認行為。例如:可以設置自動提交事務或是關閉自動提交;可以設置獲取資料庫連接的線程的類型(重用,每次新產生等等);也可以獲取整個MyBatis的配置信息的Configuration對象實例等等。

SqlSessionFactoryBean

SqlSessionFactoryBean實現了FactorBean接口,表示SqlSessionFactoryBean的實例不再是一個普通的bean對象,而是可以產生自己Bean(SqlSessionFactory)的一個工廠,並且產生的Bean會被納入spring的生命周期。

總結

SqlSessionFactoryBean是生產SqlSessionFactory的一種工廠bean。SqlSessionFactory是打開SqlSession會話的工廠,是一個接口,可以根據需求自己實現,它的默認實現類DefaultSqlSessionFactory使用了資料庫連接池技術。SqlSession是客戶端和資料庫服務端之間的會話信息,裡面有許多操作資料庫的方法。SqlSessionTemplate是SqlSession的一個具體實現。

2.3.3.3配置MyBatisConfig2

MyBatisConfig2同MyBatisConfig1一樣,只不過它對應的是mapper2

3、SpringBoot整合Jpa

Jpa(Java Persistence API)是SUN公司提出的ORM規範,提供了一種對象/映射工具來管理Java應用中的關係數據,使用XML或者註解的方式簡化對資料庫的操作。

它的出現是為了規範現有的ORM框架,採用Jpa開發時,我們仍將使用這些ORM框架,只是此時開發出來的應用不在依賴於某個持久化提供商。應用可以在不修改代碼的情況下載任何JPA環境下運行,真正做到低耦合,可擴展的程序設計。類似於JDBC,在JDBC出現以前,我們的程序針對特性的資料庫API進行編程,但是現在我們只需要針對JDBC API編程,這樣能夠在不改變代碼的情況下就能換成其他的資料庫。

而Spring-Data-jpa是在Jpa規範下提供的Resporsity實現,JpaResporsity擁有常用的CURD方法及分頁、欄位排序等,可以統一不同ORM框架對資料庫操作的代碼。

3.1基本配置

Pom文件

在Pom文件中添加MySQL驅動和spring-boot-starter-data-jpa依賴

application.properties

在application.properties配置文件中添加資料庫表的信息

3.2使用

實體類User

在使用之前,需要編寫一個實體類與資料庫中的表對應

註解@Entity表明這是個實體類,並且可以根據實體類中的信息創建相應的表放在資料庫中。@Id表明對用資料庫表中的主鍵Id(必須有), @GeneratedValue(strategy = GenerationType.IDENTITY)表是Id自增長。

dao接口

如果僅僅使用常見的CURD操作,接口中不需要寫自定義的方法,JpaRepository已經實現常用的CURD操作,可以滿足我們日常的操作。

3.3配置多數據源

3.3.1修改druid依賴

同JdbcTemplate、MyBatis一樣,當使用多個數據源時,需要將druid依賴由druid改為druid-spring-boot-starter。

3.3.2添加資料庫信息

3.3.3編寫配置文件3.3.3.1配置數據源

3.3.3.2配置JpaConfig1

配置JpaConfig1是為了對應Dao1

3.3.3.3配置JpaConfig2

配置JpaConfig1是為了對應Dao2

參考

[1]https://www.cnblogs.com/xichji/p/12342569.html

[3]https://gitee.com/lenve/javaboy-video-samples/tree/master/%E7%AC%AC%2005%20%E7%AB%A0%20Spring%20Boot%20%E6%95%B4%E5%90%88%E6%8C%81%E4%B9%85%E5%B1%82%E6%8A%80%E6%9C%AF

相關焦點

  • 面試必問的 Redis:RDB、AOF、混合持久化
    持久化機制的內容大綱其實很早就有了,但是實際寫的時候斷斷續續寫了有兩周。主要細節還是挺多的,在翻源碼的過程中,會遇到一些疑惑點,也發現一些自己以前不知道的知識點,所以自己也要花點時間去搞清楚。慢工出細活吧,本文還是有很多非常細節的內容的,如果能掌握,讓大廠面試官眼前一亮還是問題不大的。
  • SpringBoot 的多數據源配置
    SpringBoot 項目,既然你想改造成多數據源,那麼你應該已經有了一個數據源了,如果新增的數據源資料庫和目前的一致,你可以直接使用你的項目進行改造測試。多數據源SpringBoot 的多數據源開發十分簡單,如果多個數據源的資料庫相同,比如都是 MySQL,那麼依賴是不需要任何改動的,只需要進行多數據源配置即可。如果你新增的資料庫數據源和目前的資料庫不同,記得引入新資料庫的驅動依賴,比如 MySQL 和 PGSQL。
  • redis學習(四)鍵空間數據持久化
    下面我們帶著是否要持久化、持久化方式、持久化流程、策略是怎樣的,有什麼優缺點這樣的問題開始下面的內容!一、持久化方式1、redis在4.0之前提供了RDB全量持久化、AOF增量持久化兩種持久化功能,因為RDB和AOF兩種持久化都有各自明顯的缺點所以4.0版本提供了混合持久化,先使用RDB在將這期間增量數據使用AOF方法添加到文件末尾。
  • PB級數據持久化緩存系統——lest
    數據開啟了持久化,但機器down機恢復後依然無法使用或者數據無法自動更新到最新版本;3. 主存依然是內存,所以數據大小需受制於內存,依然無法存儲比內存大的數據,故持久化僅僅是備份;4. 設計的時候沒考慮持久化,啟用持久化後使用非常彆扭;而我們的lest從設計開始就解決了這些問題,並且還帶來了更多很有意思、也很有實用價值的技術,比如私有的通訊與存儲協議、全程無鎖的多線程模型等等。
  • 數據分析工程師面試集錦5——Spark面試指南
    可以說Spark幾乎是企業搭建大數據平臺必備組件,作為數據分析工程師在工作中執行程序、調試程序、查詢數據都會和Spark打交道,所以對Spark知識的考察也就順理成章了。怎麼去準備Spark的面試?對於概念類的知識點可以在面試前突擊一下,閱讀類似本文的面試指南,對於代碼類的或者涉及項目類的考題更多的是需要平時工作和學習的積累,多寫一些代碼並加上自己的思考。精選考題基本概念1、Spark支持的程式語言有哪幾種?
  • 程式設計師必備|面試中常被問到的redis持久化的問題
    「那不會,redis支持持久化,通過rdb或者aof這兩種方式可以將數據持久化到硬碟上」少年暗喜,題目太簡單「持久化?通俗點解釋下」「就是把內存的數據刷到磁碟中的文件裡面」「嗯~,那你先來說說rdb是什麼?」
  • 搞懂這些Redis知識點,吊打面試官!
    支持數據持久化。可以將內存中數據保存在磁碟中,重啟時加載。主從複製,哨兵,高可用。可以用作分布式鎖。可以作為消息中間件使用,支持發布訂閱。五種數據類型面試官:總結的不錯,看來是早有準備啊。剛來聽你提到 Redis 支持五種數據類型,那你能簡單說下這五種數據類型嗎?
  • springboot整合mybatis實現配置多數據源
    前言:實際開發中,隨著業務的擴張,使用單一的資料庫顯然有點臃腫,不便管理,經常會實現將不同的業務模塊的數據表結構放在各自的資料庫中,下邊簡單實現sprongboot實現多數據源的配置。一 項目結構:二 涉及到的資料庫:三 springboot中的application.properties文件:本次demo簡單配置下兩個數據源為例。
  • Redis RESP 協議與 AOF 持久化有什麼關係?
    有個小夥伴面試回來說面試官問了他一些 Redis 問題,但是他好像沒有回答上來。我說,你 Redis 不是用的很溜嗎,什麼問題難住你了。他說,事情是這樣的,剛開始,問了一些基礎的問題,比如 Redis 的幾種基本數據類型和使用場景,以及主從複製和集群的一些問題,這些都還好。
  • 大數據入門:Spark持久化存儲策略
    MEMORY_ONLY_SER 將RDD序列化為Java對象進行持久化,每個分區對應一個字節數組。此方式比反序列化要節省空間,但是會佔用更多CPU資源。 MEMORY_ONLY_2,MEMORY_AND_DISK_2 與上面的方式類似,但是會將分區數據複製到兩個集群, OFF_HEAP(experimental) 與MEMORY_ONLY_SER
  • 面試系列 - Redis 持久化和主從複製總結(二)
    若有未涉及的 Redis 面試考點請後臺留言聯繫他或者添加wx進行補充,贈人玫瑰,手有餘香,感謝!
  • 面試官:談談你對MySQL事務的認識?
    這篇文章屬於mysql資料庫系列,我們來談談事務方面的常見面試題。那麼,具體題目有下面這些:1、講講為什麼用事務?事務的四大特性?事務的隔離級別知道吧,你們生產用哪種?2、Innodb中ACID具體是如何實現的?3、redo log和binlog的一致性如何保證?4、大事務有哪些壞處?生產上遇到過大事務麼?你怎麼排查和解決的?
  • 2019 最新 200 道 Java 面試題
    原因二:節省招聘雙方彼此的時間,有些來公司面試人,無論是有幾年工作經驗的還是剛畢業的,就連這些最基礎的面試題都搞不定,這確實讓人很遺憾。常言道「一屋不掃何以掃天下」,也是同樣的道理,如果連基礎的概念都搞不明白,又怎麼讓面試官相信你能寫出高質量的程序呢?與其浪費彼此的時間,還不如花點時間把自己的基礎知識掌握牢固。
  • Java 最常見的 200+ 面試題:面試必備
    所以如果您是面試官,恰好又看到這裡,如果條件允許的話,請多給這樣願意學又很聰明的年輕人多一些機會。38.創建線程有哪幾種方式?39.說一下 runnable 和 callable 有什麼區別?40.線程有哪些狀態?
  • 【大數據嗶嗶集20210117】Spark面試題靈魂40問
    如果我們將 map 端劃分數據、持久化數據的過程稱為 shuffle write,而將 reducer 讀入數據、aggregate 數據的過程稱為 shuffle read。那麼在 Spark 中,問題就變為怎麼在 job 的邏輯或者物理執行圖中加入 shuffle write 和 shuffle read的處理邏輯?以及兩個處理邏輯應該怎麼高效實現?
  • Redis專題:萬字長文詳解持久化原理
    save m n的意思是:m秒內有n條寫入就觸發一次快照,即備份一次。save參數可以配置多組,滿足在不同條件的備份要求。如果需要關閉RDB的自動備份策略,可以使用save ""。以下為幾種配置的說明:# 表示900秒(15分鐘)內至少有1個key的值發生變化,則執行save 900 1# 表示300秒(5分鐘)內至少有1個key的值發生變化,則執行save 300 10# 表示60秒(1分鐘)內至少有10000個key的值發生變化,則執行save 60 10000# 該配置將會關閉RDB方式的持久化save
  • 阿里面試官:來手寫一下Redis的LRU算法 我當場懵了
    不知道到這裡為止我有沒有解釋清楚,以及為啥會線程不安全,就是因為你一個人怎麼看都沒事,但是人多了換來換去的操作一本書數據就亂了。可能我的解釋很粗糙,但是道理應該是一樣的。那他是單線程的,我們現在伺服器都是多核的,那不是很浪費?是的他是單線程的,但是,我們可以通過在單機開多個Redis實例嘛。既然提到了單機會有瓶頸,那你們是怎麼解決這個瓶頸的?
  • 求職過程中,面試官出現以下幾種舉動,是在暗示你已經通過面試
    面試結果一般求職者自己也能有一些感覺,自己表現的是否夠好呢?很多求職者覺得面試感覺不錯,與面試官聊得都很投機,同時也就會感覺到這次面試是不是「有戲」,那麼是怎麼判斷的呢?求職過程中,面試官出現以下幾種舉動,是在暗示你已經通過面試。看面試的時間、人數如果你和面試官聊得時間越長,說明你被對方看中的可能性越大。
  • 208 個最常見 Java 面試題全解析
    第一:讓更多的人因此而學到了更多的知識,這是一件大好事;第二:這只是經驗的高度提煉,讓那些原本就掌握了技術卻不知道怎麼表達的人,學會如何在面試中展示自己;第三:如果只是死記硬背這些面試題,只要面試官再深入問糾一下,也可對這個人有一個準確的認識,之前說的「幫人作弊」的事就不存在了;第四:學習有很多種方式,但只有好學者才會臨池學書。
  • 2017大數據面試題及答案
    2017年有不少大數據學員學成準備參加工作,在參加工作前最重要的一輪就是大數據的面試,小編收集了一些2017大數據面試題及答案