Spring boot +Mybatis 實現多數據源(一:最簡單版本)

多數據源的問題在實際項目中還是經常遇到的,例如讀寫分離的數據庫、馬甲類型服務器等。不多說上乾貨,特別說明下本人用的開發工具是idea。
創建Spring Boot項目
菜單 file–》new –》project–》spring initializer 填寫自己的group、artifact之後 勾選web開啓web屬性 數據庫選着mysql、mybatis
這裏寫圖片描述
這裏寫圖片描述

這裏寫圖片描述

項目初始化完成,pom中加載分頁組件、數據源後如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.rongdong</groupId>
    <artifactId>waistcoat</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>waistcoat</name>
    <description></description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <mybatis.pagehelper.version>4.1.6</mybatis.pagehelper.version>
    </properties>

    <dependencies>
        <!--起步依賴-->
        <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>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--內置tomact 可有可無-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>
        <!--測試-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--數據庫-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- alibaba的druid數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
        <!-- alibaba的druid數據庫連接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--json 工具-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-parameter-names</artifactId>
        </dependency>

        <!-- 分頁插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${mybatis.pagehelper.version}</version>
        </dependency>

        <!--基礎工具-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>



    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

generator是自動生成mybatis 映射文件的,還不知道的可以百度下
在resouces下新建generator 文件夾 並新建generator.xml文件
這裏寫圖片描述
內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 數據庫驅動:選擇你的本地硬盤上面的數據庫驅動包-->
    <classPathEntry location="G:\generator\mysql-connector-java-5.1.34.jar" />
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"
                        userId="root"
                        password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="com.rongdong.model.secondDataSource" targetProject="src">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置-->
        <sqlMapGenerator targetPackage="main.resources.mapping.secondDataSource" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.rongdong.dao.secondDataSource" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名-->
        <table tableName="user_info" domainObjectName="SecondUserInfo" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
    </context>
</generatorConfiguration>

習慣yml格式配置文件看着清晰點,將 application改爲yml 的 多數據源配置如下:

server:
  port: 8089

spring:
    datasource:
      primary:
          jdbc-url:  jdbc:mysql://127.0.0.1:3306/rongdong_waistcoat_db
          username: root
          password: root

          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.jdbc.Driver
          filters: stat
          maxActive: 20
          initialSize: 1
          maxWait: 60000
          minIdle: 1
          timeBetweenEvictionRunsMillis: 60000
          minEvictableIdleTimeMillis: 300000
          validationQuery: select 'x'
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          poolPreparedStatements: true
          maxOpenPreparedStatements: 20
      second:
          jdbc-url:  jdbc:mysql://127.0.0.1:3306/rongdong_jtx_db
          username: root
          password:root




#mybatis:
#  mapper-locations: classpath:mapping/*.xml  #指明mapper的xml文件存放位置
#  type-aliases-package: com.rongdong.model   #指明和數據庫映射的實體的所在包

#pagehelper 分頁插件
pagehelper:
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSql

然後就是配置問題,我的因爲我的數據庫中表名相同,但是部分字段不一樣 因此我在dao層、model、mapping這塊給細分成了 多個部分
這裏寫圖片描述

然後新建DataSourceConfig 數據源配置類

/**
 * 數據源配置類
 *
 * @author hsh
 * @create 2018-03-21 19:06
 **/
@Configuration
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.second") // application.properteis中對應屬性的前綴
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
}

配置具體數據源
數據源A

/**
 * Mybatis SqlSessionFactory多數據源配置
 *
 * @author hsh
 * @create 2018-03-21 19:18
 **/
@Configuration
@MapperScan(basePackages = {"com.rongdong.dao.priDataSource"}, sqlSessionFactoryRef = "sqlSessionFactory1")
public class MybatisDbAConfig {

    public static final String MAPPER_LOCATION = "classpath:mapping/priDataSource/*.xml";

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource ds1;


    @Bean
    public SqlSessionFactory sqlSessionFactory1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(ds1); // 使用主數據源, 連接主庫
        Resource[] resource = new PathMatchingResourcePatternResolver().getResources(MybatisDbAConfig.MAPPER_LOCATION);
        factoryBean.setMapperLocations(resource);
        return factoryBean.getObject();

    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory1());
    }
}

數據源B

/**
 * Mybatis SqlSessionFactory多數據源配置
 *
 * @author hsh
 * @create 2018-03-21 19:48
 **/
@Configuration
@MapperScan(basePackages = {"com.rongdong.dao.secondDataSource"}, sqlSessionFactoryRef = "sqlSessionFactory2")
public class MybatisDbBConfig {
    public static final String MAPPER_LOCATION = "classpath:mapping/secondDataSource/*.xml";

    @Autowired
    @Qualifier("secondDataSource")
    private DataSource ds2;

    @Bean
    public SqlSessionFactory sqlSessionFactory2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(ds2);
        Resource[] resource = new PathMatchingResourcePatternResolver().getResources(MybatisDbBConfig.MAPPER_LOCATION);
        factoryBean.setMapperLocations(resource);
        return factoryBean.getObject();

    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2());
        return template;
    }
}

service 層具體調用了

/**
 * 用戶service實現
 *
 * @author hsh
 * @create 2018-03-21 17:44
 **/
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Autowired
    private SecondUserInfoMapper secondUserInfoMapper;

    @Override
    public UserInfo getUserById(String userId, Integer dataSourceType) throws Exception {
        if (dataSourceType == DataSourceTypeEnum.one.getIndex()) {
            return userInfoMapper.selectByPrimaryKey(userId);
        } else if (dataSourceType == DataSourceTypeEnum.two.getIndex()) {
            UserInfo userInfoTar = new UserInfo();
            SecondUserInfo secondUserInfo = secondUserInfoMapper.selectByPrimaryKey(userId);
            BeanUtils.copyProperties(secondUserInfo, userInfoTar);
            return userInfoTar;
        }
        return null;
    }
}

controller代碼

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "{id}/{datatype}", method = RequestMethod.GET)
    public UserInfo getUserById(@PathVariable("id") String userId,@PathVariable("datatype") Integer dataType) throws Exception {
        return userService.getUserById(userId, dataType);
    }



}

調試

這裏寫圖片描述
這裏寫圖片描述
搞定!
1。提醒下spring boot 2.0之後多數據的配置url時候要用 jdbc-url替代url不然報錯

jdbcUrl is required with driverClassName.

2。表名相同的情況下 dao層是不能名字一樣的,因爲默認是name實例化這個bean 會報錯 因此實例化

以上就是最簡單版本的Spring boot +Mybatis 實現多數據源,當然還有動態綁定數據源的,後期有時間在繼續更新上來,歡迎大家指正!有問題的可以留言大家互相交流下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章