摘要:下面基于,帶著大家看一下中如何配置多數據源。注意版本不一致導致的一些小問題。配置配置兩個數據源數據庫和數據庫注意事項在配置數據源的過程中主要是寫成和。五啟動類此注解表示啟動類這樣基于的多數據源配置就已經完成了,兩個數據庫都可以被訪問了。
在上一篇文章《優雅整合 SpringBoot+Mybatis ,可能是你見過最詳細的一篇》中,帶著大家整合了 SpringBoot 和 Mybatis ,我們在當時使用的時單數據源的情況,這種情況下 Spring Boot的配置非常簡單,只需要在 application.properties 文件中配置數據庫的相關連接參數即可。但是往往隨著業務量發展,我們通常會進行數據庫拆分或是引入其他數據庫,從而我們需要配置多個數據源。下面基于 SpringBoot+Mybatis ,帶著大家看一下 SpringBoot 中如何配置多數據源。
這篇文章所涉及的代碼其實是基于上一篇文章《優雅整合 SpringBoot+Mybatis ,可能是你見過最詳細的一篇》 的項目寫的,但是為了考慮部分讀者沒有讀過上一篇文章,所以我還是會一步一步帶大家走完每一步,力爭新手也能在看完之后獨立實踐。
目錄:
一 開發前的準備
1.1 環境參數
1.2 創建工程
1.3 創建兩個數據庫和 user 用戶表、money工資詳情表
1.4 配置 pom 文件中的相關依賴
1.5 配置 application.properties
1.6 創建用戶類 Bean和工資詳情類 Bean
二 數據源配置
三 Dao 層開發和 Service 層開發
3.1 Dao 層
3.2 Service 層
四 Controller層
五 啟動類
一 開發前的準備 1.1 環境參數開發工具:IDEA
基礎工具:Maven+JDK8
所用技術:SpringBoot+Mybatis
數據庫:MySQL
SpringBoot版本:2.1.0. SpringBoot2.0之后會有一些小坑,這篇文章會給你介紹到。注意版本不一致導致的一些小問題。
1.2 創建工程創建一個基本的 SpringBoot 項目,我這里就不多說這方面問題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_34337272/article/details/79563606
本項目結構:
1.3 創建兩個數據庫和 user 用戶表、money工資詳情表我們一共創建的兩個數據庫,然后分別在這兩個數據庫中創建了 user 用戶表、money工資詳情表。
我們的用戶表很簡單,只有 4 個字段:用戶 id、姓名、年齡、余額。如下圖所示:
添加了“余額money”字段是為了給大家簡單的演示一下事務管理的方式。
我們的工資詳情表也很簡單,也只有 4 個字段: id、基本工資、獎金和懲罰金。如下圖所示:
建表語句:
用戶表:
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 "獎金", `punishment` int(33) DEFAULT NULL COMMENT "懲罰金", PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf81.4 配置 pom 文件中的相關依賴
由于要整合 springboot 和 mybatis 所以加入了artifactId 為 mybatis-spring-boot-starter 的依賴,由于使用了Mysql 數據庫 所以加入了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
配置兩個數據源:數據庫1和數據庫2!
注意事項:
在1.0 配置數據源的過程中主要是寫成:spring.datasource.url 和spring.datasource.driverClassName。
而在2.0升級之后需要變更成:spring.datasource.jdbc-url和spring.datasource.driver-class-name!不然在連接數據庫時可能會報下面的錯誤:
### Error querying database. Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
另外在在2.0.2+版本后需要在datasource后面加上hikari,如果你沒有加的話,同樣可能會報錯。
server.port=8335 # 配置第一個數據源 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 # 配置第二個數據源 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 創建用戶類 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方法 }二 數據源配置
通過 Java 類來實現對兩個數據源的配置,這一部分是最關鍵的部分了,這里主要提一下下面這幾點:
@MapperScan 注解中我們聲明了使用數據庫1的dao類所在的位置,還聲明了 SqlSessionTemplate 。SqlSessionTemplate是MyBatis-Spring的核心。這個類負責管理MyBatis的SqlSession,調用MyBatis的SQL方法,翻譯異常。SqlSessionTemplate是線程安全的,可以被多個DAO所共享使用。
由于我使用的是全注解的方式開發,所以下面這條找并且解析 mapper.xml 配置語句被我注釋掉了
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/db2/*.xml"));
比如我們要聲明使用數據1,直接在 dao 層的類上加上這樣一個注釋即可:@Qualifier("db1SqlSessionTemplate")
我們在數據庫1配置類的每個方法前加上了 @Primary 注解來聲明這個數據庫時默認數據庫,不然可能會報錯。
DataSource1Config.java
@Configuration @MapperScan(basePackages = "top.snailclimb.db1.dao", sqlSessionTemplateRef = "db1SqlSessionTemplate") public class DataSource1Config { /** * 生成數據源. @Primary 注解聲明為默認數據源 */ @Bean(name = "db1DataSource") @ConfigurationProperties(prefix = "spring.datasource.hikari.db1") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); } /** * 創建 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(); } /** * 配置事務管理 */ @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 層開發和 Service 層開發
新建兩個不同的包存放兩個不同數據庫的 dao 和 service。
3.1 Dao 層對于兩個數據庫,我們只是簡單的測試一個查詢這個操作。在上一篇文章《優雅整合 SpringBoot+Mybatis ,可能是你見過最詳細的一篇》中,我帶著大家使用注解實現了數據庫基本的增刪改查操作。
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 層很簡單,沒有復雜的業務邏輯。
UserService.java
@Service public class UserService { @Autowired private UserDao userDao; /** * 根據名字查找用戶 */ public User selectUserByName(String name) { return userDao.findUserByName(name); } }
MoneyService.java
@Service public class MoneyService { @Autowired private MoneyDao moneyDao; /** * 根據名字查找用戶 */ public Money selectMoneyById(int id) { return moneyDao.findMoneyById(id); } }四 Controller層
Controller 層也非常簡單。
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); } }五 啟動類
//此注解表示SpringBoot啟動類 @SpringBootApplication public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
這樣基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多數據源配置就已經完成了, 兩個數據庫都可以被訪問了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72560.html
摘要:基于最新的,是你學習的最佳指南。驅動程序通過自動注冊,手動加載類通常是不必要。由于加上了注解,如果轉賬中途出了意外和的錢都不會改變。三的方式項目結構相比于注解的方式主要有以下幾點改變,非常容易實現。公眾號多篇文章被各大技術社區轉載。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(Sprin...
摘要:但是鑒于國內市場環境而言,掌握無異于是佳的選擇,低學習成本和動態解耦的特點使得更容易被人們所接受。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可以輕易的搭建出一個 WEB 工程 MyBatis 是一款優秀的持久層框架,它支持...
閱讀 1466·2021-09-30 09:57
閱讀 1472·2021-09-09 09:33
閱讀 2230·2021-09-04 16:40
閱讀 1799·2021-09-01 10:50
閱讀 3248·2021-09-01 10:31
閱讀 2544·2019-08-30 15:56
閱讀 2974·2019-08-30 15:44
閱讀 3479·2019-08-29 17:29