成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

新手也能實(shí)現(xiàn),基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多數(shù)據(jù)源配

shiina / 2406人閱讀

摘要:下面基于,帶著大家看一下中如何配置多數(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=utf8
1.4 配置 pom 文件中的相關(guān)依賴

由于要整合 springboot 和 mybatis 所以加入了artifactId 為 mybatis-spring-boot-starter 的依賴,由于使用了Mysql 數(shù)據(jù)庫 所以加入了artifactId 為 mysql-connector-java 的依賴。

    
        
            org.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.5 配置 application.properties

配置兩個(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.Driver
1.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

相關(guān)文章

  • 基于 SpringBoot2.0+優(yōu)雅整合 SpringBoot+Mybatis

    摘要:基于最新的,是你學(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...

    gghyoo 評(píng)論0 收藏0
  • 一起來學(xué)SpringBoot | 第七篇:整合Mybatis

    摘要:但是鑒于國(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)秀的持久層框架,它支持...

    includecmath 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<