文章目录
- 1.common-mybatis-plus-starter
- 1.目录
- 2.引入依赖
- 3.SqlBeautyInterceptor.java SQL优化器
- 4.MybatisPLusAutoConfiguration.java 自动配置类,根据条件注入SQL优化器
- 5.spring.factories 指定自动配置类
- 2.common-mybatis-plus-starter-demo
- 1.application.yml 开启sql优化器
- 2.测试
1.common-mybatis-plus-starter
1.目录

2.引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>com.github.vertical-blank</groupId><artifactId>sql-formatter</artifactId><version>2.0.3</version></dependency><repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository></repositories>
3.SqlBeautyInterceptor.java SQL优化器
package com.sunxiansheng.mybatis.plus.inteceptor;import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.*;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.*;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.vertical_blank.sqlformatter.SqlFormatter;
import com.github.vertical_blank.sqlformatter.languages.Dialect;import java.sql.Statement;
import java.util.List;
import java.util.Properties;
import java.util.regex.Matcher;
@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),@Signature(type = StatementHandler.class, method = "batch", args = {Statement.class})
})
public class SqlBeautyInterceptor implements Interceptor {private static final Logger logger = LoggerFactory.getLogger(SqlBeautyInterceptor.class);@Overridepublic Object intercept(Invocation invocation) throws Throwable {StatementHandler statementHandler = (StatementHandler) invocation.getTarget();MetaObject metaObject = SystemMetaObject.forObject(statementHandler);MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");Configuration configuration = mappedStatement.getConfiguration();long startTime = System.currentTimeMillis();try {return invocation.proceed();} finally {long endTime = System.currentTimeMillis();long sqlCost = endTime - startTime;BoundSql boundSql = statementHandler.getBoundSql();String sql = boundSql.getSql();Object parameterObject = boundSql.getParameterObject();MetaObject metaObjectParam = configuration.newMetaObject(parameterObject);String formattedSql = formatSql(sql, boundSql, metaObjectParam);logger.info("\n========================\nSQL:\n{}\n执行耗时: [{} ms]\n========================", formattedSql, sqlCost);}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}private String formatSql(String sql, BoundSql boundSql, MetaObject metaObject) {if (sql == null || sql.trim().isEmpty()) {return "";}try {List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();if (parameterMappings != null && !parameterMappings.isEmpty()) {for (ParameterMapping parameterMapping : parameterMappings) {String propertyName = parameterMapping.getProperty();Object value;if (metaObject.hasGetter(propertyName)) {value = metaObject.getValue(propertyName);} else if (boundSql.hasAdditionalParameter(propertyName)) {value = boundSql.getAdditionalParameter(propertyName);} else {value = "?";}sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(value)));}}String formattedSql = SqlFormatter.of(Dialect.MySql).format(sql);return formattedSql;} catch (Exception e) {logger.error("Error formatting SQL: ", e);return sql;}}private String getParameterValue(Object obj) {if (obj == null) {return "null";}if (obj instanceof String) {return "'" + obj + "'";}if (obj instanceof Number) {return obj.toString();}if (obj instanceof java.util.Date || obj instanceof java.sql.Date || obj instanceof java.sql.Timestamp) {return "'" + obj.toString() + "'";}return "'" + obj.toString() + "'";}
}
4.MybatisPLusAutoConfiguration.java 自动配置类,根据条件注入SQL优化器
package com.sunxiansheng.mybatis.plus.config;import com.sunxiansheng.mybatis.plus.inteceptor.SqlBeautyInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPLusAutoConfiguration {@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = "sql.beauty", value = "enabled", havingValue = "true")public SqlBeautyInterceptor sqlBeautyInterceptor() {return new SqlBeautyInterceptor();}
}
5.spring.factories 指定自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sunxiansheng.mybatis.plus.config.MybatisPLusAutoConfiguration
2.common-mybatis-plus-starter-demo
1.application.yml 开启sql优化器
sql:beauty:enabled: true

2.测试
