Spring-boot+Durid+mybatis的多数据源集成方案

2025-11-03 11:01:13

1、创建两个数据库,一个数据库名为ideadb,作为主数据库,负责数据的插入和更新操作,另一个数据库为ideadb-r为从数据库,只负责数据的读取操作。

提示:可以通过mysqldump实现数据库的同步复制

Spring-boot+Durid+mybatis的多数据源集成方案

Spring-boot+Durid+mybatis的多数据源集成方案

Spring-boot+Durid+mybatis的多数据源集成方案

2、在Spring-boot的应用配置文件application.properties中配置两个数据源信息:

## master 数据源配置spring.datasource.master.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.master.url=jdbc:mysql://127.0.0.1:3306/ideadbspring.datasource.master.username=rootspring.datasource.master.password=hxbspring.datasource.master.driverClassName=com.mysql.jdbc.Driver## slave 数据源配置spring.datasource.slave.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.slave.url=jdbc:mysql://127.0.0.1:3306/ideadb-rspring.datasource.slave.username=rootspring.datasource.slave.password=hxbspring.datasource.slave.driverClassName=com.mysql.jdbc.Driver

Spring-boot+Durid+mybatis的多数据源集成方案

3、创建数据源配置类DSConfig,实现多数据源的初始化操作,在该类中构建了两个数据源bean对象masterDS和slaveDS;

package fantasy.datasource;import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/** * Created by Administrator on 2017/8/22 0022. */@Configurationpublic class DSConfig {    @Bean(name = "masterDS")    @ConfigurationProperties(prefix = "spring.datasource.master")    public DataSource dataSourceMaster() {        return DataSourceBuilder.create().build();    }   @Bean(name = "slaveDS")    @ConfigurationProperties(prefix = "spring.datasource.slave")    public DataSource dataSourceSlave() {        return DataSourceBuilder.create().build();    }}

Spring-boot+Durid+mybatis的多数据源集成方案

4、配置mapper包下的数据操作类对应的数据源

1)MasterDataSourceConfig类:masterDS应用于fantasy.dao.maste包下的所有mapper接口类

package fantasy.datasource;import com.alibaba.druid.pool.DruidDataSource;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.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.beans.factory.annotation.Value;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 org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration//fantasy.dao.master包下的mapper类使用该数据源@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")public class MasterDataSourceConfig {    static final String PACKAGE = "fantasy.dao.master";    @Autowired    @Qualifier("masterDS")    private DataSource masterDS;    @Bean    public SqlSessionFactory masterSqlSessionFactory() throws Exception {        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();        factoryBean.setDataSource(masterDS);        return factoryBean.getObject();    }    @Bean    public SqlSessionTemplate sqlSessionTemplateMaster() throws Exception {        SqlSessionTemplate template = new SqlSessionTemplate(masterSqlSessionFactory());        return template;    }}

2)SlaveDataSourceConfig类:slaveDS应用于fantasy.dao.slave包下的所有mapper接口类

package fantasy.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.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration//fantasy.dao.slave包下的mapper类使用该数据源@MapperScan(basePackages = SlaveDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "slaveSqlSessionFactory")public class SlaveDataSourceConfig {    static final String PACKAGE = "fantasy.dao.slave";    @Autowired    @Qualifier("slaveDS")    private DataSource slaveDS;    @Bean    public SqlSessionFactory slaveSqlSessionFactory() throws Exception {        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();        factoryBean.setDataSource(slaveDS);        return factoryBean.getObject();    }    @Bean    public SqlSessionTemplate sqlSessionTemplateMaster() throws Exception {        SqlSessionTemplate template = new SqlSessionTemplate(slaveSqlSessionFactory());        return template;    }}

Spring-boot+Durid+mybatis的多数据源集成方案

5、使用主数据源masterDS操作数据表,对应的mapper接口类:IdeaMapper 

package fantasy.dao.master;import fantasy.dao.Idea;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import org.apache.ibatis.annotations.Update;/** * Created by Administrator on 2017/8/13 0013. */@Mapperpublic interface IdeaMapper {    @Select("SELECT * FROM IDEA WHERE id = #{id}")    Idea findById(@Param("id") String id);    @Update("update idea set name=#{name} where id=#{id}")    boolean updateById(@Param("id") String id,@Param("name") String name);}

Spring-boot+Durid+mybatis的多数据源集成方案

6、使用只读数据源slaveDS查询数据表,对应的mapper接口类:IdeaReadonlyMapper

package fantasy.dao.slave;import fantasy.dao.Idea;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;/** * Created by Administrator on 2017/8/13 0013. */@Mapperpublic interface IdeaReadonlyMapper {    @Select("SELECT * FROM IDEA WHERE id = #{id}")    Idea findById(@Param("id") String id);}

7、在spring-boot主应用类中调用mapper接口类进行测试BulkApplication 

注明:需要在主应用类中通过注解方式禁用spring自动默认的数据源初始化

@SpringBootApplication(exclude = {       DataSourceAutoConfiguration.class //将spring boot自带的DataSourceAutoConfiguration禁掉})

**************

package fantasy;import fantasy.dao.master.IdeaMapper;import fantasy.dao.slave.IdeaReadonlyMapper;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.boot.web.servlet.ServletComponentScan;/** * Created by Administrator on 2017/8/13 0013. */@ServletComponentScan@SpringBootApplication(exclude = {        DataSourceAutoConfiguration.class //将spring boot自带的DataSourceAutoConfiguration禁掉})public class BulkApplication implements CommandLineRunner {    private final IdeaMapper ideaMapper;    private final IdeaReadonlyMapper ideaReadonlyMapperMapper;    public BulkApplication(IdeaMapper ideaMapper,IdeaReadonlyMapper ideaReadonlyMapperMapper)    {        this.ideaMapper = ideaMapper;        this.ideaReadonlyMapperMapper = ideaReadonlyMapperMapper;    }    @Override    public void run(String... strings) throws Exception {        System.out.println("************************************");        System.out.println("@masterdb:before update B001"+this.ideaMapper.findById("B001"));        this.ideaMapper.updateById("B001","F4轰炸机" );        System.out.println("@Masterdb:after update B001"+this.ideaMapper.findById("B001"));        System.out.println("************************************");        System.out.println("@SlaveDB:B001"+this.ideaReadonlyMapperMapper.findById("B001"));        System.out.println("************************************");    }    public static void main(String[] args) {        SpringApplication.run(BulkApplication.class, args);    }}

Spring-boot+Durid+mybatis的多数据源集成方案

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢