1. 程式人生 > >Spring Boot整合MyBatis實現多資料來源配置

Spring Boot整合MyBatis實現多資料來源配置

Spring Boot最大的特點是簡化開發,因此使用Java Config實現去xml配置,本文將使用這種方式完成對SpringBoot+Mybatis的多資料來源配置。同時,會用到阿里巴巴的開源資料來源Druid。

依賴:

<?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>io.liyang</groupId>
    <artifactId>op-monitor</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <!-- junit版本 -->
        <junit.version>4.11</junit.version>

        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <assertj.version>3.5.2</assertj.version>
        <!--  依賴版本  -->
        <mybatis.version>3.4.0</mybatis.version>
        <mybatis.spring.version>1.3.0</mybatis.spring.version>
        <mapper.version>3.3.6</mapper.version>
        <pagehelper.version>4.1.1</pagehelper.version>
        <!-- 阿里資料來源版本 -->
        <druid.version>1.0.20</druid.version>
        <!-- Ehcache版本 -->
        <ehcache.version>3.0.0</ehcache.version>
    </properties>

    <dependencies>
        <!--<dependency>-->
            <!--<groupId>org.springframework.boot</groupId>-->
            <!--<artifactId>spring-boot-starter-web</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency> <!-- for ChainedTransactionManager configuration -->
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-commons</artifactId>
        </dependency>
        <!-- 支援 @ConfigurationProperties 註解 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency> <!-- exclude掉預設的jdbc配置 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <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>    <!-- 加上這個才能辨認到log4j2.yml檔案 -->
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <!--Mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis.spring.version}</version>
        </dependency>
        <!-- Mybatis Generator -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <!--分頁外掛-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>
        <!--通用Mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>${mapper.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.5.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>0.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- FreeMarker 支援 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>op-monitor</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <!-- 修改程式碼後自動生效,Reload Java classes without restarting the container -->
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.5.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

資料來源配置

多資料來源配置要求必須有一個是『主』,『主』資料來源配置如下:

@Configuration
@MapperScan(basePackages = DCDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "dcSqlSessionFactory")
public class DCDataSourceConfig {
    static final String PACKAGE = "io.liyang.opmonitor.mapper.datacenter"; //資料平臺DB
    @Value("${datasource.url}")
    private String dbURL;
    @Value("${datasource.username}")
    private String dbUser;
    @Value("${datasource.password}")
    private String dbPWD;

    @Bean(name = "dcDataSource")
    @Primary
    public DataSource dcDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(dbURL);
        dataSource.setUsername(dbUser);
        dataSource.setPassword(dbPWD);
        return dataSource;
    }

    @Bean(name = "dcTransactionManager")
    @Primary
    public DataSourceTransactionManager dcTransactionManager() {
        return new DataSourceTransactionManager(dcDataSource());
    }

    @Bean(name = "dcSqlSessionFactory")
    @Primary
    public SqlSessionFactory dcSqlSessionFactory(@Qualifier("dcDataSource") DataSource dcDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dcDataSource);
        return sessionFactory.getObject();
    }
}

其他資料來源配置,此處只配置有一個,多個配置的話照此配置即可。

@Configuration
@MapperScan(basePackages = RedPacketDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "redPacketSqlSessionFactory")
public class RedPacketDataSourceConfig {
    static final String PACKAGE = "io.liyang.opmonitor.mapper.redpacket"; //紅包平臺DB
    @Value("${datasource_red.url}")
    private String dbURL;
    @Value("${datasource_red.username}")
    private String dbUser;
    @Value("${datasource_red.password}")
    private String dbPWD;

    @Bean(name = "redPacketDataSource")
    public DataSource redPacketDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(dbURL);
        dataSource.setUsername(dbUser);
        dataSource.setPassword(dbPWD);
        return dataSource;
    }

    @Bean(name = "redPacketTransactionManager")
    public DataSourceTransactionManager redPacketTransactionManager(@Qualifier("redPacketDataSource") DataSource redPacketDataSource) {
        return new DataSourceTransactionManager(redPacketDataSource);
    }

    @Bean(name = "redPacketSqlSessionFactory")
    public SqlSessionFactory redPacketSqlSessionFactory(@Qualifier("redPacketDataSource") DataSource redPacketDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(redPacketDataSource);
        return sessionFactory.getObject();
    }

}

這兩個的主要區別就是掃描的包不同,這裡推薦把不同資料來源的Mapper放在不同的包裡。

Mapper:

Mapper是mybatis的DAL層介面,其實現是由mybatis內部完成的,也就是說,我們只需要定義好介面即可完成CRUD。

@Mapper
public interface UserMapper extends MyMapper {
    @Select("select count(*) from t_user where USER_NAME=#{username} and PASSWORD=#{password}")
    int login(@Param("username") String username, @Param("password") String password);
}

SpringBootApplication配置

@SpringBootApplication
@PropertySource("classpath:db.properties")
public class BaseApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(BaseApplication.class, args);
    }

    @Override
    public SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(BaseApplication.class);
    }
}

db.properties

############################
######        主DB             ######
############################
datasource.url=jdbc:mysql://10.10.10.67:3306/dc?useUnicode=true&characterEncoding=utf8&autoReconnect=true
datasource.username=adminuser
datasource.password=adminpwd
##############################
######        其它DB            ######
#############################
datasource_red.url=jdbc:mysql://10.10.10.112:6001/rcs_redbag_test?useUnicode=true&characterEncoding=utf8&autoReconnect=true
datasource_red.username=testuser
datasource_red.password=testpwd

以上配置做好以後,就可以在datacenter和redpacket兩個包裡分別建立兩個資料來源的Mapper。

贊(0) 打賞 分享到: 更多 (0)