最代码广告位
浪子逍遥遥的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下载
最代码最近下载分享源代码列表最近下载
alin007 LV52019年12月23日
月亮星星
koumeiyuu LV72019年12月18日
月亮星星星星星星
qiheideguang LV152019年9月9日
月亮月亮月亮星星星星星星
sksd520 LV32019年8月8日
星星星星星星
15088605151@139.com LV122019年7月15日
月亮月亮月亮
759886267 LV112019年6月19日
月亮月亮星星星星星星
alongthink LV12019年6月18日
星星
136993907 LV102019年4月23日
月亮月亮星星星星
fellowfun LV102019年4月15日
月亮月亮星星星星
lironggang LV222019年3月29日
太阳月亮星星星星
最代码最近浏览分享源代码列表最近浏览
monkalon LV132月11日
月亮月亮月亮星星
xp95323 LV131月31日
月亮月亮月亮星星
路过人甲2019年12月26日
暂无贡献等级
alin007 LV52019年12月23日
月亮星星
koumeiyuu LV72019年12月18日
月亮星星星星星星
lih2502019年12月11日
暂无贡献等级
lzmlanglzm LV52019年12月11日
月亮星星
runningqi LV122019年12月3日
月亮月亮月亮
18720962954 LV22019年11月22日
星星星星
sw986306161 LV62019年11月21日
月亮星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友

页面底部区域 foot.htm