springboot單獨在指定地方輸出sql的方法
一般線上項目都是將日志進(jìn)行關(guān)閉,因為mybatis日志打印,時間長了,會占用大量的內(nèi)存,如果我想在我指定的地方進(jìn)行打印sql情況,怎么玩呢!
下面這個場景:
某天線上的項目出bug了,日志打印出來是更新成功的,但是數(shù)據(jù)庫的數(shù)據(jù)卻沒有更新,這時候我想給執(zhí)行這條sql打印出來,方便查看,但是一旦開啟mybatis的日志打印功能,就回去全局打印所有的日志,我只想在我想打印的地方打印sql,這時候怎么辦呢!見下面的列子:
我想在下面紅色箭頭處打印這句sql

這時候怎么做呢,咱們可以這樣,先將SqlSessionFactory對象注入進(jìn)來,
如下圖:
private final SqlSessionFactory sqlSessionFactory;
@Autowired
public LoginService(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
然后在需要打印的地方加上下面的代碼即可:
// 獲取執(zhí)行的SQL語句并打印
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
Configuration sqlSessionConfiguration = sqlSession.getConfiguration();
BoundSql boundSql = sqlSessionConfiguration
.getMappedStatement("com.green.testlocalhost.mapper.AdminUserMapper.selectOneByExample")
.getSqlSource()
.getBoundSql(userExample);
String sql = StringUtils.getExecSql(sqlSessionConfiguration, boundSql);
System.out.println("本次執(zhí)行的sql語句::" + sql);
}
注意:com.green.testlocalhost.mapper.AdminUserMapper.selectOneByExample 這個是StatementId,也就是你主動調(diào)用db框架的那個類或者接口的包路徑(com.green.testlocalhost.mapper.AdminUserMapper),然后在路徑后面拼接調(diào)用的方法(selectOneByExample )即可
用到的工具方法如下:
/**
* 獲取執(zhí)行的sql語句
* @param configuration
* @param boundSql
* @return
*/
public static String getExecSql(Configuration configuration, BoundSql boundSql) {
try {
Object parameterObject = boundSql.getParameterObject();
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
if (!parameterMappings.isEmpty() && parameterObject != null) {
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
} else {
MetaObject metaObject = configuration.newMetaObject(parameterObject);
for (ParameterMapping parameterMapping : parameterMappings) {
String propertyName = parameterMapping.getProperty();
Object obj;
if (metaObject.hasGetter(propertyName)) {
obj = metaObject.getValue(propertyName);
sql = sql.replaceFirst("\\?", getParameterValue(obj));
} else if (boundSql.hasAdditionalParameter(propertyName)) {
obj = boundSql.getAdditionalParameter(propertyName);
sql = sql.replaceFirst("\\?", getParameterValue(obj));
}
}
}
}
return sql;
} catch (Exception var11) {
return "";
}
}
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static String getParameterValue(Object obj) {
String value;
if (obj instanceof String) {
value = "'" + obj + "'";
} else if (obj instanceof Date) {
value = "'" + SIMPLE_DATE_FORMAT.format(obj) + "'";
} else if (obj != null) {
value = obj.toString();
} else {
value = "";
}
return value;
}這樣就可以在你指定的代碼地方打印sql而不是全局打印sql了
以上就是springboot單獨在指定地方輸出sql的方法的詳細(xì)內(nèi)容,更多關(guān)于springboot輸出sql的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Druid基本配置及內(nèi)置監(jiān)控使用_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Druid基本配置及內(nèi)置監(jiān)控使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
在Ubuntu上部署SpringBoot應(yīng)用的操作步驟
隨著云計算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺之一,Java 作為一種跨平臺的編程語言,具有廣泛的應(yīng)用場景,本文將詳細(xì)介紹如何在 Ubuntu 服務(wù)器上部署 Java 應(yīng)用,需要的朋友可以參考下2025-01-01
maven關(guān)于pom文件中的relativePath標(biāo)簽使用
在Maven項目中,子工程通過<relativePath>標(biāo)簽指定父工程的pom.xml位置,以確保正確繼承父工程的配置,這個標(biāo)簽可以配置為默認(rèn)值、空值或自定義值,默認(rèn)情況下,Maven會向上一級目錄尋找父pom;若配置為空值2024-09-09
Java SpringBoot將Word文檔轉(zhuǎn)為PDF的全流程解析
在 Java 里,能把 Word 轉(zhuǎn) PDF 的工具還真不少,本文主要來和大家聊聊Java如何整合SpringBoot實現(xiàn)將Word文檔轉(zhuǎn)為PDF的全流程,有需要的可以了解下2025-05-05
Java實現(xiàn)PDF轉(zhuǎn)為Word文檔的示例代碼
眾所周知,PDF文檔除了具有較強(qiáng)穩(wěn)定性和兼容性外,?還具有較強(qiáng)的安全性,在工作中可以有效避免別人無意中對文檔內(nèi)容進(jìn)行修改。本文將分為以下兩部分介紹如何在保持布局的情況下將PDF轉(zhuǎn)為Word文檔,希望對大家有所幫助2023-01-01
Springboot 2.6集成redis maven報錯的坑記錄
這篇文章主要介紹了Springboot 2.6集成redis maven報錯的坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
基于序列化存取實現(xiàn)java對象深度克隆的方法詳解
本篇文章是對序列化存取實現(xiàn)java對象深度克隆的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

