一、简介
网上看了很多Mybatis的多数据源配置,使用aop或者编写配置类自定义数据源等等,感觉蛮复杂的,后面发现mybatis-plus配置多数据源方式很简单,就一个配置文件加@DS注解搞定,简单又好维护
mybatis-plus作为mybatis的增强版,在维持Mybatis自带功能基础上扩展了新的功能,主要包括:
- 提供CRUD方法:封装了一些通用的增删改查方法,包括批量操作,可以直接使用提供的接口调用
- 代码生成器:比mybatis的好用
- 条件构造器:通过EntityWrapper<T>可自行构造sql条件,可以理解为将sql语句转换为java代码
二、使用
- pom文件加入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.2.1</version> </dependency>
-
applicaton文件进行配置
mybatis-plus: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.demo.entity gloabl_config: db-config: #AUTO数据库ID自增,NONE若有手动设置主键值,则使用手动设置的值,如果没有,则使用雪花算法生成,INPUT insert前自行set主键值 #ASSIGN_ID雪花算法分配ID,主键类型为Number或String,ASSIGN_UUID分配UUID,主键类型为String id-type: ASSIGN_UUID #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" field-strategy: NOT_NULL #逻辑删除值 logic-delete-value: -1 logic-not-delete-value: 0 #原生配置 configuration: #数据库字段下划线转换为驼峰命名 map-underscore-to-camel-case: true #是否开启缓存 cache-enabled: false #字段为null也返回 call-setters-on-nulls: true #传入Null值时设置转换类为空 jdbc-type-for-null: 'null' spring: datasource: druid: validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: false login-username: admin login-password: admin filter: stat: enabled: true log-slow-sql: true slow-sql-millis: 1000 merge-sql: false wall: enabled: true config: multi-statement-allow: true web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" profile-enable: true session-stat-enable: true session-stat-max-count: 200 principal-cookie-name: USER_COOKIE principal-session-name: USER_SESSION aop-patterns: com.example.demo.service.* # 如果有循环依赖导致报错,则需去掉此项配置,并启用DruidConfig dynamic: primary: master datasource: master: url: jdbc:oracle:thin:@xxxxxxx:Desendb username: xxxxx password: xxxxx driver-class-name: oracle.jdbc.OracleDriver type: com.alibaba.druid.pool.DruidDataSource slave_1: url: jdbc:oracle:thin:@xxxxxxx:Desendb username: xxxxx password: xxxxx driver-class-name: oracle.jdbc.OracleDriver type: com.alibaba.druid.pool.DruidDataSource
上面贴出了一些常见的配置(连接数据库的信息已注释,自行配置),具体详情参考官网文档。这里配置多数据源时遇到了点小问题,mybatis-plus官方给的文档没有集成druid,导致运行一直报错,后来反复调整配置最终出来了这一版可用,druid和dynamic是同一级,并且下面的子项缩进也要注意,一不小心就遇坑。
-
springboot启动类配置
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
这里加上 exclude = DruidDataSourceAutoConfigure.class 是因为DruidDataSourceAutoConfigure会默认帮我们配置单数据源,但是项目中现在用的又是多数据源起冲突了,所以加上这个配置就排除了druid数据源的自动配置
-
使用
@Service @DS("master") public class TaskLogServiceImpl extends ServiceImpl<TaskLogDao, TaskLog> implements TaskLogService { @Override public Pagination<TaskLog> queryPage(Map<String, Object> params) { IPage<TaskLog> page = this.page(new PageBuilder<TaskLog>(params).build(), new QueryWrapper<>()); return new Pagination<>(page); } @Override public List<TaskLog> getAll() { return this.baseMapper.getAll(); } }
使用@DS注解进行切换,括号里的值为在配置文件自定义的数据源名称,该注解可用用在类上或方法上,方法的优先级大于类,官方推荐加在service的实现类上,避免混乱
-
测试
如果配置成功,启动时日志会输出相应的数据源信息