本文将讲述 spring boot + mybatis + druid 多数据源配置方案。

环境

CentOs7.3 安装 MySQL 5.7.19 二进制版本

Github 代码

代码我已放到 Github ,导入spring-boot-mybatis 项目

github https://github.com/souyunku/spring-boot-examples/tree/master/spring-boot-mybatis

添加依赖

在项目中添加 mybatis,druid 依赖

点击预览 pom.xml

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId>
</dependency>
省略 更多

基础数据源

@Configuration
@EnableConfigurationProperties(DruidDbProperties.class)
@Import({DruidMonitConfig.class})
public abstract class AbstractDruidDBConfig {private Logger logger = LoggerFactory.getLogger(AbstractDruidDBConfig.class);@Resourceprivate DruidDbProperties druidDbProperties;public DruidDataSource createDataSource(String url, String username, String password) {if (StringUtils.isEmpty(url)) {System.out.println("Your database connection pool configuration is incorrect!" + " Please check your Spring profile");throw new ApplicationContextException("Database connection pool is not configured correctly");}DruidDataSource datasource = new DruidDataSource();datasource.setUrl(url);datasource.setUsername(username);datasource.setPassword(password);// datasource.setDriverClassName(// StringUtils.isEmpty(driverClassName) ?// druidDbProperties.getDriverClassName() : driverClassName);datasource.setInitialSize(druidDbProperties.getInitialSize());datasource.setMinIdle(druidDbProperties.getMinIdle());datasource.setMaxActive(druidDbProperties.getMaxActive());datasource.setMaxWait(druidDbProperties.getMaxWait());datasource.setTimeBetweenEvictionRunsMillis(druidDbProperties.getTimeBetweenEvictionRunsMillis());datasource.setMinEvictableIdleTimeMillis(druidDbProperties.getMinEvictableIdleTimeMillis());datasource.setValidationQuery(druidDbProperties.getValidationQuery());datasource.setTestWhileIdle(druidDbProperties.isTestWhileIdle());datasource.setTestOnBorrow(druidDbProperties.isTestOnBorrow());datasource.setTestOnReturn(druidDbProperties.isTestOnReturn());try {datasource.setFilters(druidDbProperties.getFilters());} catch (SQLException e) {logger.error("druid configuration initialization filter", e);}datasource.setConnectionProperties(druidDbProperties.getConnectionProperties());return datasource;}/*** 加载默认mybatis xml配置文件,并初始化分页插件** @param dataSource* @return* @throws Exception*/public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {return createSqlSessionFactory(dataSource, "classpath:mybatis/**/*.xml");}/*** 加载mybatis xml配置文件,并初始化分页插件** @param dataSource      数据源* @param mapperLocations 自定义xml配置路径* @return* @throws Exception*/public SqlSessionFactory sqlSessionFactory(DataSource dataSource, String mapperLocations) throws Exception {return createSqlSessionFactory(dataSource, mapperLocations);}private SqlSessionFactory createSqlSessionFactory(DataSource dataSource, String mapperLocations) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);// mybatis分页PageHelper pageHelper = new PageHelper();Properties props = new Properties();props.setProperty("dialect", "mysql");props.setProperty("reasonable", "true");props.setProperty("supportMethodsArguments", "true");props.setProperty("returnPageInfo", "check");props.setProperty("params", "count=countSql");pageHelper.setProperties(props); // 添加插件sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageHelper});PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocations));return sqlSessionFactoryBean.getObject();}
}

Druid 监控配置

@EnableConfigurationProperties(DruidDbProperties.class)
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DruidMonitConfig {@Resourceprivate DruidDbProperties druidDbProperties;@Beanpublic ServletRegistrationBean druidServlet() {ServletRegistrationBean reg = new ServletRegistrationBean();reg.setServlet(new StatViewServlet());reg.addUrlMappings("/druid/*");if (!StringUtils.isEmpty(druidDbProperties.getAllow())) {reg.addInitParameter("allow", druidDbProperties.getAllow()); // 白名单}if (!StringUtils.isEmpty(druidDbProperties.getDeny())) {reg.addInitParameter("deny", druidDbProperties.getDeny()); // 黑名单}reg.addInitParameter("loginUsername", druidDbProperties.getUsername());reg.addInitParameter("loginPassword", druidDbProperties.getPassword());return reg;}@Beanpublic FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new WebStatFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;}/*** 监听Spring 1.定义拦截器 2.定义切入点 3.定义通知类** @return*/@Beanpublic DruidStatInterceptor druidStatInterceptor() {return new DruidStatInterceptor();}@Beanpublic JdkRegexpMethodPointcut druidStatPointcut() {JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut();String patterns = "io.ymq.mybatis*";druidStatPointcut.setPatterns(patterns);return druidStatPointcut;}@Beanpublic Advisor druidStatAdvisor() {return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());}
}

Druid 监控参数


@ConfigurationProperties(prefix = "druid")
public class DruidDbProperties {private String driverClassName = "com.mysql.jdbc.Driver";/*** 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时*/private int initialSize = 10;/*** 最小连接池数量*/private int minIdle = 50;/*** 最大连接池数量*/private int maxActive = 300;/*** 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。*/private int maxWait = 60000;/*** 有两个含义: 1)* Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 2)* testWhileIdle的判断依据,详细看testWhileIdle属性的说明*/private int timeBetweenEvictionRunsMillis = 60000;/*** 连接保持空闲而不被驱逐的最长时间*/private int minEvictableIdleTimeMillis = 3600000;/*** 用来检测连接是否有效的sql,要求是一个查询语句,常用select* 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。*/private String validationQuery = "SELECT USER()";/*** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。*/private boolean testWhileIdle = true;/*** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。*/private boolean testOnBorrow = false;/*** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。*/private boolean testOnReturn = false;/*** 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 监控统计用的filter:stat 日志用的filter:log4j* 防御sql注入的filter:wall*/private String filters = "mergeStat,config,wall";private String connectionProperties;/*** 白名单*/private String allow;/*** 黑名单*/private String deny;private String username = "admin";private String password = "admin";省略 get set
}

配置数据源 one

@Configuration
@EnableTransactionManagement
public class DBOneConfiguration extends AbstractDruidDBConfig {@Value("${ymq.one.datasource.url}")private String url;@Value("${ymq.one.datasource.username}")private String username;@Value("${ymq.one.datasource.password}")private String password;// 注册 datasourceOne@Bean(name = "datasourceOne", initMethod = "init", destroyMethod = "close")public DruidDataSource dataSource() {return super.createDataSource(url, username, password);}@Bean(name = "sqlSessionFactorYmqOne")public SqlSessionFactory sqlSessionFactory() throws Exception {return super.sqlSessionFactory(dataSource());}@Beanpublic PlatformTransactionManager transactionManager() throws SQLException {return new DataSourceTransactionManager(dataSource());}
}

配置数据源 two

@Configuration
@EnableTransactionManagement
public class DBOneConfiguration extends AbstractDruidDBConfig {@Value("${ymq.one.datasource.url}")private String url;@Value("${ymq.one.datasource.username}")private String username;@Value("${ymq.one.datasource.password}")private String password;// 注册 datasourceOne@Bean(name = "datasourceOne", initMethod = "init", destroyMethod = "close")public DruidDataSource dataSource() {return super.createDataSource(url, username, password);}@Bean(name = "sqlSessionFactorYmqOne")public SqlSessionFactory sqlSessionFactory() throws Exception {return super.sqlSessionFactory(dataSource());}@Beanpublic PlatformTransactionManager transactionManager() throws SQLException {return new DataSourceTransactionManager(dataSource());}
}

BaseDao one

@Repository
public class YmqOneBaseDao extends BaseDao {@Resourcepublic void setSqlSessionFactorYmqOne(SqlSessionFactory sqlSessionFactory) {super.setSqlSessionFactory(sqlSessionFactory);}
}

BaseDao two

@Repository
public class YmqTwoBaseDao extends BaseDao {@Resourcepublic void setSqlSessionFactorYmqTwo(SqlSessionFactory sqlSessionFactory) {super.setSqlSessionFactory(sqlSessionFactory);}
}

测试 Controller

@RestController
public class IndexController {private static final Logger LOG = LoggerFactory.getLogger(IndexController.class);@Autowiredprivate YmqOneBaseDao ymqOneBaseDao;@Autowiredprivate YmqTwoBaseDao ymqTwoBaseDao;@RequestMapping("/")public String index() throws Exception {List<TestOnePo> testOnePoList = null;testOnePoList = ymqOneBaseDao.selectList(new TestOnePo());for (TestOnePo item : testOnePoList) {LOG.info("数据源 ymqOneBaseDao :查询结果:{}", JSONObject.toJSONString(item));}List<TestTwoPo> testTwoPoList = null;testTwoPoList = ymqTwoBaseDao.selectList(new TestTwoPo());for (TestTwoPo item : testTwoPoList) {LOG.info("数据源 ymqTwoBaseDao:查询结果:{}", JSONObject.toJSONString(item));}String onePoList = JSONObject.toJSONString(testOnePoList);String twoPoList = JSONObject.toJSONString(testTwoPoList);return "数据源 ymqOneBaseDao :查询结果:" + onePoList + "<br/> 数据源 ymqTwoBaseDao :查询结果:" + twoPoList;}
}

参数配置

application.properties

#############SERVER CONFIG############
spring.application.name=ymq-mybatis-spring-boot#数据源 one
ymq.one.datasource.url=jdbc:mysql://10.4.82.6:3306/ymq_one?useUnicode=true&characterEncoding=UTF-8
ymq.one.datasource.username=root
ymq.one.datasource.password=123456#数据源 two
ymq.two.datasource.url=jdbc:mysql://10.4.82.6:3306/ymq_two?useUnicode=true&characterEncoding=UTF-8
ymq.two.datasource.username=root
ymq.two.datasource.password=123456server.port=80
server.tomcat.max-threads=1000
server.tomcat.max-connections=2000

启动服务

@SpringBootApplication
@ComponentScan(value = {"io.ymq.mybatis"})
public class Startup {public static void main(String[] args) {SpringApplication.run(Startup.class, args);}
}

在页面上输入 http://localhost/ 可以看到 Controller 执行情况:

数据源 ymqOneBaseDao :查询结果:[{"id":1,"name":"测试","remark":"这是测试 ymq_one 数据库"}]
数据源 ymqTwoBaseDao :查询结果:[{"id":1,"name":"测试","remark":"这是测试 ymq_two 数据库"}]

在页面上输入 http://localhost/druid/ 可以看到监控到的sql语句执行情况:

代码我已放到 Github ,导入spring-boot-mybatis 项目

github https://github.com/souyunku/spring-boot-examples/tree/master/spring-boot-mybatis

Contact

  • 作者:鹏磊
  • 出处:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版权归作者所有,转载请注明出处
  • Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享

Spring Boot 中使用 MyBatis 整合 Druid 多数据源相关推荐

  1. Spring Boot数据库操作原理及整合druid数据源和mybatis

    在Spring Boot中如果需要访问数据库,我需要导入以下两个依赖: <dependency><groupId>org.springframework.boot</gr ...

  2. Spring Boot中使用MyBatis注解配置详解

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  3. Java工作笔记-Spring Boot中使用Mybatis操作达梦数据库

    这里以达梦数据库为例,使用MyBatis对数据库进行增删改查 这里先给出截图 此处为了简单,直接在Controller里面调用dao中数据: 关键代码如下: application.propertie ...

  4. Spring Boot 中使用MyBatis Mapper方式(xml)

    1 移动原有的**Mapper.xml格式的文件到Resource静态资源文件 2 在Application.java 中添加Mapper扫描  @MapperScan("com.dao&q ...

  5. spring boot 1.5.4 整合 mybatis(十二)

    上一篇:spring boot 1.5.4 整合log4j2(十一) Spring Boot集成Mybatis 更多更详细的配置参考文件:application.properties和<Spri ...

  6. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

  7. mybatis注解开发_Spring Boot 中集成 MyBatis

    阅读本文约需要5分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了Spring Boot 中的AOP处理,今天给大家分享下 ...

  8. 关于纯洁的微笑《Spring Boot(七):Mybatis 多数据源最简解决方案》文章补充说明多数据源事务的配置

    关于Spring boot中使用Mybatis多数据源的配置,我推荐纯洁的微笑博主的<Spring Boot(七):Mybatis 多数据源最简解决方案>这篇文章,简单清晰易懂 疑问 但是 ...

  9. Spring Boot入门系列(六)Spring Boot如何使用Mybatis XML 配置版【附详细步骤】

    前面介绍了Spring Boot 中的整合Thymeleaf前端html框架,同时也介绍了Thymeleaf 的用法.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/z ...

最新文章

  1. 「SAP技术」MIGO 343 解冻物料库存的同时可以更改存储地点
  2. 因果解释能够对规则进行解释吗?
  3. mysql windows集群_Mysql集群windows服务器版搭建过程
  4. 中国牙科用人工骨替代材料市场供需态势与未来投资方向分析报告2022年
  5. Java多线程之单例模式在多线程环境下的安全问题
  6. 40:数组中只出现一次的数字
  7. 帝国 loginjs.php,帝国cms 6.6 后台拿shell
  8. HDU 4923 Room and Moor(瞎搞题)
  9. python的django框架是干嘛的_Django框架在Python开发很重要为什么?
  10. 整理了近五年顶会都收录了哪些实体链接文章
  11. SpringBoot入门教程(十四)导出Excel
  12. 1080 MOOC期终成绩(25 分)
  13. 分布式开源调度框架TBSchedule详解
  14. 任正非对姚安娜是劝退式支持吗
  15. 数据结构与算法--线性表
  16. 零基础学习3D建模,第一步:3D建模软件有哪些?给你科普一下
  17. java 数组形式字符串_java 数组格式字符串转化为字符串
  18. “Ballerina”可能成为集成的编程语言
  19. 2021年危险化学品经营单位安全管理人员考试报名及危险化学品经营单位安全管理人员证考试
  20. 2023年中央财经大学数量经济学考博必看上岸前辈复习经验分享

热门文章

  1. 心理医生给女人的忠告
  2. VMWare下虚拟机ubuntu与宿主机windows文件共享
  3. linux内核替换图片,linux内核替换 - magic_吕伟的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. aspnet是前端还是后端_项目开发中无法回避的问题:前端和后端如何合作和并行工作?...
  5. java新闻分页_新闻实现分页显示
  6. java模拟servlet_Java应用程序模拟向Servlet发送POST请求
  7. 鸿蒙os2.0游戏体验,华为运行鸿蒙OS 2.0体验:界面近似EMUI 11
  8. 用python玩转数据第四周答案_大学慕课用Python玩转数据答案公众号
  9. 模拟撞击_模玩资讯:EPOCH 汽车撞击测试用模拟假人与实验车辆
  10. (4) hibernate增删查改+批量操作+类似Mybatis动态sql