SpringBoot+MyBatis配置多数据源

SpringBoot+MyBatis配置多数据源

在应用的入口中,我们需要修改一下,主要功能是能不能自动识别xml配置文件里面的设置,需要手动代码设置

例如:mybatis.mapper-locations=classpath:dbxml/*.xml

//排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

这是因为SpringBoot会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除DataSourceAutoConfiguration的自动配置.

配置数据源

这里我们配置来两个数据源 一个是shopcart,一个website,修改application.properties文件

复制代码
# 数据库配置
#基本属性--
spring.datasource.shopcart.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.shopcart.username=sa
spring.datasource.shopcart.password=1234
spring.datasource.shopcart.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.shopcart.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo
#基本属性--
spring.datasource.website.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.website.username=sa
spring.datasource.website.password=1234
spring.datasource.website.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.website.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo

# mybatis配置
mybatis.mapper-locations=classpath:dbxml/*.xml
application.properties
复制代码

创建配置文件封装类

为了更合理的使用配置文件,这里我们没有使用之前的@Value,而是自己封装一个PropertiesConfig类对象.如下

@Data注解需要添加Lombok插件并开启,需要不想安装的话,请为下面的四个成员变量提供set/get方法即可

数据源shopcart配置文件封装

复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * <pre>
 * 数据源shopcart配置文件封装
 * </pre>
 *
 * @author wangyunpeng
 * @date 2020/2/24 8:52
 */
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.shopcart")
public class ShopCartDataBaseProperties {
    String url;
    String username;
    String password;
    String driverClassName;
    String typeAliasesPackage;
}
ShopCartDataBaseProperties
复制代码

数据源website配置文件封装

复制代码
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * <pre>
 * 数据源website配置文件封装
 * </pre>
 *
 * @author wangyunpeng
 * @date 2020/2/24 8:53
 */
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.website")
public class WebSiteDataBaseProperties {
    String url;
    String username;
    String password;
    String driverClassName;
    String typeAliasesPackage;
}
WebSiteDataBaseProperties
复制代码

完成数据源配置

这里需要完成DataSource/SqlSessionFactory/SessionTemp等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的Bean必须使用@Primary完成注解.

下面是两个数据源的配置,其中ShopCart使用了@Primary注解

MapperScan注解的basePackages 表示了其目录下的Mapper使用文件使用该数据源,如ShopCartDataSource中表示tb.db.mysql.shopcart.mybatis下的Maper文件将使用ShopCartDataSource.

第一个数据源: ShopCartDataSource

复制代码
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.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

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

/**
 * <pre>
 * 完成shopcart数据源配置
 * </pre>
 *
 * @author wangyunpeng
 * @date 2020/2/24 9:00
 */
@Configuration
@MapperScan(basePackages = "tb.db.mysql.shopcart.mybatis"
        , sqlSessionTemplateRef ="shopcartSqlSessionTemplate")
public class ShopCartDataSourceConfig {
    /**
     * 注入类 Environment 可以很方便的获取配置文件中的参数
     */
    @Resource
    private Environment env;

    @Resource
    private  ShopCartDataBaseProperties prop;

    /**
     * 创建数据源
     * @return
     */
    @Bean(name = "shopcartDS")
    @Primary
    public DataSource getDataSource() {
        DataSource build =  DataSourceBuilder.create()
                .driverClassName(prop.driverClassName)
                .url(prop.url)
                .username(prop.username)
                .password(prop.password)
                .build();
        return build;
    }

    /**
     * 创建SessionFactory
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "shopcartSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("shopcartDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean  bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage(prop.typeAliasesPackage);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
        return bean.getObject();
    }

    /**
     * 创建事务管理器
     * @param dataSource
     * @return
     */
    @Bean("shopcartTransactionManger")
    @Primary
    public DataSourceTransactionManager transactionManger(@Qualifier("shopcartDS") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 创建SqlSessionTemplate
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name = "shopcartSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("shopcartSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
ShopCartDataSourceConfig
复制代码

第二个数据源:WebSiteDataSource

复制代码
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.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

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

/**
 * <pre>
 *完成website数据源配置
 * </pre>
 *
 * @author wangyunpeng
 * @date 2020/2/24 9:06
 */
@Configuration
@MapperScan(basePackages = "tb.db.mysql.website.mybatis"
        , sqlSessionTemplateRef ="websiteSqlSessionTemplate")
public class WebSiteDataSourceConfig {

    /**
     * 注入类 Environment 可以很方便的获取配置文件中的参数
     */
    @Resource
    private Environment env;

    @Resource
    private  WebSiteDataBaseProperties prop;

    /**
     * 创建数据源
     * @return
     */
    @Bean(name = "websiteDS")
    public DataSource getDataSource() {
        DataSource build =  DataSourceBuilder.create()
                .driverClassName(prop.driverClassName)
                .url(prop.url)
                .username(prop.username)
                .password(prop.password)
                .build();
        return build;
    }

    /**
     * 创建SessionFactory
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name = "websiteSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("websiteDS") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage(prop.typeAliasesPackage);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
        return bean.getObject();
    }

    /**
     * 创建事务管理器
     * @param dataSource
     * @return
     */
    @Bean("websiteTransactionManger")
    @Primary
    public DataSourceTransactionManager transactionManger(@Qualifier("websiteDS") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 创建SqlSessionTemplate
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name = "websiteSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("websiteSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
WebSiteDataSourceConfig
复制代码

实现Mapper

根据数据源配置的MappScan目录来创建测试Mapper,代码如下,注意包名,放在正确的位置上.

程序入口Program

// 排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

 

posted @   —八戒—  阅读(560)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示