前言:由于之前用的是开源的bootdo项目作基础框架,在此基础上进行业务流程的开发。最近要进行国产化,数据库需要切换到达梦数据库。因此修改该框架配置,使其支持多数据源,且其中一个数据源是达梦数据库。下面是各个步骤的说明:

1.pom.xml文件配置

     <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.4</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version></dependency><!--druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.29</version></dependency><!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.25</version></dependency><!--达梦驱动包--><dependency><groupId>com.dameng</groupId><artifactId>Dm8JdbcDriver18</artifactId><version>8.1.1.49</version></dependency>

2.yml文件配置:

spring:datasource:primary:driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://192.168.4.163:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8username: rootpassword: initialSize: 1minIdle: 3maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 30000validationQuery: select 'x' from dualtestWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 打开PSCache,并且指定每个连接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000# 合并多个DruidDataSource的监控数据#useGlobalDataSourceStat: truedm:driverClassName:  dm.jdbc.driver.DmDrivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:dm://localhost:5236/?STU&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8username: SYSDBApassword:

3.mybatis配置:

mybatis:configuration:map-underscore-to-camel-case: truejdbc-type-for-null: 'null'mapper-locations: mybatis/**/*Mapper.xmltypeAliasesPackage: com.test.**.domain

4.数据源配置

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
@EnableTransactionManagement
public class DatasourceConfiguration{private static final Logger log = LoggerFactory.getLogger(DatasourceConfiguration.class);@Value("${mybatis.typeAliasesPackage}")private String typeAliasesPackage;@Bean(name = "primaryDataSource")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource() {log.info("-------------------- primaryDataSource init ---------------------");return DataSourceBuilder.create().type(DruidDataSource.class).build();}@Bean(name = "dmDataSource")@ConfigurationProperties(prefix = "spring.datasource.dm")public DataSource dmDataSource() {log.info("-------------------- dmDataSource init ---------------------");return DataSourceBuilder.create().type(DruidDataSource.class).build();}/*** 多数据源配置* 特别说明:@Qualifier这个注解是用来指定注入类的,当通过@bean创建实体时,实体的name会默认使用方法名* 所以@Qualifier的参数就是上面两个创建数据源的方法的方法名* @param dm 达梦数据库数据源* @param mysql mysql数据库数据源* @return 动态数据源*/@Bean@Primarypublic DynamicDataSource dataSource(@Qualifier("primaryDataSource") DataSource mysql,@Qualifier("dmDataSource") DataSource dm) {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DatabaseType.dm, dm);targetDataSources.put(DatabaseType.mysql, mysql);DynamicDataSource dataSource = new DynamicDataSource();dataSource.setTargetDataSources(targetDataSources);// 该方法是AbstractRoutingDataSource的方法dataSource.setDefaultTargetDataSource(mysql);// 默认的datasource设置为myTestDbDataSourcereturn dataSource;}/*** 根据数据源创建SqlSessionFactory* @param dm 达梦数据库数据源* @param mysql mysql数据库数据源* @return SqlSessionFactory* @throws Exception*/@Beanpublic SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource mysql,@Qualifier("dmDataSource") DataSource dm,org.apache.ibatis.session.Configuration config) throws Exception{SqlSessionFactoryBean fb = new SqlSessionFactoryBean();fb.setDataSource(this.dataSource(dm, mysql));fb.setTypeAliasesPackage(typeAliasesPackage);fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/**/*Mapper.xml"));fb.setConfiguration(config);return fb.getObject();}/*** 配置事务管理器* @param dataSource 动态数据源* @return DataSourceTransactionManager* @throws Exception*/@Beanpublic DataSourceTransactionManager transactionManager(DynamicDataSource dataSource) throws Exception {return new DataSourceTransactionManager(dataSource);}@Bean@ConfigurationProperties(prefix = "mybatis.configuration")public org.apache.ibatis.session.Configuration globalConfiguration() {return new org.apache.ibatis.session.Configuration();}@Beanpublic ServletRegistrationBean druidServlet() {ServletRegistrationBean reg = new ServletRegistrationBean();reg.setServlet(new StatViewServlet());reg.addUrlMappings("/druid/*");reg.addInitParameter("allow", ""); //白名单return reg;}@Bean public FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new WebStatFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");filterRegistrationBean.addInitParameter("profileEnable", "true");filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");return filterRegistrationBean;}
}

DynamicDataSource:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/*** 动态数据源(需要继承AbstractRoutingDataSource)*/
public class DynamicDataSource extends AbstractRoutingDataSource {protected Object determineCurrentLookupKey() {return DatabaseContextHolder.getDatabaseType();}
}

DatabaseContextHolder:

/*** 作用:* 1、保存一个线程安全的DatabaseType容器*/
public class DatabaseContextHolder {private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>();public static void setDatabaseType(DatabaseType type){contextHolder.set(type);}public static DatabaseType getDatabaseType(){return contextHolder.get();}
}

DatabaseType:

/*** 列出所有的数据源key(常用数据库名称来命名)* 注意:* 1)这里数据源与数据库是一对一的* 2)DatabaseType中的变量名称就是数据库的名称*/
public enum DatabaseType {dm,mysql
}

PageQueryUtils:

import java.util.Map;public class PageQueryUtils {public static void parsePageParams(Map<String,Object> params) throws Exception {Object pageObj = params.get("page");if(pageObj ==null){throw new Exception("parameter page is null ");}Object limitObj  =  params.get("limit");if(limitObj == null){throw new Exception("parameter limit is null ");}Integer page = Integer.parseInt(pageObj.toString());Integer limit = Integer.parseInt(limitObj.toString());Integer offset = (page-1) * limit;if(offset < 0){throw new Exception("offset must grantter than 0 , input page is :" + page + " ,limit is : " + limit);}params.put("offset", offset);}
}

5.测试代码:

 @RequestMapping("queryDM")@ResponseBodypublic String queryDM(@RequestParam Map<String, Object> params) throws Exception {/* 特别注意,在调用mapper之前,必须调用该方法来切换数据源 */DatabaseContextHolder.setDatabaseType(DatabaseType.dm);return userService.listDm(params).toString();}@Overridepublic List<Event> listDm(Map<String, Object> params) {params.put("page", 1);params.put("limit", 10);try {PageQueryUtils.parsePageParams(params);} catch (Exception e) {e.printStackTrace();}List<Event> events = userMapper.listDm(params);return events;}<!-- 列表查询 --><select id="listDm" parameterType="map" resultMap="BaseResultMap">select "id","rule_id","rule_name","create_time"from "DM_TEST"."event_demo"<if test="offset > -1">limit #{offset},#{limit}</if></select>

注意:因为设置了默认的数据源为mysql,所以启动项目后所有的业务逻辑都操作的mysql数据库,这里测试一个方法切换为达梦数据源成功。

springboot开源热门项目-bootdo修改支持多数据源相关推荐

  1. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...

  2. 期盼已久全平台支持-开源IM项目OpenIM之uniapp更新

    国内uniapp使用广泛,OpenIM的uniapp sdk以及文档和demo (https://github.com/OpenIMSDK/Open-IM-Uniapp-Demo)都已更新,本文主要展 ...

  3. 2015 年 Git@OSC 新增热门开源软件项目 Top 50

    在刚刚过去的 2015 年里,Git@OSC 取得了巨大的发展,收录了大量热门优秀作品.与<2015 年 Git@OSC 最热门开源项目 Top 50>一样,此榜单仍然是通过 Watch. ...

  4. python开源考试_Github 上 10 个值得学习的 Springboot 开源项目

    spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化.编码更简化.部署更方便.近两年受到很多开发者的追捧,也是火热的不行! 下面给大家整理了 10 个 Git ...

  5. SpringBoot开源项目案例

    一.mall star 数 12.7k,项目地址: https://github.com/macrozheng/mall mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringB ...

  6. 回顾2011年最热门的开源PHP项目

    回顾2011年最热门的开源PHP项目 http://sd.csdn.net/a/20111231/309958.html 2011-12-31 09:22 | 188次阅读 | 来源:Dzone [已 ...

  7. Github 上 10 个值得学习的 Springboot 开源项目

    Spring Boot 几乎继承了所有 Spring 框架的优点,同时还可以让项目的配置更简化.编码更简化.部署更方便.近两年受到很多开发者的追捧,也是火热的不行! 下面给大家整理了 10 个 Git ...

  8. springboot tomcat配置_Spring Boot项目如何同时支持HTTP和HTTPS协议

    本文首发于个人网站:Spring Boot项目如何同时支持HTTP和HTTPS协议 如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程 ...

  9. 【开源掌机】百问网DShanMCU-Mio开源掌机(爻-澪)项目,完美支持运行10多个模拟器!

    众筹说明 定金翻倍,即定金19.9元,在付尾款时可抵40元(成品售价不会超过120元)!达标当天就开搞,满100人加速搞尽量在年前发货,让大家先玩起来!如果不达标则原路退款,项目取消. 众筹时间:20 ...

  10. 【众筹】百问网DShanMCU-Mio开源掌机(爻-澪)项目,完美支持运行10多个模拟器!

    众筹说明 定金翻倍,即定金19.9元,在付尾款时可抵40元(成品售价不会超过120元)!达标当天就开搞,满100人加速搞尽量在年前发货,让大家先玩起来!如果不达标则原路退款,项目取消. 众筹时间:20 ...

最新文章

  1. debian9.8与主机共享问题
  2. Windows终端中的自定义终端和用户界面(UI)
  3. 正态分布表怎么查表_《深入浅出统计学》-读书笔记-再谈正态分布的应用
  4. 非常好用的终端命令,稀饭~
  5. ireport设置当前页面纸张大小格式:为何每次右键显示的可选项不一样
  6. python怎么使用-Python中__all__作用何在以及如何使用?
  7. jenkins java必装插件_Jenkins(三)安装相关插件
  8. mysql 联合查询去重复_两个表联合查询去重复GROUP_CONCAT
  9. 2021年文件复制软件评测:FastCopy、TeraCopy、KillCopy、ExtremeCopy、Supercopier
  10. 【C语言及程序设计】项目1-4-2-4:计算圆柱体表面积
  11. 树莓派之安装Vulkan
  12. python求主析取范式_求公式q→(r∧p)的析取范式。
  13. 从内存角度深入看结构体(window/linux)大小
  14. 安卓手机卡顿怎么解决_手机卡了,内存不能乱清理!试试这3个方法,有效解决手机卡顿...
  15. MyCat Catlet实现 详解
  16. python外星人游戏制作
  17. 数据挖掘之 数据介绍思维导图
  18. 最小二乘法的详细解释
  19. 收银系统连接授权服务器失败,超市收银系统错误-COMException 依赖服务或组无法启动(0x8007042C)处理办法...
  20. 记录一次dns修复过程

热门文章

  1. 数据治理之数据发现-元数据-DataHub
  2. vue 显示日期只显示年月_Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示...
  3. linux查询电信端口,linux下获取电信,网通,铁通IP地址
  4. 屏蔽键盘信息(低级键盘钩子)
  5. 网络---NAT技术与代理服务器调研
  6. 针对吞吐量优化的架构
  7. linux检测扩容卡,TF内存卡是不是扩容卡准确质量检测
  8. 域控下发脚本_让系统及时的通过域用户脚本自动的打补丁
  9. rk3288问题总结!
  10. 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)