在最近的项目中需要在一个微服务里面同时连接俩个数据库一个mysql 一个oracle,当时心里在想不就是多数据源嘛 简单!唰唰的就写好了配置如下
spring:
datasource:
druid:
first:
driver-class-name: com.mysql.cj.jdbc.Driver
password: ${spring.datasource.password}
url: ${spring.datasource.url}
username: ${spring.datasource.username}
second:
driver-class-name: oracle.jdbc.driver.OracleDriver
password: *****
url: jdbc:oracle:thin:@localhost:1521:ORCL
username: orcl
#mybatis
mybatis-plus:
mapper-locations: classpath*:**/mapper/*/*Dao.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: cn.com.**.entity
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 0
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
#驼峰下划线转换
db-column-underline: true
#刷新mapper 调试神器
refresh-mapper: true
#数据库大写下划线转换
#capital-mode: true
#序列接口实现类配置
#key-generator: com.baomidou.springboot.xxx
#逻辑删除配置
logic-delete-value: -1
logic-not-delete-value: 0
#自定义填充策略接口实现
#meta-object-handler: com.baomidou.springboot.xxx
#自定义SQL注入器
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
因为配置数据源的时候默认是mysql数据源的所以之前操作的时候一直没问题。
但是后面在用mybatis-plus操作oracle的时候却是出了问题
@PostMapping("/save")
@DataSource(name = DataSourceNames.SECOND)
public SmsSend save(@Validated(AddGroup.class) @RequestBody SmsSend smsSend){
smsService.insert(smsSend);
return smsSend;
}
使用mybatis-plus 默认方法一执行语句就报错
这是什么鬼???赶紧百度了一下然后发现都是说SQL不正确 去除尾部的 ;之类的。
对此我就呵呵呵呵呵。。。这个是默认生成的根本尾部就没有; 之类的好吗,所以说爆无效字符的时候 SQL语句不正确是肯定的了,但是到底是不是尾部多了分号问题呢?这个就有待商榷了。
比如现在,我思考了一下然后将日期字段去掉 然后再调用,发现就OK了 原因就是因为MYSQL 和ORACLE的语句还是存在差异的。而mybatis-plus 默认来说是运行期间就只支持一种数据源,初始化的时候就已经决定了。他无法动态转换,着就导致你在使用oracle数据源的时候想执行语句 但是mybatis-plus生成出来的却是mysql语句。这就是导致你报错的原因了。
那么有没有办法解决呢?
FAQ:
解决办法的话有以下几种:
1、统一一种数据库,多种数据库操作分服务部署;
2、没办法了一定要用的话,只能是默认数据源之前定义的是mysql的话 那么mysql 在使用mybatis-plus是没有问题的。但是oracle的话是不行了,他只能是老老实实的去mapper.xml 文件中去写SQL吧!不过也是得注意一下mysql 与oracle 语句是不一样的。
3.我这边使用的动态数据源是基于springboot AOP来写的,但是现在mybatis-plus现在好像是出了2.0已经支持多数据源了可以很方便的进行多数据源操作或者读写分离之类的。<mybatis-plus动态数据源>
可以尝试一下如果是集成它的依赖来写是否能够解决这个问题呢?(PS:我自己尚未尝试过,只是有这个想法如果各位大佬有人尝试过的话,可以告诉我一下^_^)