摘要:下面基于,帶著大家看一下中如何配置多數(shù)據(jù)源。注意版本不一致導(dǎo)致的一些小問題。配置配置兩個(gè)數(shù)據(jù)源數(shù)據(jù)庫和數(shù)據(jù)庫注意事項(xiàng)在配置數(shù)據(jù)源的過程中主要是寫成和。五啟動(dòng)類此注解表示啟動(dòng)類這樣基于的多數(shù)據(jù)源配置就已經(jīng)完成了,兩個(gè)數(shù)據(jù)庫都可以被訪問了。
在上一篇文章《優(yōu)雅整合 SpringBoot+Mybatis ,可能是你見過最詳細(xì)的一篇》中,帶著大家整合了 SpringBoot 和 Mybatis ,我們?cè)诋?dāng)時(shí)使用的時(shí)單數(shù)據(jù)源的情況,這種情況下 Spring Boot的配置非常簡(jiǎn)單,只需要在 application.properties 文件中配置數(shù)據(jù)庫的相關(guān)連接參數(shù)即可。但是往往隨著業(yè)務(wù)量發(fā)展,我們通常會(huì)進(jìn)行數(shù)據(jù)庫拆分或是引入其他數(shù)據(jù)庫,從而我們需要配置多個(gè)數(shù)據(jù)源。下面基于 SpringBoot+Mybatis ,帶著大家看一下 SpringBoot 中如何配置多數(shù)據(jù)源。
這篇文章所涉及的代碼其實(shí)是基于上一篇文章《優(yōu)雅整合 SpringBoot+Mybatis ,可能是你見過最詳細(xì)的一篇》 的項(xiàng)目寫的,但是為了考慮部分讀者沒有讀過上一篇文章,所以我還是會(huì)一步一步帶大家走完每一步,力爭(zhēng)新手也能在看完之后獨(dú)立實(shí)踐。
目錄:
一 開發(fā)前的準(zhǔn)備
1.1 環(huán)境參數(shù)
1.2 創(chuàng)建工程
1.3 創(chuàng)建兩個(gè)數(shù)據(jù)庫和 user 用戶表、money工資詳情表
1.4 配置 pom 文件中的相關(guān)依賴
1.5 配置 application.properties
1.6 創(chuàng)建用戶類 Bean和工資詳情類 Bean
二 數(shù)據(jù)源配置
三 Dao 層開發(fā)和 Service 層開發(fā)
3.1 Dao 層
3.2 Service 層
四 Controller層
五 啟動(dòng)類
一 開發(fā)前的準(zhǔn)備 1.1 環(huán)境參數(shù)開發(fā)工具:IDEA
基礎(chǔ)工具:Maven+JDK8
所用技術(shù):SpringBoot+Mybatis
數(shù)據(jù)庫:MySQL
SpringBoot版本:2.1.0. SpringBoot2.0之后會(huì)有一些小坑,這篇文章會(huì)給你介紹到。注意版本不一致導(dǎo)致的一些小問題。
1.2 創(chuàng)建工程創(chuàng)建一個(gè)基本的 SpringBoot 項(xiàng)目,我這里就不多說這方面問題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_34337272/article/details/79563606
本項(xiàng)目結(jié)構(gòu):
1.3 創(chuàng)建兩個(gè)數(shù)據(jù)庫和 user 用戶表、money工資詳情表我們一共創(chuàng)建的兩個(gè)數(shù)據(jù)庫,然后分別在這兩個(gè)數(shù)據(jù)庫中創(chuàng)建了 user 用戶表、money工資詳情表。
我們的用戶表很簡(jiǎn)單,只有 4 個(gè)字段:用戶 id、姓名、年齡、余額。如下圖所示:
添加了“余額money”字段是為了給大家簡(jiǎn)單的演示一下事務(wù)管理的方式。
我們的工資詳情表也很簡(jiǎn)單,也只有 4 個(gè)字段: id、基本工資、獎(jiǎng)金和懲罰金。如下圖所示:
建表語句:
用戶表:
CREATE TABLE `user` ( `id` int(13) NOT NULL AUTO_INCREMENT COMMENT "主鍵", `name` varchar(33) DEFAULT NULL COMMENT "姓名", `age` int(3) DEFAULT NULL COMMENT "年齡", `money` double DEFAULT NULL COMMENT "賬戶余額", PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
工資詳情表:
CREATE TABLE `money` ( `id` int(33) NOT NULL AUTO_INCREMENT COMMENT "主鍵", `basic` int(33) DEFAULT NULL COMMENT "基本工資", `reward` int(33) DEFAULT NULL COMMENT "獎(jiǎng)金", `punishment` int(33) DEFAULT NULL COMMENT "懲罰金", PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf81.4 配置 pom 文件中的相關(guān)依賴
由于要整合 springboot 和 mybatis 所以加入了artifactId 為 mybatis-spring-boot-starter 的依賴,由于使用了Mysql 數(shù)據(jù)庫 所以加入了artifactId 為 mysql-connector-java 的依賴。
1.5 配置 application.propertiesorg.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test
配置兩個(gè)數(shù)據(jù)源:數(shù)據(jù)庫1和數(shù)據(jù)庫2!
注意事項(xiàng):
在1.0 配置數(shù)據(jù)源的過程中主要是寫成:spring.datasource.url 和spring.datasource.driverClassName。
而在2.0升級(jí)之后需要變更成:spring.datasource.jdbc-url和spring.datasource.driver-class-name!不然在連接數(shù)據(jù)庫時(shí)可能會(huì)報(bào)下面的錯(cuò)誤:
### Error querying database. Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
另外在在2.0.2+版本后需要在datasource后面加上hikari,如果你沒有加的話,同樣可能會(huì)報(bào)錯(cuò)。
server.port=8335 # 配置第一個(gè)數(shù)據(jù)源 spring.datasource.hikari.db1.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8 spring.datasource.hikari.db1.username=root spring.datasource.hikari.db1.password=153963 spring.datasource.hikari.db1.driver-class-name=com.mysql.cj.jdbc.Driver # 配置第二個(gè)數(shù)據(jù)源 spring.datasource.hikari.db2.jdbc-url=jdbc:mysql://127.0.0.1:3306/erp2?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8 spring.datasource.hikari.db2.username=root spring.datasource.hikari.db2.password=153963 spring.datasource.hikari.db2.driver-class-name=com.mysql.cj.jdbc.Driver1.6 創(chuàng)建用戶類 Bean和工資詳情類 Bean
User.java
public class User { private int id; private String name; private int age; private double money; ... 此處省略getter、setter以及 toString方法 }
Money.java
public class Money { private int basic; private int reward; private int punishment; ... 此處省略getter、setter以及 toString方法 }二 數(shù)據(jù)源配置
通過 Java 類來實(shí)現(xiàn)對(duì)兩個(gè)數(shù)據(jù)源的配置,這一部分是最關(guān)鍵的部分了,這里主要提一下下面這幾點(diǎn):
@MapperScan 注解中我們聲明了使用數(shù)據(jù)庫1的dao類所在的位置,還聲明了 SqlSessionTemplate 。SqlSessionTemplate是MyBatis-Spring的核心。這個(gè)類負(fù)責(zé)管理MyBatis的SqlSession,調(diào)用MyBatis的SQL方法,翻譯異常。SqlSessionTemplate是線程安全的,可以被多個(gè)DAO所共享使用。
由于我使用的是全注解的方式開發(fā),所以下面這條找并且解析 mapper.xml 配置語句被我注釋掉了
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml"));
比如我們要聲明使用數(shù)據(jù)1,直接在 dao 層的類上加上這樣一個(gè)注釋即可:@Qualifier("db1SqlSessionTemplate")
我們?cè)跀?shù)據(jù)庫1配置類的每個(gè)方法前加上了 @Primary 注解來聲明這個(gè)數(shù)據(jù)庫時(shí)默認(rèn)數(shù)據(jù)庫,不然可能會(huì)報(bào)錯(cuò)。
DataSource1Config.java
@Configuration @MapperScan(basePackages = "top.snailclimb.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate") public class DataSource1Config { /** * 生成數(shù)據(jù)源. @Primary 注解聲明為默認(rèn)數(shù)據(jù)源 */ @Bean(name = "db1DataSource") @ConfigurationProperties(prefix = "spring.datasource.hikari.db1") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } /** * 創(chuàng)建 SqlSessionFactory */ @Bean(name = "db1SqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db1/*.xml")); return bean.getObject(); } /** * 配置事務(wù)管理 */ @Bean(name = "db1TransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "db1SqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
DataSource2Config.java
@Configuration @MapperScan(basePackages = "top.snailclimb.db2.dao", sqlSessionTemplateRef = "db2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "db2DataSource") @ConfigurationProperties(prefix = "spring.datasource.hikari.db2") public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "db2SqlSessionFactory") public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml")); return bean.getObject(); } @Bean(name = "db2TransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "db2SqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }三 Dao 層開發(fā)和 Service 層開發(fā)
新建兩個(gè)不同的包存放兩個(gè)不同數(shù)據(jù)庫的 dao 和 service。
3.1 Dao 層對(duì)于兩個(gè)數(shù)據(jù)庫,我們只是簡(jiǎn)單的測(cè)試一個(gè)查詢這個(gè)操作。在上一篇文章《優(yōu)雅整合 SpringBoot+Mybatis ,可能是你見過最詳細(xì)的一篇》中,我?guī)е蠹沂褂米⒔鈱?shí)現(xiàn)了數(shù)據(jù)庫基本的增刪改查操作。
UserDao.java
@Qualifier("db1SqlSessionTemplate") public interface UserDao { /** * 通過名字查詢用戶信息 */ @Select("SELECT * FROM user WHERE name = #{name}") User findUserByName(String name); }
MoneyDao.java
@Qualifier("db2SqlSessionTemplate") public interface MoneyDao { /** * 通過id 查看工資詳情 */ @Select("SELECT * FROM money WHERE id = #{id}") Money findMoneyById(@Param("id") int id); }3.2 Service 層
Service 層很簡(jiǎn)單,沒有復(fù)雜的業(yè)務(wù)邏輯。
UserService.java
@Service public class UserService { @Autowired private UserDao userDao; /** * 根據(jù)名字查找用戶 */ public User selectUserByName(String name) { return userDao.findUserByName(name); } }
MoneyService.java
@Service public class MoneyService { @Autowired private MoneyDao moneyDao; /** * 根據(jù)名字查找用戶 */ public Money selectMoneyById(int id) { return moneyDao.findMoneyById(id); } }四 Controller層
Controller 層也非常簡(jiǎn)單。
UserController.java
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping("/query") public User testQuery() { return userService.selectUserByName("Daisy"); } }
MoneyController.java
@RestController @RequestMapping("/money") public class MoneyController { @Autowired private MoneyService moneyService; @RequestMapping("/query") public Money testQuery() { return moneyService.selectMoneyById(1); } }五 啟動(dòng)類
//此注解表示SpringBoot啟動(dòng)類 @SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
這樣基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多數(shù)據(jù)源配置就已經(jīng)完成了, 兩個(gè)數(shù)據(jù)庫都可以被訪問了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72560.html
摘要:基于最新的,是你學(xué)習(xí)的最佳指南。驅(qū)動(dòng)程序通過自動(dòng)注冊(cè),手動(dòng)加載類通常是不必要。由于加上了注解,如果轉(zhuǎn)賬中途出了意外和的錢都不會(huì)改變。三的方式項(xiàng)目結(jié)構(gòu)相比于注解的方式主要有以下幾點(diǎn)改變,非常容易實(shí)現(xiàn)。公眾號(hào)多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(Sprin...
摘要:但是鑒于國(guó)內(nèi)市場(chǎng)環(huán)境而言,掌握無異于是佳的選擇,低學(xué)習(xí)成本和動(dòng)態(tài)解耦的特點(diǎn)使得更容易被人們所接受。 SpringBoot 是為了簡(jiǎn)化 Spring 應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動(dòng)裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個(gè) WEB 工程 MyBatis 是一款優(yōu)秀的持久層框架,它支持...
閱讀 1473·2021-09-30 09:57
閱讀 1483·2021-09-09 09:33
閱讀 2251·2021-09-04 16:40
閱讀 1815·2021-09-01 10:50
閱讀 3261·2021-09-01 10:31
閱讀 2552·2019-08-30 15:56
閱讀 2984·2019-08-30 15:44
閱讀 3488·2019-08-29 17:29