Spring?Boot整合持久層之JdbcTemplate多數(shù)據(jù)源
多數(shù)據(jù)源
所謂多數(shù)據(jù)源,就是一個(gè) Java EE 項(xiàng)目中采用了不同數(shù)據(jù)庫(kù)實(shí)例中的多個(gè)庫(kù),或者同一個(gè)數(shù)據(jù)庫(kù)實(shí)例中多個(gè)不同的庫(kù)。一般來(lái)說,采用 MyCat 等分布式數(shù)據(jù)庫(kù)中間件是比較好的解決方案,這樣可以把數(shù)據(jù)庫(kù)讀寫分離、分庫(kù)分表、備份等操作交給中間件去做,Java 代碼只需要專注于業(yè)務(wù)即可。不過這并不意味著無(wú)法使用 Java 代碼解決類似的問題,在 Spring Framework 中就可以配置多數(shù)據(jù)源,Spring Boot 繼承其衣缽,只不過配置方式有所變化。
JdbcTemplate 多數(shù)據(jù)源
JdbcTemplate 多數(shù)據(jù)源是比較簡(jiǎn)單的,因?yàn)橐粋€(gè) JdbcTemplate 對(duì)應(yīng)一個(gè) DataSource,開發(fā)者只需要手動(dòng)提供多個(gè) DataSource ,再手動(dòng)配置 JdbcTemplate 即可。
1. 創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建兩個(gè)數(shù)據(jù)庫(kù):chapter05-1 和 chapter05-2.兩個(gè)庫(kù)中都創(chuàng)建 book 表,再各預(yù)設(shè) 1 條數(shù)據(jù),腳本如下
create database `chapter05-1` default character set utf8; CREATE TABLE `chapter05-1`.`book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `author` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `chapter05-1`.`book`(`id`, `name`, `author`) VALUES (1, '水滸傳', '施耐庵'); create database `chapter05-2` default character set utf8; CREATE TABLE `chapter05-2`.`book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `author` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `chapter05-2`.`book`(`id`, `name`, `author`) VALUES (1, '三國(guó)演義', '羅貫中');
2.創(chuàng)建項(xiàng)目
創(chuàng)建 Spring Boot Web 項(xiàng)目,添加如下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
注意這里添加的數(shù)據(jù)庫(kù)連接池依賴是 druid-spring-boot-starter 。druid-spring-boot-starter 可以幫助開發(fā)者在 Spring Boot 項(xiàng)目中輕松集成 Druid 數(shù)據(jù)庫(kù)連接池和監(jiān)控。
3. 配置數(shù)據(jù)庫(kù)連接
在application.properties 中配置數(shù)據(jù)庫(kù)連接信息
# 數(shù)據(jù)源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/chapter05-1?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.one.username=root
spring.datasource.one.password=root
# 數(shù)據(jù)源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/chapter05-2?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.two.username=root
spring.datasource.two.password=root
4. 配置數(shù)據(jù)源
創(chuàng)建 DataSourceConfig 配置數(shù)據(jù)源,根據(jù) application.properties 中的配置生成兩個(gè)數(shù)據(jù)源
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.one") DataSource dsOne() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.two") DataSource dsTwo() { return DruidDataSourceBuilder.create().build(); } }
代碼解釋:
- DataSourceConfig 中提供了兩個(gè)數(shù)據(jù)源:dsOne 和 dsTwo,默認(rèn)方法名即實(shí)例名
- @ConfigurationProperties 注解表示使用不同前綴的配置文件來(lái)創(chuàng)建不同的 DataSource 實(shí)例
5. 配置 JdbcTemplate
在 5.1節(jié) 中得知,只要引入了 spring-jdbc 依賴,開發(fā)者沒有提供 JdbcTemplate 實(shí)例時(shí),Spring Boot 默認(rèn)會(huì)提供一個(gè) JdbcTemplate 實(shí)例?,F(xiàn)在配置多數(shù)據(jù)源時(shí),由開發(fā)者自己提供 JdbcTemplate 實(shí)例
@Configuration public class JdbcTemplateConfig { @Bean JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
代碼解釋:
JdbcTemplateConfig 中提供兩個(gè) JdbcTemplate 實(shí)例。每個(gè) JdbcTemplate 實(shí)例都需要提供 DataSource,由于Spring 容器中有兩個(gè) DataSource 實(shí)例,因此需要通過方法名查找。@Qualifier 注解表示查找不同名稱的 DataSource 實(shí)例注入進(jìn)來(lái)
6. 創(chuàng)建BookController
創(chuàng)建實(shí)體類 Book 和 BookController 進(jìn)行測(cè)試
public class Book { private Integer id; private String name; private String author; @Override public String toString() { return "Book{" + "id=" + id + ", name='" + name + '\'' + ", author='" + author + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
@RestController public class BookController { @Resource(name = "jdbcTemplateOne") JdbcTemplate jdbcTemplate; @Autowired @Qualifier("jdbcTemplateTwo") JdbcTemplate jdbcTemplateTwo; @GetMapping("/test1") public void test1() { List<Book> books1 = jdbcTemplate.query("select * from book", new BeanPropertyRowMapper<>(Book.class)); List<Book> books2 = jdbcTemplateTwo.query("select * from book", new BeanPropertyRowMapper<>(Book.class)); System.out.println("books1:"+books1); System.out.println("books2:"+books2); } }
簡(jiǎn)單起見,這里沒有添加 service 層,而是直接將 JdbcTemplate 注入到了 Controller 中。在Controller 中注入兩個(gè)不同的 JdbcTemplate 有兩種方式:一種是使用 @Resource 注解,并指明 name 屬性,即按 name 進(jìn)行裝配,此時(shí)會(huì)根據(jù)實(shí)例名查找相應(yīng)的實(shí)例注入;另一種是使用 @Autowired 注解結(jié)合 @Qualifier 注解,效果等同于使用 @Resource 注解。
7. 測(cè)試
http://localhost:8081/test1,查看打印日志
books1:[Book{id=1, name='水滸傳', author='施耐庵'}]
books2:[Book{id=1, name='三國(guó)演義', author='羅貫中'}]
到此這篇關(guān)于Spring Boot整合持久層之JdbcTemplate多數(shù)據(jù)源的文章就介紹到這了,更多相關(guān)Spring Boot JdbcTemplate 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 整合持久層之JdbcTemplate
- SpringBoot2使用JTA組件實(shí)現(xiàn)基于JdbcTemplate多數(shù)據(jù)源事務(wù)管理(親測(cè)好用)
- 詳解SpringBoot中JdbcTemplate的事務(wù)控制
- 詳解Springboot之整合JDBCTemplate配置多數(shù)據(jù)源
- SpringBoot多數(shù)據(jù)源配置詳細(xì)教程(JdbcTemplate、mybatis)
- SpringBoot使用JdbcTemplate操作數(shù)據(jù)庫(kù)
- 詳解spring boot中使用JdbcTemplate
- Spring Boot中的JdbcTemplate是什么及用法小結(jié)
相關(guān)文章
Java HtmlEmail 郵件發(fā)送的簡(jiǎn)單實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇Java HtmlEmail 郵件發(fā)送的簡(jiǎn)單實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-06-06利用Postman和Chrome的開發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目)
這篇文章主要介紹了利用Postman和Chrome的開發(fā)者功能探究項(xiàng)目(畢業(yè)設(shè)計(jì)項(xiàng)目),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解)
Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09在SpringBoot中整合使用Netty框架的詳細(xì)教程
這篇文章主要介紹了在SpringBoot中整合使用Netty框架的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Java實(shí)現(xiàn)Dijkstra算法的示例代碼
Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文主要介紹了實(shí)現(xiàn)這一算法的Java代碼,需要的可以參考一下2022-07-07Java實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn)
釘釘?shù)某霈F(xiàn)為企業(yè)節(jié)約了大量人力成本,其中也開放了大量的外部api接口方便企業(yè)使用。本文主要介紹了Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn),感興趣的可以了解一下2021-11-11Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建詳細(xì)步驟
Jenkins是一個(gè)開源的自動(dòng)化服務(wù)器,可以用來(lái)輕松地建立持續(xù)集成和持續(xù)交付(CI/CD)管道,這篇文章主要給大家介紹了關(guān)于Ubuntu安裝jenkins完成自動(dòng)化構(gòu)建的相關(guān)資料,需要的朋友可以參考下2024-03-03Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn)(GET/POST)
這篇文章主要介紹了Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03