SpringBoot+Mybatis多数据源

项目结构图:

这里写图片描述

有多少数据源就有多少个类 没个数据源对应一个类
最主要的就是这里的配置,其他的地方,和单数据库使用基本一样。

test1库和test2库,在使用的过程中必须指定主库,不然会报错。我们把test1作为主数据库。

下面只针对test1的相关代码,进行说明,test2库的代码,除了少了@Primary这个注解,其他都和test1一样

主数据源: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);
    }


}

从数据源: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);
    }


}

主数据源对应的mapper接口

@Component
public interface EmployeeMapper1 {

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

主数据源使用的EmployeeMapper1.xml

<?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>

对应的从数据源接口:

@Component
public interface EmployeeMapper2 {

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

EmployeeMapper2.xml文件:

<?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全集配置文件

<?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测试方法:

@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文件:


  <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>

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

猜你喜欢

转载自blog.csdn.net/didi7696/article/details/80179346