SpringBoot+Mybatis multiple data sources

Project structure diagram:

write picture description here

There are as many classes as there are data sources. No data source corresponds to a class. The
most important thing is the configuration here. In other places, it is basically the same as using a single database.

The test1 library and test2 library must specify the main library during use, otherwise an error will be reported. We have test1 as the main database.

The following only describes the relevant code of test1. The code of test2 library is the same as test1 except for the @Primary annotation.

Main data source: DataSource1

application.properties:



#Mybatis全局文件
mybatis.config-locations=classpath:yiche/com/mapper/mybatis-config.xml

spring.datasource.test1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test1.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = xx

spring.datasource.test2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.test2.url = jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password = xx


@Configuration
@MapperScan(basePackages = "yiche.com.mapper.test1", sqlSessionTemplateRef = "test1SqlSessionTemplate")
public class DataSource1 {
    /*主数据源  用primary标志*/
    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    @Primary
    public DataSource getDataSource1() {
        return DataSourceBuilder.create().build();
    }

    /*工厂*/
    @Bean(name = "test1SqlSessionFactory")
    @Primary
    public SqlSessionFactory getSqlSessionFactory1(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //实体类的所在包
        bean.setTypeAliasesPackage("yiche.com.entity");
        //此外还可以设置Mybatis全局文件的所在包  这里没有  这里设置驼峰命名
        bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        //接口对应的xml文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:yiche/com/mapper/test1/*.xml"));
        return bean.getObject();
    }

    /*事务管理*/
    @Bean(name = "test1TransactionManager")
    @Primary
    public DataSourceTransactionManager getDataSourceTransactionManager1(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test1SqlSessionTemplate")
    @Primary
    public SqlSessionTemplate getSqlSessionTemplate1(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }


}

From data source: DataSource2


@Configuration
@MapperScan(basePackages = "yiche.com.mapper.test2", sqlSessionTemplateRef = "test2SqlSessionTemplate")
public class DataSource2 {
    /*从数据源  不用primary标志*/
    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource getDataSource2() {
        return DataSourceBuilder.create().build();
    }

    /*工厂*/
    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory getSqlSessionFactory2(@Qualifier("test2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //实体类的所在包
        bean.setTypeAliasesPackage("yiche.com.entity");
        //此外还可以设置Mybatis全局文件的所在包  这里没有  这里设置驼峰命名
        bean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        //接口对应的xml文件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:yiche/com/mapper/test2/*.xml"));
        return bean.getObject();
    }

    /*事务管理*/
    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager getDataSourceTransactionManager2(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate getSqlSessionTemplate2(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }


}

The mapper interface corresponding to the main data source

@Component
public interface EmployeeMapper1 {

        List<Employee> getAll();
        Employee getByName(String name);
}

EmployeeMapper1.xml used by the main data source

<?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="yiche.com.mapper.test1.EmployeeMapper1">


    <!-- 使用别名的目的是让查询结果属性名称和实体bean的属性名对应,要不让绑定不上数据。要么就写resultMap这个大家自己搞了 -->
    <select id="getByName" resultType="yiche.com.entity.Employee">
        select * from employee where name=#{name}
    </select>


    <select id="getAll" resultType="yiche.com.entity.Employee">
        select *  from employee
    </select>

    <insert id="addEmployee">
        insert into
        employee
        <trim prefix="(" suffix=")" suffixOverrides=",">

            <if test="employee.name != null and employee.name!=''">
                name,
            </if>

            <if test="employee.age != null and employee.age!=''">
                age,
            </if>


        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="employee.name != null and employee.name!=''">
                #{name}, jdbcType=VARCHAR},
            </if>

            <if test="employee.age != null and employee.age !=''">
                #{age,jdbcType=VARCHAR},
            </if>

        </trim>
    </insert>


    <update id="update">
        update employee
        <set>
            <if test="name!=null and name!=''">
                name=#{name},
            </if>

        </set>
        where id=#{id}
    </update>


    <delete id="delete" parameterType="Integer">
        delete from employee where id=#{id}
    </delete>


</mapper>

The corresponding slave data source interface:

@Component
public interface EmployeeMapper2 {

    List<Employee> getAll();
    Employee getByName(String name);
}

EmployeeMapper2.xml file:

<?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="yiche.com.mapper.test2.EmployeeMapper2">


    <!-- 使用别名的目的是让查询结果属性名称和实体bean的属性名对应,要不让绑定不上数据。要么就写resultMap这个大家自己搞了 -->
    <select id="getByName" resultType="yiche.com.entity.Employee">
        select * from employee where name=#{name}
    </select>


    <select id="getAll" resultType="yiche.com.entity.Employee">
        select *  from employee
    </select>

    <insert id="addUser">
        insert into
        employee
        <trim prefix="(" suffix=")" suffixOverrides=",">

            <if test="employee.name != null and employee.name!=''">
                name,
            </if>

            <if test="employee.age != null and employee.age!=''">
                age,
            </if>


        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="employee.name != null and employee.name!=''">
                #{name}, jdbcType=VARCHAR},
            </if>

            <if test="employee.age != null and employee.age !=''">
                #{age,jdbcType=VARCHAR},
            </if>

        </trim>
    </insert>


    <update id="update">
        update employee
        <set>
            <if test="name!=null and name!=''">
                name=#{name},
            </if>

        </set>
        where id=#{id}
    </update>


    <delete id="delete" parameterType="Integer">
        delete from employee where id=#{id}
    </delete>


</mapper>

mybatis-config.xml full set configuration file

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
     <mappers>
         <mapper resource="classpath:yiche/com/mapper/UserMapper.xml"></mapper>
     </mappers>-->
</configuration>

Controller test method:

@Controller
public class EmployeeController {

     @Autowired
     EmployeeMapper1 employeeMapper1;
    @Autowired
    EmployeeMapper2 employeeMapper2;


    @RequestMapping("/test")
        @ResponseBody
         public String test(){

            return "ok";
        }

     //数据源1的查询
    @RequestMapping("/getAll_1")
    @ResponseBody
    public List<Employee> getAll_1(){

        return employeeMapper1.getAll();
    }
    //数据源2的查询
    @RequestMapping("/getAll_2")
    @ResponseBody
    public List<Employee> getAll_2(){

        return employeeMapper2.getAll();

    }


    //数据源1的查询
    @RequestMapping("/getByName1")
    @ResponseBody
    public Employee getByName1(){
        String name="cici";
        return employeeMapper1.getByName(name);
    }
    //数据源2的查询
    @RequestMapping("/getByName2")
    @ResponseBody
    public Employee getByName2(){
        String name="gg";
        return employeeMapper2.getByName(name);
    }
}

pom.xml file:


  <parent>

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

  </parent>



  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>


    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <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>1.3.0</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>

    </dependency>

    <!--mapper-->
    <dependency>
      <groupId>tk.mybatis</groupId>
      <artifactId>mapper-spring-boot-starter</artifactId>
      <version>1.1.0</version>
    </dependency>
    <!--pagehelper-->


    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.25</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>


  </dependencies>

Reference:
https://blog.csdn.net/xx326664162/article/details/77235958
https://www.jianshu.com/p/5e19f9784498

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325904510&siteId=291194637