文章目录
一、操作步骤
1.打开idea搜索mybatis SimpleExecutor类
org.apache.ibatis.executor.SimpleExecutor
2.找到类中doQuery方法,并打断点
3.发请求后,查看boundSql
boundSql就是mybatis给我们封装好的,往数据库发的完整的sql语句。
二、其他办法
在使用 MyBatis 框架时,有时候我们需要查看实际执行的 SQL 语句以便调试或者优化查询。以下是几种查看 MyBatis 执行的 SQL 语句的方法:
1.日志输出
最直接的方法是配置 MyBatis 使用一个日志框架,并启用日志记录级别为 DEBUG 或 TRACE,这样就可以看到所有的 SQL 语句以及参数。
配置 Log4j
如果你使用的是 Log4j,可以在 log4j.properties 或 log4j.xml 文件中配置如下内容:
log4j.rootLogger=DEBUG, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.logger.org.mybatis=DEBUG
如果你使用的是 SLF4J,则可以在 mybatis-config.xml 文件中指定日志实现为 SLF4J,并且在对应的 SLF4J 实现(如 logback.xml)中设置日志级别:
<!-- mybatis-config.xml -->
<settings>
<setting name="logImpl" value="SLF4J"/>
</settings>
然后在 logback.xml 中设置日志级别:
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
2.使用 MyBatis 插件
MyBatis 提供了一个插件机制,允许开发者编写自己的拦截器来拦截 MyBatis 的核心执行流程。你可以编写一个简单的插件来拦截 Executor 的 update 或 query 方法,并打印 SQL 语句。
这里有一个简单的插件示例:
public class PrintSqlPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Executor executor = (Executor) invocation.getTarget();
if (invocation.getMethod().getName().equals("update") || invocation.getMethod().getName().equals("query")) {
System.out.println("Executing SQL: " + ((BoundSql) invocation.getArgs()[2]).getSql());
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
然后在 mybatis-config.xml 中注册这个插件:
<plugins>
<plugin interceptor="com.example.PrintSqlPlugin">
</plugin>
</plugins>
3.使用数据库客户端
大多数数据库管理工具(如 DBeaver, SQL Workbench, MySQL Workbench 等)都有日志记录功能,可以记录执行的 SQL 语句。你可以在客户端工具中开启 SQL 执行日志。
4.使用 AOP(面向切面编程)
如果你的应用程序使用了 Spring AOP,那么也可以通过定义一个切面来拦截 DAO 层的方法调用,并打印 SQL 语句。
以上方法中,配置日志框架可能是最简便的方法,因为不需要修改任何代码,只需要配置即可生效。但是需要注意的是,在生产环境中应该关闭 SQL 打印,因为它会产生大量的日志输出,影响系统性能。