存在该问题的版本

都有

具体问题

集成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一样是有换行的