【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")@AutowiredSqlSessionFactory sqlSessionFactory;@Overridepublic 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 {@AutowiredSqlSessionFactory sqlSessionFactory; }3. 測試結果
測試的mapper對象:
<select id="getDevidViewStr" resultType="java.lang.String">SELECTGROUP_CONCAT( devid ) AS devidFROMdevid_view<where><if test="viewId != null and viewId != ''">AND viewid = #{viewId}</if><if test="tableName != null and tableName != ''">AND tablename = #{tableName}</if></where>ORDER BYdevid</select>執行結果:
# 這是打印的結果 執行的SQL為:SELECTGROUP_CONCAT( devid ) AS devidFROMdevid_viewWHERE viewid = ?AND tablename = ? ORDER BYdevid 執行的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调试】通过SqlSessionFactory类对象获取mapper文件内的动态SQL在执行时的完整SQL及参数(2种使用方法+测试Demo及结果)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java开发问题】对象封装+固定排序+
- 下一篇: 【Java报错】多数据源mapper异常