【Java调试】通过SqlSessionFactory类对象获取mapper文件内的动态SQL在执行时的完整SQL及参数(2种使用方法+测试Demo及结果)

简介: 【Java调试】通过SqlSessionFactory类对象获取mapper文件内的动态SQL在执行时的完整SQL及参数(2种使用方法+测试Demo及结果)

1. 问题

最近开发新功能,调试 mapper.xml 里的SQL,遇到了极其痛苦的事情:

  • 没有 p6spy SQL无法输出到工作台。
  • mapper 接口没有实现 MyBatis 的 BaseMapper 导致IDEA的插件 MyBatis Log Plugin 工作台不输出SQL。

总之就是不知道数据库执行了什么SQL。

2. 解决方法

【方法 1️⃣ 】初始化 SqlSessionFactory 对象,读取 mapper.xml 文件:

@Bean(name = "sqlSessionFactory")
  public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource)
      throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setMapperLocations(
      new PathMatchingResourcePatternResolver()
      .getResources("classpath:/mapper/**/*.xml")
      // 这个地方要根据mapper文件所在位置进行配置
      // 我的是在【resources/mapper/模块文件夹/】下
      );
    sessionFactory.setConfigLocation(new ClassPathResource("mybatisConfigPath"));
    // 这个configLocation属性 是去加载mybatis的config配置文件
    // 我的是【mybatis.config-location=mybatis.cfg.xml】
    return sessionFactory.getObject();
  }

使用:

public class DataServiceImpl extends BaseServiceImpl implements DataService {
    @Qualifier("sqlSessionFactory")
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    @Override
    public Object getTest(Map mapParam) {
    BoundSql boundSql =  
      sqlSessionFactory
      .getConfiguration()
      .getMappedStatement("id")
      .getBoundSql(mapParam);
    // id是mapper文件内SQL的id值, mapParam是传递给动态SQL的参数值 
        String sql = boundSql.getSql(); // 执行的SQL对象【不包含参数】
        Object parameterObject = boundSql.getParameterObject(); // 执行SQL的参数值
        System.out.println("执行的SQL为:" + sql);
        System.out.println("执行的SQL的参数为:" + parameterObject.toString());
    }

【方法 2️⃣ 】如果使用的是Mybatis框架,可以直接注入sqlSessionFactory对象:

@Component
public class ViewManager {
    @Autowired
    SqlSessionFactory sqlSessionFactory;
}

3. 测试结果

测试的mapper对象:

<select id="getDevidViewStr" resultType="java.lang.String">
        SELECT
        GROUP_CONCAT( devid ) AS devid
        FROM
        devid_view
        <where>
            <if test="viewId != null and viewId != ''">
                AND viewid = #{viewId}
            </if>
            <if test="tableName != null and tableName != ''">
                AND tablename = #{tableName}
            </if>
        </where>
        ORDER BY
        devid
    </select>

执行结果:

# 这是打印的结果
执行的SQL为:SELECT
        GROUP_CONCAT( devid ) AS devid
        FROM
        devid_view
         WHERE  viewid = ?
                AND tablename = ? 
        ORDER BY
        devid
执行的SQL的参数为:{tableName=GSMDATA, viewId=6e4a638f0b1b45d980e6f5c4c16e414a}
# 这个是 p6spy 输出的结果
Execute SQL:SELECT GROUP_CONCAT( devid ) AS devid FROM devid_view WHERE viewid = '6e4a638f0b1b45d980e6f5c4c16e414a' AND tablename = 'GSMDATA' ORDER BY devid

至此,执行的mapper内的SQL被执行的同时SQL会被打印出来😏,当然,不提倡使用System.out.println()来打印,尽量使用log打印。

目录
相关文章
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
432 1
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
488 4
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
426 0
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
884 0
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
601 14
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
915 5
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
662 0
|
SQL Java 数据库连接
Java中实现SQL分页的方法
无论何种情况,选择适合自己的,理解了背后的工作原理,并能根据实际需求灵活变通的方式才是最重要的。
385 9
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
379 0
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现