浪子逍遥遥的gravatar头像
浪子逍遥遥 2017-05-08 11:16:26

spring boot + mybatis(通用mapper) druid多数据源切换配置

项目结构:

spring boot + mybatis(通用mapper) druid多数据源切换配置

1.配置数据源

spring boot + mybatis(通用mapper) druid多数据源切换配置

2.动态数据源切换

spring boot + mybatis(通用mapper) druid多数据源切换配置

3.注册动态数据源

package com.xe.demo.common.ds;

import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.bind.RelaxedDataBinder;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;

/**
 * 动态数据源注册
 * @author CZH
 */
public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware {

    private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceRegister.class);

    // 数据源配置信息
    private PropertyValues dataSourcePropertyValues;
    // 默认数据源
    private DataSource defaultDataSource;
    // 动态数据源
    private Map<String, DataSource> dynamicDataSources = new HashMap<>();

    /**
     * 加载多数据源配置
     */
    @Override
    public void setEnvironment(Environment env) {
        RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver(env, "jdbc.");
        String dsPrefixs = propertyResolver.getProperty("datasources");
        for (String dsPrefix : dsPrefixs.split(",")) {// 多个数据源
            Map<String, Object> map = propertyResolver.getSubProperties(dsPrefix + ".");
            DataSource ds = initDataSource(map);
            // 设置默认数据源
            if ("ds".equals(dsPrefix)) {
                defaultDataSource = ds;
            } else {
                dynamicDataSources.put(dsPrefix, ds);
            }
            dataBinder(ds, env);
        }
    }

    /**
     * 初始化数据源
     * @param map
     * @return
     */
    @SuppressWarnings("unchecked")
    public DataSource initDataSource(Map<String, Object> map) {
        String driverClassName = map.get("driverClassName").toString();
        String url = map.get("url").toString();
        String username = map.get("username").toString();
        String password = map.get("password").toString();
        
        String dsType = map.get("dsType").toString();
        Class<DataSource> dataSourceType;
        DataSource dataSource = null;
        try {
            dataSourceType = (Class<DataSource>) Class.forName(dsType);

            dataSource = DataSourceBuilder.create().driverClassName(driverClassName).url(url)
                    .username(username).password(password).type(dataSourceType).build();;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return dataSource;
    }

    /**
     * 加载数据源配置信息
     * @param dataSource
     * @param env
     */
    private void dataBinder(DataSource dataSource, Environment env) {
        RelaxedDataBinder dataBinder = new RelaxedDataBinder(dataSource);
        dataBinder.setIgnoreNestedProperties(false);// false
        dataBinder.setIgnoreInvalidFields(false);// false
        dataBinder.setIgnoreUnknownFields(true);// true
        if (dataSourcePropertyValues == null) {
            Map<String, Object> values = new RelaxedPropertyResolver(env, "datasource").getSubProperties(".");
            dataSourcePropertyValues = new MutablePropertyValues(values);
        }
        dataBinder.bind(dataSourcePropertyValues);
    }

    /**
     * 注册数据源been
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
        // 将主数据源添加到更多数据源中
        targetDataSources.put("dataSource", defaultDataSource);
        // 添加更多数据源
        targetDataSources.putAll(dynamicDataSources);

        // 创建DynamicDataSource
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(DynamicDataSource.class);
        beanDefinition.setSynthetic(true);
        MutablePropertyValues mpv = beanDefinition.getPropertyValues();
        mpv.addPropertyValue("defaultTargetDataSource", defaultDataSource);
        mpv.addPropertyValue("targetDataSources", targetDataSources);
        registry.registerBeanDefinition("dataSource", beanDefinition);

        logger.info("多数据源注册成功");
    }

}

4.动态数据源注解切点

spring boot + mybatis(通用mapper) druid多数据源切换配置

5.通过切点切换数据源

spring boot + mybatis(通用mapper) druid多数据源切换配置

6.在service层通过注解切换不同数据源

package com.xe.demo.service;

import java.util.Date;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.xe.demo.common.ds.TargetDataSource;
import com.xe.demo.common.pojo.AjaxResult;
import com.xe.demo.common.pojo.PageAjax;
import com.xe.demo.common.utils.AppUtil;
import com.xe.demo.model.AuthUser;

@Service
public class UserService extends AbstratService<AuthUser> {

    /**
     * 使用默认数据源
     * @param page
     * @param user
     * @return
     */
    public PageAjax<AuthUser> queryUserDefPage(PageAjax<AuthUser> page, AuthUser user){
        return queryPage(page, user);
    }
    
    @TargetDataSource("ds")
    public PageAjax<AuthUser> queryUserDsPage(PageAjax<AuthUser> page, AuthUser user){
        return queryPage(page, user);
    }
    
    @TargetDataSource("ds1")
    public PageAjax<AuthUser> queryUserDs1Page(PageAjax<AuthUser> page, AuthUser user){
        return queryPage(page, user);
    }
    
    @TargetDataSource("ds2")
    public PageAjax<AuthUser> queryUserDs2Page(PageAjax<AuthUser> page, AuthUser user){
        return queryPage(page, user);
    }

    /**
     * 事务测试
     * @param user
     * @return
     */
    @Transactional//添加事务
    @TargetDataSource("ds1")
    public AjaxResult addUser(AuthUser user) {
        String str = AppUtil.getRandomString(5);
        user.setUsername("user" + str);
        user.setPassword("123456");
        user.setEmail(str + "@test.com");
        user.setRoleid(5);
        user.setUseable(1);
        user.setAddtime(new Date());
        int ret = insert(user);
        if(ret > 0){
            System.out.println(1/0);
            user = new AuthUser();
            str = AppUtil.getRandomString(5);
            user.setUsername("user" + str);
            user.setPassword("123456");
            user.setEmail(str + "@test.com");
            user.setRoleid(5);
            user.setUseable(1);
            user.setAddtime(new Date());
        }
        return save(user);
    }
}

7.启动项目

spring boot + mybatis(通用mapper) druid多数据源切换配置spring boot + mybatis(通用mapper) druid多数据源切换配置

8.浏览器访问:http://localhost:8280

spring boot + mybatis(通用mapper) druid多数据源切换配置


打赏

文件名:demo-boot-multdata.zip,文件大小:62.671K 下载
最代码最近下载分享源代码列表最近下载
123456ym  LV9 2022年4月27日
maojianyun  LV30 2022年4月13日
1214066599  LV8 2022年4月4日
wsupsup  LV16 2021年9月22日
xxxjjj123  LV6 2021年7月30日
小海脑洞大开  LV11 2021年7月29日
alin007  LV5 2019年12月23日
koumeiyuu  LV8 2019年12月18日
qiheideguang  LV16 2019年9月9日
sksd520  LV3 2019年8月8日
最代码最近浏览分享源代码列表最近浏览
安东尼online  LV11 1月16日
dengjunjun  LV15 2023年1月5日
123456ym  LV9 2022年4月27日
1214066599  LV8 2022年4月4日
jy1218  LV12 2022年1月18日
Hachi6  LV13 2021年12月20日
采暖11  LV11 2021年11月23日
mugege123  LV6 2021年11月16日
wsupsup  LV16 2021年9月18日
wangshuo90  LV3 2021年9月2日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友