SpringBoot 多数据源

##springboot 2.x Mybatis 多数据源

先照着配,仔细看文档,文档最后有细节说明

application.yml

细节 数据库信息需要在 hikari 节点下
参数名称 jdbc-url 与 driver-class-name

server:
  port: 8080
spring:
  datasource:
    hikari:
      test1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
        username: root
        password: ******
      test2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
        username: root
        password: ******

配置文件

两个配置文件基本一致,名称不同 一个有@Primary 注解一个没有

DataSource1Config

package com.sykj.jdj.config.datasource;

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.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.sykj.jdj.dao.test1", sqlSessionFactoryRef = "test1SqlSessionFactory") //配置需要扫描的包
public class DataSource1Config {

    @Bean(name = "test1")
    @Qualifier("test1")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.hikari.test1")
    public DataSource test1DataSource() {
        DataSource build = DataSourceBuilder.create().build();
        return build;
    }

    @Bean(name = "test1SqlSessionFactory")
    // 表示这个数据源是默认数据源
    @Primary
    // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
    public SqlSessionFactory test1SqlSessionFactory(@Qualifier("test1") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
		//配置扫描的xml
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test1/*.xml");
        bean.setMapperLocations(resources);
        return bean.getObject();
    }


    @Bean("test1SqlSessionTemplate")
    // 表示这个数据源是默认数据源
    @Primary
    public SqlSessionTemplate test1SqlSessionTemplate(
            @Qualifier("test1SqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }

}

###DataSource2Config

package com.sykj.jdj.config.datasource;

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.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.sykj.jdj.dao.test2", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {

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

    @Bean(name = "test2SqlSessionFactory")
    // 表示这个数据源是默认数据源
    // @Qualifier表示查找Spring容器中名字为test1DataSource的对象
    public SqlSessionFactory test2SqlSessionFactory(@Qualifier("test2") DataSource datasource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(datasource);
        bean.setMapperLocations(
                // 设置mybatis的xml所在位置
                new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test2/*.xml"));
        return bean.getObject();
    }


    @Bean("test2SqlSessionTemplate")
    // 表示这个数据源是默认数据源
    public SqlSessionTemplate test2SqlSessionTemplate(
            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sessionfactory) {
        return new SqlSessionTemplate(sessionfactory);
    }

}

###JdjApplication

package com.sykj.jdj;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableAutoConfiguration
public class JdjApplication {

    public static void main(String[] args) {
        SpringApplication.run(JdjApplication.class, args);
    }

}

###User1Dao

package com.sykj.jdj.dao.test1;

import com.sykj.jdj.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface User1Dao {

    User selectById(Integer id);

}

###User2Dao

package com.sykj.jdj.dao.test2;

import com.sykj.jdj.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface User2Dao {

    User selectById(Integer id);

}

###TestService

package com.sykj.jdj.service;

import com.sykj.jdj.dao.test1.User1Dao;
import com.sykj.jdj.dao.test2.User2Dao;
import com.sykj.jdj.entity.User;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class TestService {

    @Resource
    private User1Dao user1Dao;
    @Resource
    private User2Dao user2Dao;

    public User test1(){
        User user = user1Dao.selectById(1);
        return user;
    }

    public User test2(){
        return user2Dao.selectById(1);
    }


}

###User1Mapper

<?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.sykj.jdj.dao.test1.User1Dao">
    <resultMap id="resultMap" type="com.sykj.jdj.entity.User">
        <id column="id" property="id"/>
        <result column="nickName" property="nickName"/>
    </resultMap>

    <select id="selectById" resultMap="resultMap" resultType="java.lang.Integer">
      select * from user where id = #{id}
    </select>

</mapper>

###User2Mapper

<?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.sykj.jdj.dao.test2.User2Dao">
    <resultMap id="resultMap" type="com.sykj.jdj.entity.User">
        <id column="id" property="id"/>
        <result column="nickName" property="nickName"/>
    </resultMap>

    <select id="selectById" resultMap="resultMap" resultType="java.lang.Integer">
      select * from user where id = #{id}
    </select>

</mapper>

项目结构

C:.
└─src
    └─main
       ├─java
       │  └─com
       │      └─sykj
       │          └─jdj
       │              ├─config
       │              │  ├─datasource
       │              ├─controller
       │              ├─dao
       │              │  ├─test1
       │              │  └─test2
       │              ├─entity
       │              ├─service
       │              └─util
       └─resources
           ├─mapper
           │  ├─test1
           │  └─test2
           ├─static
           └─templates

项目细节方面

  1. User1Dao与User2Dao 必须位于两个不同的包下
  2. User1Dao与User2Dao 必须名称不相同,哪怕在不同的包下,名称也必须不相同
  3. User1Mapper 与 User2Mapper 必须位于不同的文件夹下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萨技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值