XML重復(fù)查詢一條Sql語句的解決方法
一、核心問題:從SQL重復(fù)執(zhí)行到日志失效
1. 首要現(xiàn)象:XML重復(fù)查詢失效在排查服務(wù)性能時發(fā)現(xiàn):
<!-- MyBatis XML片段 -->
<select id="List" resultMap="Map">
SELECT * FROM user WHERE name = #{name}
<!-- 參數(shù)name為null時重復(fù)執(zhí)行相同全表查詢 -->
</select>癥狀:
- 相同SQL反復(fù)執(zhí)行
2. 調(diào)試暴露第二問題:日志輸出異常為定位參數(shù)問題,在Controller添加日志:
log.info("請求參數(shù): {}", userListDto); // 打印輸入?yún)?shù)卻得到:
請求參數(shù): com.domain.dto.user.UserListDto@599f4346 // 對象內(nèi)存地址
后果:
- 無法識別空參數(shù)來源:日志無法展示實(shí)際傳入的
name值
二、根因剖析:DTO斷裂引發(fā)的級聯(lián)故障
關(guān)鍵斷層點(diǎn)分析:
DTO層面:
- 致命缺陷:缺少
@Data導(dǎo)致:toString()未生成 → 日志無法格式化輸出getter未生成 → Service層獲取name時隱含空指針風(fēng)險
- 致命缺陷:缺少
文檔缺失:字段無注釋導(dǎo)致維護(hù)成本增加
// UserListDto.java(問題版本)
public class UserListDto {
private String name; // 無業(yè)務(wù)注釋
private Integer pageNum; // 未標(biāo)識必填
}Controller層面(核心責(zé)任方):
- 未校驗(yàn)入?yún)?/strong>:直接傳遞DTO到Service
- 未處理日志:放任對象原始輸出
Service/DAO層面:
- 參數(shù)未過濾:XML直接使用
#{name}未判空 → 重復(fù)觸發(fā)全表掃描 - 無緩存機(jī)制:相同查詢反復(fù)訪問數(shù)據(jù)庫
- 參數(shù)未過濾:XML直接使用
三、解決方案:修復(fù)數(shù)據(jù)鏈路
1. DTO層修正(止血點(diǎn))
@Data // 核心修復(fù)!
生成toString/getter/setter
public class StickerListDto {
// 增加必要注釋 private String name;
// 貼紙名稱(可空) private Integer pageNum;
// 頁碼(必填)}2. Controller層加固(責(zé)任方修復(fù))
/**
* 獲取列表信息
*
* @param dto 請求參數(shù)封裝對象
* @return 貼紙列表信息
*/
public TableDataInfo<UserListVo> getUserList(UserListtDto dto) {
// 關(guān)鍵日志完善 → 打印完整且精準(zhǔn)的參數(shù)信息
log.info("請求獲取貼紙列表,參數(shù)為:Name = {}, PageNum = {}",
dto.getName(), dto.getPageNum() == null ? "null" : dto.getPageNum());
// 參數(shù)校驗(yàn)增強(qiáng) → 細(xì)化校驗(yàn)邏輯,全面檢查參數(shù)合法性
if (dto == null) {
throw new IllegalArgumentException("請求參數(shù)整體為空,無法進(jìn)行查詢");
}
if (dto.getPageNum() == null || dto.getPageNum() < 1) {
throw new IllegalArgumentException("頁碼參數(shù)異常,必須為大于等于1的正整數(shù)");
}
// 補(bǔ)充對其他關(guān)鍵參數(shù)的校驗(yàn)示例(按實(shí)際需求調(diào)整)
if (dto.getName() != null && dto.getName().length() > 50) {
throw new IllegalArgumentException("名稱參數(shù)過長,長度不得超過50字符");
}
// 正常業(yè)務(wù)邏輯調(diào)用 → 參數(shù)已校驗(yàn),可安全傳遞給服務(wù)層處理
return productStickerService.getStickerList(dto);
}四、核心經(jīng)驗(yàn):Controller層的數(shù)據(jù)責(zé)任
DTO是Controller的盔甲:
- 缺失
@Data≈ 解除防御 → 導(dǎo)致日志失效+參數(shù)穿透 - 無字段注釋 ≈ 丟失地圖 → 增加協(xié)作成本
- 缺失
日志是指紋采集器:
- 打印對象地址 → 相當(dāng)于案發(fā)現(xiàn)場無痕跡 → 完全喪失調(diào)試能力
- 定制化日志格式(如
name={})→ 直接鎖定問題參數(shù)
空參數(shù)是系統(tǒng)毒藥:
- 未在Controller攔截 → 毒藥流入Service層
- DAO層無防御 → 數(shù)據(jù)庫成為最終受害者
教訓(xùn)總結(jié):
UserListDto缺失@Data導(dǎo)致:
- 調(diào)試黑洞:日志輸出無意義地址符
- 安全缺口:空值穿透至DAO層
- 性能災(zāi)難:XML重復(fù)全表查詢
修復(fù)本質(zhì):在Controller層建立數(shù)據(jù)安檢站(DTO規(guī)范+參數(shù)校驗(yàn))
到此這篇關(guān)于XML重復(fù)查詢一條Sql語句的解決方法的文章就介紹到這了,更多相關(guān)xml重復(fù)查詢sql語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis多表查詢的操作方法注解和XML實(shí)現(xiàn)SQL語句
- MybatisPlus使用Mybatis的XML的動態(tài)SQL的功能實(shí)現(xiàn)多表查詢
- SqlServer將查詢結(jié)果轉(zhuǎn)換為XML和JSON
- SQL 聯(lián)合查詢與XML解析實(shí)例詳解
- SqlServer參數(shù)化查詢之where in和like實(shí)現(xiàn)之xml和DataTable傳參介紹
- SQLServer XML查詢18句話入門教程
- SQLServer XML查詢快速入門(18句話)
- 使用SQL查詢DB2 9中的XML數(shù)據(jù)
相關(guān)文章
SQL Server中使用判斷語句(IF ELSE/CASE WHEN )案例
這篇文章主要介紹了SQL Server中使用判斷語句(IF ELSE/CASE WHEN )案例,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
sql?server修改數(shù)據(jù)庫文件位置的詳細(xì)步驟記錄
在SQL?Server中可以通過一系列的步驟來更改數(shù)據(jù)庫文件的存儲位置,這篇文章主要給大家介紹了關(guān)于sql?server修改數(shù)據(jù)庫文件位置的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
sqlserver數(shù)據(jù)庫規(guī)模膨脹太大怎么優(yōu)化
數(shù)據(jù)庫規(guī)模膨脹是SQLServer數(shù)據(jù)庫運(yùn)維中常見的問題之一,本文介紹了一些緩解膨脹問題的方法,包括增加內(nèi)存、數(shù)據(jù)壓縮、數(shù)據(jù)庫分區(qū)等,在實(shí)踐過程中,應(yīng)根據(jù)具體情況,采取適當(dāng)?shù)姆椒?以達(dá)到最優(yōu)的緩解膨脹問題的效果2024-02-02
SQL Server ltrim(rtrim()) 去不掉空格的原因分析
這篇文章主要介紹了SQL Server ltrim(rtrim()) 去不掉空格的原因分析,原因主要是因?yàn)橹虚g存在回車符或者換行符,所以要先將此符號替換掉,具體示例代碼大家參考下本文2017-08-08
基于SQL Server OS的任務(wù)調(diào)度機(jī)制詳解
本篇文章小編為大家介紹,基于SQL Server OS的任務(wù)調(diào)度機(jī)制詳解。需要的朋友參考下2013-04-04
實(shí)用的銀行轉(zhuǎn)賬存儲過程和流水號生成存儲過程
本篇文章給大家分享銀行轉(zhuǎn)賬存儲過程和流水號生成存儲過程,感興趣的朋友一起看看吧2015-09-09
mssqlserver恢復(fù)ldf文件數(shù)據(jù)的方法
本文介紹mssqlserver怎么恢復(fù)ldf文件數(shù)據(jù)庫,簡單的來說,MDF文件是SQL server用來存放數(shù)據(jù)的數(shù)據(jù)庫文件;LDF文件SQL server是日志文件,存放了對數(shù)據(jù)庫進(jìn)行的所有操作信息2013-11-11

