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

目录
相关文章
|
28天前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
26 1
|
1月前
|
Java
java中替换文件内容
java中替换文件内容
14 1
|
1月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
9 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
1月前
|
存储 Java 文件存储
如何用 Java 压缩 ZIP 文件?
【2月更文挑战第21天】
32 1
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
23 3
|
30天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
92 3
|
1月前
|
Java
使用java将字符串写入到指定的文件中
使用java将字符串写入到指定的文件中
11 0

热门文章

最新文章