Spring Boot中整合mybatis多数据源

关于多数据源的配置,前面介绍过JdbcTemplate多数据源配置,那个比较简单,本文来说说MyBatis多数据源的配置。
其实关于多数据源,觉得项目复杂的就直接上分布式数据库中间件mycat,简单的再考虑多数据源。这是项目中的建议,技术上的话,当然还是各种技术都要掌握的。

创建项目

创建spring boot项目,导入web依赖以及mysql和mybatis的依赖,如下图所示
在这里插入图片描述
然后我们需要在pom文件中导入druid的依赖以及mysql的版本信息

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.0</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <version>5.1.27</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

好了,项目算是创建成功了,然后我们就需要去配置数据源信息了,在application.properties中配置以下信息,因为是多数据源,所以这里需要区分,在前缀添加one和two进行区分,这里注意的是,由于我们在application.properties配置文件中将前缀改了,后面需要我们指定前缀名,这个后面再说,先来看看配置信息

多数据源配置

#tb_user数据库
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.url=jdbc:mysql:///tb_user?useUnicode=true&characterEncoding=utf-8


#pms数据库
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.url=jdbc:mysql:///pms?useUnicode=true&characterEncoding=utf-8

在这里插入图片描述
需要提供两个DataSource配置类,指定前缀名

package com.zhouym.mutilmybatis;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * 〈〉
 *
 * @author zhouym
 * @create 2019/8/11
 * @since 1.0.0
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne(){
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

MyBatis配置

接下来则是MyBatis的配置,不同于JdbcTemplate,MyBatis的配置要稍微麻烦一些,因为要提供两个Bean,因此这里两个数据源我将在两个类中分开来配置,首先来看第一个数据源的配置:

package com.zhouym.mutilmybatis;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * 〈〉
 *
 * @author zhouym
 * @create 2019/8/11
 * @since 1.0.0
 */
@Configuration
@MapperScan(basePackages = "com.zhouym.mutilmybatis.mybatis1", 
        sqlSessionFactoryRef = "sqlSessionFactory1",
        sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {

    @Resource(name = "dsOne")
    DataSource dsOne;

    @Bean
    SqlSessionFactory sqlSessionFactory1() {
        SqlSessionFactory sqlSessionFactory = null;

        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsOne);
            sqlSessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

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

创建MyBatisConfigOne 配置类,@Configuration表名这是一个配置类,@MapperScan表示需要扫描的包是com.zhouym.mutilmybatis.mybatis1,即该包下的Mapper接口将操作dsOne中的数据,对应的SqlSessionFactory和SqlSessionTemplate分别是sqlSessionFactory1和sqlSessionTemplate1,在MyBatisConfigOne内部,分别提供SqlSessionFactory和SqlSessionTemplate即可,SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。

我们再来看看第二个数据源的配置:第二个数据源配置和第一个数据源配置一样,只需要改下包名路径以及,方法名等即可

package com.zhouym.mutilmybatis;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;

/**
 * 〈〉
 *
 * @author zhouym
 * @create 2019/8/11
 * @since 1.0.0
 */
@Configuration
@MapperScan(basePackages = "com.zhouym.mutilmybatis.mybatis2",
        sqlSessionFactoryRef = "sqlSessionFactory2",
        sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {

    @Resource(name = "dsTwo")
    DataSource dsTwo;

    @Bean
    SqlSessionFactory sqlSessionFactory2() {
        SqlSessionFactory sqlSessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dsTwo);
            sqlSessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate2() {
        return new SqlSessionTemplate(sqlSessionFactory2());
    }
}

实体类

package com.zhouym.mutilmybatis.Bean;

/**
 * 〈〉
 *
 * @author zhouym
 * @create 2019/8/11
 * @since 1.0.0
 */
public class Users {

    private Integer userid;
    private String username;
    private Integer userage;

    public Users() {
    }

    public Users(Integer userid, String username, Integer userage) {
        this.userid = userid;
        this.username = username;
        this.userage = userage;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getUserage() {
        return userage;
    }

    public void setUserage(Integer userage) {
        this.userage = userage;
    }

    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", userage=" + userage +
                '}';
    }
}

以上我们的mybatis的配置类就算完后了,接下来我们需要在mybatis1和mybatis2两个包中添加mapper接口以及接口映射文件了
mybatis1包,这里注意的是最好将接口类和接口映射文件的名称一致

package com.zhouym.mutilmybatis.mybatis1;

import com.zhouym.mutilmybatis.Bean.Users;

import java.util.List;

public interface UserMapperOne {
    List<Users> getAllUser();
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhouym.mutilmybatis.mybatis1.UserMapperOne">
    <select id="getAllUser" resultType="com.zhouym.mutilmybatis.Bean.Users">
        select * from users
    </select>
</mapper>

mybatis2包,与mybatis1包下的内容差不多

package com.zhouym.mutilmybatis.mybatis2;

import com.zhouym.mutilmybatis.Bean.Users;

import java.util.List;

public interface UserMapperTwo {
    List<Users> getAllUser();
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhouym.mutilmybatis.mybatis2.UserMapperTwo">
    <select id="getAllUser" resultType="com.zhouym.mutilmybatis.Bean.Users">
        select * from users
    </select>
</mapper>

由于我们将接口类和接口映射文件放在了src/main/java目录下,spring boot默认是去查找的是resources的xml文件,所以这里我们需要在pom.xml配置文件指明,告诉spring boot我们将接口类和接口映射文件放在一起了,查找的时候按照我指定的路径去查找,但是呢,resources目录下的文件就不会去找了,还要告诉spring boot也要去resources目录下去查找需要的文件,下面我们来看在pom.xml文件中怎么配置

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

下面我们直接在测试类中测试

package com.zhouym.mutilmybatis;

import com.zhouym.mutilmybatis.Bean.Users;
import com.zhouym.mutilmybatis.mybatis1.UserMapperOne;
import com.zhouym.mutilmybatis.mybatis2.UserMapperTwo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MutilmybatisApplicationTests {

    @Resource
    UserMapperOne userMapper1;

    @Resource
    UserMapperTwo userMapper2;

    @Test
    public void contextLoads() {
        List<Users> allUser1 = userMapper1.getAllUser();
        List<Users> allUser2 = userMapper2.getAllUser();
        System.out.println(allUser1);
        System.out.println(allUser2);
    }

}

来看看测试结果
在这里插入图片描述

发布了207 篇原创文章 · 获赞 87 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhouym_/article/details/99175838
今日推荐