【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打印。

目录
相关文章
|
10天前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
5天前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之dal层中的mapper数据源类型进行组织的问题如何解决
Java应用结构规范问题之dal层中的mapper数据源类型进行组织的问题如何解决
|
5天前
|
JavaScript Java C#
Java中var的使用方法
这篇文章主要介绍了Java中自JDK10起引入的新特性`var`,这是一种局部变量类型推断功能,旨在简化代码书写并提升开发效率。通过示例展示了如何使用`var`定义不同类型的变量,包括基本数据类型及集合类。作者还特别强调了在使用`var`时的一些限制与注意事项,比如无法定义未初始化的变量、不适用于类成员变量以及不可作为方法参数等。最后,文章指出虽然`var`能带来便利,但也可能影响代码的可读性,建议开发者根据实际情况合理使用。
|
2月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
44 3
|
2月前
|
算法 Java API
多线程线程池问题之synchronized关键字在Java中的使用方法和底层实现,如何解决
多线程线程池问题之synchronized关键字在Java中的使用方法和底层实现,如何解决
|
20天前
|
SQL 数据库
SQL Server 附加数据库,报只读文件,无权修改其中某些文件
SQL Server 附加数据库,报只读文件,无权修改其中某些文件
24 0
|
2月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
2月前
|
SQL
云架构数据倾斜问题之在SQL数据源读取查询时合并小文件如何解决
云架构数据倾斜问题之在SQL数据源读取查询时合并小文件如何解决
|
2月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
40 0
|
2月前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
85 0

热门文章

最新文章

下一篇
云函数