存在该问题的版本
都有
具体问题
集成Sharding打印SQL时发现BaseMapper的insert SQL语句格式换行符过多,而自定义的mapper sql则没有这个问题,希望优化一下BaseMapper的SQL格式。
具体日志
控制台输出的SQL信息:
2020-01-19 10:23:45.398 INFO 14764 --- [nio-8080-exec-7] ShardingSphere-SQL : Logic SQL: INSERT INTO order_info ( id, user_id, username, note ) VALUES ( ?, ?, ?, ? )
格式问题图地址:https://img-blog.csdnimg.cn/20200118112935710.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3oyODEyNjMwOA==,size_16,color_FFFFFF,t_70)
具体项目信息
根据ShardingJDBC官网的配置文档搭建分片环境时出现,具体配置例子信息在该文章中项目搭建部分,目前个人是通过继承MybatisXMLLanguageDriver重写createParameterHandler()方法通过反射去进行SQL格式化:
public class ExtMybatisXMLLanguageDriver extends MybatisXMLLanguageDriver {
/**
* 缓存反射字段,减少反射带来的性能损耗
*/
private final Field sqlField;
public ExtMybatisXMLLanguageDriver() throws NoSuchFieldException {
Class boundSqlClass = BoundSql.class;
sqlField = boundSqlClass.getDeclaredField("sql");
try {
sqlField.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public MybatisDefaultParameterHandler createParameterHandler(MappedStatement mappedStatement,
Object parameterObject, BoundSql boundSql) {
String sql = boundSql.getSql();
try {
sqlField.set(boundSql, sql.replaceAll("\r\n|\n", " ")
.replaceAll("\\s{2,}", " "));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return new MybatisDefaultParameterHandler(mappedStatement, parameterObject, boundSql);
}
}
Comment From: miemieYaho
方便debug的,换logback或log4j2打印sql
Comment From: Wilson-He
但SQL的格式问题不应该交给日志框架解决,ShardingJDBC的SQL日志打印是直接打印Mybatils plus里的动态SQL,目前只发现BaseMapper的insert方法有该格式问题,更新与删除都没有每个字段换行的
Comment From: miemieYaho
日志框架才不会解决格式问题,updateById一样是有换行的