用MyBatis拦截器记录SQL执行时间

本文介绍了如何在Java项目中使用MyBatis拦截器来记录SQL语句的执行时间。通过在applicationContext-dao.xml配置sqlStatementInterceptor,编写拦截器实现代码,并调整logback.xml的日志级别,可以在启动项目后从日志文件查看到详细的SQL执行时间信息。

1、在项目的applicationContext-dao.xml 文件中增加一个plugins:sqlStatementInterceptor

<bean id="dao-sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations">
            <list>
                <value>classpath:com/test/mapper/*.xml</value>
                <value>classpath:com/test/mapper/extend/*.xml</value>
            </list>
        
MyBatis 中,可以通过实现 `Interceptor` 接口并结合 `Invocation` 来记录 SQL执行时间。这种方式允许在 SQL 执行前后插入自定义逻辑,从而统计 SQL 执行耗时[^2]。 以下是一个实现记录 SQL 执行时间拦截器示例: ```java @Intercepts({ @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}) }) public class MybatisSQLExecutionInterceptor implements Interceptor { private final Logger log = LoggerFactory.getLogger(getClass()); @Override public Object intercept(Invocation invocation) throws Throwable { Long startTime = System.currentTimeMillis(); try { return invocation.proceed(); } finally { Long endTime = System.currentTimeMillis(); Long time = endTime - startTime; log.debug("SQL执行耗时:{}ms", time); } } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // 可选的配置设置 } } ``` 在上述代码中,`@Intercepts` 注解用于指定拦截的目标类和方法,这里拦截的是 `Executor` 的 `query` 和 `update` 方法。通过调用 `invocation.proceed()` 执行 SQL,并在执行前后记录时间,从而计算 SQL执行耗时。 可以通过日志框架(如 SLF4J)将 SQL 执行时间SQL 语句输出到控制台或日志文件中,以方便进行性能监控和优化。 ### 拦截器的注册与配置 在 MyBatis 的配置文件中,需要将拦截器注册为插件。例如,在 `mybatis-config.xml` 中添加如下配置: ```xml <plugins> <plugin interceptor="com.example.interceptor.MybatisSQLExecutionInterceptor"> <!-- 可以添加拦截器的属性配置 --> </plugin> </plugins> ``` 这样,拦截器就可以在 SQL 执行时被调用,并记录 SQL执行时间。 ### 获取 SQL 语句 如果还需要打印 SQL 语句本身,可以在拦截器中获取 `StatementHandler` 和 `BoundSql`,从而获取完整的 SQL 语句和参数信息。例如: ```java StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); BoundSql boundSql = statementHandler.getBoundSql(); String sql = boundSql.getSql(); // 获取实际执行SQL 语句 ``` 通过结合 SQL 语句和执行时间,可以更全面地了解 SQL执行情况[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值