Mybatis中怎么将sql语句打印到控制台

本文介绍了一个用于MyBatis的SQL打印插件,该插件通过实现Interceptor接口并在Executor的update和query方法中拦截调用来输出执行的SQL语句。
import java.util.Properties;

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
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.apache.ibatis.session.RowBounds;
//insert update delete都算作Executor的update方法  select算是query方法,详见Mybatis文档
@Intercepts( {
        @Signature(type = Executor.class, method = "update", args = {
                MappedStatement.class, Object.class }),
        @Signature(type = Executor.class, method = "query", args = {
                MappedStatement.class, Object.class, RowBounds.class,
                ResultHandler.class }) })
public class PrintSqlPlugin implements Interceptor {

    public Object intercept(Invocation invocation) throws Throwable {
/*
     

*/

        Object[] args = invocation.getArgs();
        //MyBatis将SQL配置信息加载成为不同的MappedStatement对象并存储在内存中。
        MappedStatement stmt = (MappedStatement) args[0];
       //为方法传递过来的参数
        Object arg = null;
       /*
       判断第二个参数是不是空,及是否传递过来了
        IStudentMapper studentDao = session.getMapper(IStudentMapper.class);
        studentDao.insert(student);
      */
        if (args.length > 1) {
            arg = args[1];
        }
       /*
           
      */
        BoundSql boundSql = stmt.getBoundSql(arg);

        String sql = boundSql.getSql();
        //以下代码为格式化输出将回车和制表符换成
        sql = sql.replaceAll("\n", "");
        sql = sql.replaceAll("\t", "");
        System.out.println(sql);

        return invocation.proceed();
    }

    public Object plugin(Object obj) {
        return Plugin.wrap(obj, this);
    }

    public void setProperties(Properties properties) {

    }

}
//主配置文件中配置config.xml
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties resource="jdbc.properties"></properties>

    <typeAliases>
        <!--以下为实体类及其别名-->
        <typeAlias alias="student" type="com.oracle.wfc.model.Student" />
    </typeAliases>

    <plugins>
        <plugin interceptor="com.oracle.wfc.dao.PrintSqlPlugin"></plugin>
    </plugins>
        <!--以下数据库连接环境集,一个环境集中可以包含多个环境声明,每个环境都有自己的id,id可以任意指定,可以在环境集上用default声明哪个环境是默认的环境。
        -->
    <environments default="development">
        <environment id="development">
            <!--以下为使用JDBC管理事务,->
            <transactionManager type="JDBC" />
            <!--以下为配置dataSource POOLED表示使用连接池机制 ->
            <dataSource type="POOLED">
                     <!--以下为连接数据库的属性文件-->
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
        <environment>
               ......
        </environment>
    </environments>
    <!--以下为声明实体映射文件的位置->
    <mappers>
        <mapper resource="com/oracle/wfc/dao/mapper/IStudentMapper.xml" />
    </mappers>
</configuration>




                
MyBatis 中将生成的 SQL 语句输出到控制台,可以通过配置日志实现,也可以借助 IntelliJ IDEA 插件来增强开发调试体验。 ### 配置 MyBatis 内置日志输出 MyBatis 提供了内置的日志实现类 `StdOutImpl`,可以将 SQL 日志直接打印控制台。如果使用的是 Spring Boot 并整合了 MyBatis Plus,则可以在 `application.yml` 或 `application.properties` 文件中进行如下配置: #### application.yml 配置示例 ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 该配置启用了标准输出日志实现,使得所有通过 MyBatis 执行的 SQL 语句都会被记录并显示在控制台中[^1]。 ### 使用 IntelliJ IDEA 插件查看完整 SQLSQL 语句较长或结构复杂时,在控制台直接查看完整的 SQL 可以显著提升调试效率。IntelliJ IDEA 提供了一款名为 **MyBatis Log Plugin** 的插件,能够在控制台中展示完整的 SQL 语句,并支持复制和格式化功能。 #### 安装方式: 在 IntelliJ IDEA 中进入 `Settings > Plugins` 页面,搜索 `MyBatis Log Plugin` 并安装,重启 IDE 后生效。启动插件后,在控制台左下角会显示该插件的图标,表明插件已就绪[^2]。 #### 使用效果: 执行数据库操作时,MyBatis Log Plugin 会在其专用控制台中显示当前业务逻辑所执行的完整 SQL 语句,包括参数值替换后的最终语句,极大地方便了问题排查和调试工作。 ### 结合日志框架输出 SQL(如 Logback) 除了上述方法外,还可以通过集成日志框架(例如 Logback)来捕获更详细的 SQL 日志信息。 #### Logback 配置示例 在 `logback.xml` 文件中添加以下内容: ```xml <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 设置 MyBatis 相关包的日志级别为 DEBUG --> <logger name="com.ibatis" level="DEBUG"/> <root level="info"> <appender-ref ref="STDOUT" /> </root> </configuration> ``` 此配置将 `com.ibatis` 包下的日志级别设置为 `DEBUG`,从而确保 MyBatis 在执行过程中输出详细的 SQL 信息到控制台[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值