Springboot mybatis 日志加入执行时间
网上又是各种残缺不全的内容。各种拼凑搜索,最终出来了一版。
原理略,只放代码,原理的内容搜索一大把。
Mybatis配置类:
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.annotation.PostConstruct; import javax.sql.DataSource; import com.github.pagehelper.PageInterceptor; import com.tongtech.backport.java.util.Arrays; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.boot.autoconfigure.MybatisProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import com.github.pagehelper.PageHelper; @Configuration @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class}) @EnableConfigurationProperties(MybatisProperties.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MybatisAutoConfiguration { private static final Logger LOGGER = LoggerFactory.getLogger(MybatisAutoConfiguration.class); @Autowired private MybatisProperties properties; @Autowired private ResourceLoader resourceLoader = new DefaultResourceLoader(); @PostConstruct public void checkConfigFileExists() { if (this.properties.isCheckConfigLocation()) { Resource resource = this.resourceLoader.getResource(this.properties.getConfigLocation()); Assert.state(resource.exists(), "Cannot find config location: " + resource + " (please add config file or check your Mybatis " + "configuration)"); } } @Bean(name = "sqlSessionFactory") @ConditionalOnMissingBean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); if (StringUtils.hasText(this.properties.getConfigLocation())) { bean.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation())); } else { // 加入sql语句拦截器 bean.setPlugins(new Interceptor[] {pageHelper(), new SqlStatementInterceptor()}); bean.setTypeAliasesPackage(this.properties.getTypeAliasesPackage()); bean.setTypeHandlersPackage(this.properties.getTypeHandlersPackage()); bean.setMapperLocations(resolveMapperLocations(this.properties.getMapperLocations())); } return bean.getObject(); } @Bean @ConditionalOnMissingBean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory, this.properties.getExecutorType()); } /** * 分页插件 * * @param * @return */ @Bean public PageInterceptor pageHelper() { LOGGER.info("注册MyBatis分页插件PageHelper"); PageInterceptor pageHelper = new PageInterceptor (); Properties p = new Properties(); p.setProperty("offsetAsPageNum", "true"); p.setProperty("rowBoundsWithCount", "true"); p.setProperty("reasonable", "true"); pageHelper.setProperties(p); return pageHelper; } public Resource[] resolveMapperLocations(String[] mapperLocations) { ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); List<Resource> resources = new ArrayList(); if (mapperLocations != null) { for (String mapperLocation : mapperLocations) { try { Resource[] mappers = resourceResolver.getResources(mapperLocation); resources.addAll(Arrays.asList(mappers)); } catch (IOException e) { // ignore } } } return resources.toArray(new Resource[resources.size()]); } }
拦截类:
import java.sql.Statement; import java.util.Properties; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.session.ResultHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; @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 })}) @Component @Configuration public class SqlStatementInterceptor implements Interceptor { private static final Logger LOGGER = LoggerFactory.getLogger(SqlStatementInterceptor.class); @Override public Object intercept(Invocation invocation){ // 开始时间 long start = System.currentTimeMillis(); invocation.getArgs(); try { return invocation.proceed(); } catch (Exception e) { LOGGER.error("执行失败!", e); return null; } finally { long end = System.currentTimeMillis(); long time = end - start; LOGGER.info("cost time {}ms", time); } } @Override public Object plugin(Object arg0) { return Plugin.wrap(arg0, this); } @Override public void setProperties(Properties arg0) { } }
application.properties文件里对应的配置:
mybatis.mapper-locations=classpath:mapper/**/*-Mapping.xml mybatis.executor-type=reuse
以上。