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