都知道mysql解决冲突的办法为在存在冲突的字段上加``,mybatis可以在@TableField注解上加``
但该解决方法不适用于多数据源的情况,例如达梦数据库需要加"",Oracle数据库可以加""也可以不做处理,因此需要其他的方法。
MybatisPlus的InnerInterceptor 可以解决该问题,原理就是在查询前修改SQL,代码如下
public class MybatisKeywordInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
DbType dbType = JdbcUtils.getDbType(executor);
String buildSql = boundSql.getSql();
String newSql="";
if(dbType == DbType.MYSQL){
newSql = buildSql
.replaceAll(" range,", "`range`,")
.replaceAll(",range,", ",`range`,")
.replaceAll(",range ", ",`range`")
.replaceAll(" range ", "`range`")
.replaceAll(" RANGE,", "`RANGE`,")
.replaceAll(",RANGE,", ",`RANGE`,")
.replaceAll(",RANGE ", ",`RANGE`")
.replaceAll(" RANGE ", "`RANGE`")
.replaceAll(" language,", "`language`,")
.replaceAll(",language,", ",`language`,")
.replaceAll(",language ", ",`language`")
.replaceAll(" language ", "`language`")
.replaceAll(" LANGUAGE,", "`LANGUAGE`,")
.replaceAll(",LANGUAGE,", ",`LANGUAGE`,")
.replaceAll(",LANGUAGE ", ",`LANGUAGE`")
.replaceAll(" LANGUAGE ", "`LANGUAGE`");
}
PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
mpBoundSql.sql(newSql);
}
}
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 自定义查询重写
interceptor.addInnerInterceptor(mybatisKeywordInterceptor());
return interceptor;
}
/**
* 自定义关键字查询重写插件
*/
public MybatisKeywordInterceptor mybatisKeywordInterceptor(){
return new MybatisKeywordInterceptor();
}
}