Mybatis-plus如何在xml中傳入自定義的SQL語句
項(xiàng)目場(chǎng)景
項(xiàng)目需求需要在一個(gè)框架上二開,原框架有權(quán)限校驗(yàn)會(huì)返回對(duì)應(yīng)的權(quán)限sql語句。
例如:
在獲取用戶當(dāng)前組織及下級(jí)組織后拼接生成的SQL:
AND (
settlement_company_id IN (
'06eb1b4ce4d24e368319188bb4fc6390',
'9ff034739e984f188612c671219ddfed',
'afe69288c0b84828bd2abcb1c5eec28a'
)
)因?yàn)橛惺褂玫疥P(guān)聯(lián)查詢,無法直接使用QueryWrapper的apply來拼接語句,只能在xml中拼接。
問題描述
查詢傳入實(shí)體:
@Data
public class YygkBankAccountQueryForm {
/**
* 數(shù)據(jù)權(quán)限Sql
*/
@ApiModelProperty(value = "數(shù)據(jù)權(quán)限Sql")
private String extraSql;
}Mapper類:
public interface YygkBankAccountMapper extends BaseMapper<YygkBankAccountEntity> {
/**
* 分頁查詢銀行賬戶
*
* @param iPage 分頁數(shù)據(jù)
* @param yygkBankInfoQueryForm 查詢參數(shù)
* @return IPage<YygkBankAccountEntity>
*/
IPage<YygkBankAccountEntity> queryPage(IPage<YygkBankAccountEntity> iPage, @Param("query") YygkBankAccountQueryForm yygkBankInfoQueryForm);
}XML的查詢SQL語句:
<select id="queryPage" resultMap="BaseMap">
SELECT
<include refid="YygkBankAccountSql"/>
FROM yygk_bank_account ba
LEFT JOIN yygk_currency_info ci ON ba.currency_id = ci.id
<where>
ba.delete_mark != 1
<if test="query.extraSql != null and query.extraSql != ''">
AND #{query.extraSql}
</if>
</where>
ORDER BY ba.sort DESC
</select>query.extraSql為我需要拼接的SQL語句。
執(zhí)行查詢的打印日志:
2022-06-17 18:59:55.981 DEBUG 16768 --- [io-30601-exec-1] c.g.y.m.Y.queryPage_mpCount : ==> Preparing: SELECT COUNT(1) FROM yygk_bank_account ba WHERE ba.delete_mark != 1 AND ?
2022-06-17 18:59:56.088 DEBUG 16768 --- [io-30601-exec-1] c.g.y.m.Y.queryPage_mpCount : ==> Parameters: (settlement_company_id in( '06eb1b4ce4d24e368319188bb4fc6390','9ff034739e984f188612c671219ddfed','afe69288c0b84828bd2abcb1c5eec28a' ) )(String)
2022-06-17 18:59:56.174 DEBUG 16768 --- [io-30601-exec-1] c.g.y.m.Y.queryPage_mpCount : <== Total: 1
可以看到在執(zhí)行了mybatis-plus的count查詢后并沒有再執(zhí)行查詢數(shù)據(jù)
原因分析
懷疑是要用SQL注入才能拼接SQL語句
解決方案
xml的SQL語句改為使用SQL注入:
<select id="queryPage" resultMap="BaseMap">
SELECT
<include refid="YygkBankAccountSql"/>
FROM yygk_bank_account ba
LEFT JOIN yygk_currency_info ci ON ba.currency_id = ci.id
<where>
ba.delete_mark != 1
<if test="query.extraSql != null and query.extraSql != ''">
AND ${query.extraSql}
</if>
</where>
ORDER BY ba.sort DESC
</select>將#{}替換成${}
2022-06-17 19:21:05.437 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.Y.queryPage_mpCount : ==> Preparing: SELECT COUNT(1) FROM yygk_bank_account ba WHERE ba.delete_mark != 1 AND (settlement_company_id IN ('06eb1b4ce4d24e368319188bb4fc6390', '9ff034739e984f188612c671219ddfed', 'afe69288c0b84828bd2abcb1c5eec28a'))
2022-06-17 19:21:05.523 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.Y.queryPage_mpCount : ==> Parameters:
2022-06-17 19:21:05.598 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.Y.queryPage_mpCount : <== Total: 1
2022-06-17 19:21:05.630 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.YygkBankAccountMapper.queryPage : ==> Preparing: SELECT ci.currency_code as currency_code, ba.id, ba.bank_id, ba.bank_name, ba.bank_short_name, ba.bank_english_name, ba.swift_code, ba.account_name, ba.sort, ba.account_number, ba.receipts_payment_type, ba.internal_account, ba.settlement_type, ba.account_type, ba.deposit_type, ba.settlement_company_id, ba.settlement_company_name, ba.default_mark, ba.currency_id, ba.currency_code, ba.account_identification, ba.opening_bank_identification, ba.billing_account, ba.remark, ba.creator_time, ba.creator_user_id, ba.creator_user, ba.last_modify_time, ba.last_modify_user_id, ba.last_modify_user, ba.enable_mark, ba.delete_time, ba.delete_user_id, ba.delete_mark FROM yygk_bank_account ba LEFT JOIN yygk_currency_info ci ON ba.currency_id = ci.id WHERE ba.delete_mark != 1 AND (settlement_company_id in( '06eb1b4ce4d24e368319188bb4fc6390','9ff034739e984f188612c671219ddfed','afe69288c0b84828bd2abcb1c5eec28a' ) ) ORDER BY ba.sort DESC LIMIT ?
2022-06-17 19:21:05.635 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.YygkBankAccountMapper.queryPage : ==> Parameters: 20(Long)
2022-06-17 19:21:05.651 DEBUG 9008 --- [io-30601-exec-2] c.g.y.m.YygkBankAccountMapper.queryPage : <== Total: 2
可以看到在執(zhí)行了mybatis-plus的count查詢后,繼續(xù)執(zhí)行了查詢數(shù)據(jù)語句。
雖然問題解決,但我還是不理解為何將#{}換成${}就能成功。。。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 單元測(cè)試報(bào)錯(cuò):Class not found:xxxx springb
這篇文章主要介紹了IDEA 單元測(cè)試報(bào)錯(cuò):Class not found:xxxx springboot的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java結(jié)構(gòu)型設(shè)計(jì)模式之組合模式詳解
組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問具有一致性。本文將通過示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下2022-09-09
使用springboot實(shí)現(xiàn)上傳文件時(shí)校驗(yàn)文件是否有病毒
在SpringBoot中實(shí)現(xiàn)文件上傳時(shí)的病毒校驗(yàn),可以使用ClamAV、Metascan或VirusTotal等工具,這些工具通過掃描上傳的文件,可以有效地檢測(cè)和阻止惡意軟件的傳播,安裝和配置ClamAV服務(wù)的步驟如下:下載并安裝ClamAV二進(jìn)制文件,配置clamd.conf文件2025-01-01
java中PreparedStatement和Statement詳細(xì)講解
這篇文章主要介紹了java中PreparedStatement和Statement詳細(xì)講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
深入分析java并發(fā)編程中volatile的實(shí)現(xiàn)原理
這篇文章主要介紹了深入分析java并發(fā)編程中Volatile的實(shí)現(xiàn)原理,涉及Volatile的官方定義,實(shí)現(xiàn)原理,使用優(yōu)化等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
SpringBoot如何讀取xml配置bean(@ImportResource)
這篇文章主要介紹了SpringBoot如何讀取xml配置bean(@ImportResource),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
使用Spring實(shí)現(xiàn)@Value注入靜態(tài)字段
這篇文章主要介紹了使用Spring實(shí)現(xiàn)@Value注入靜態(tài)字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java本機(jī)內(nèi)存分配Native?memory?allocation?mmap失敗問題解決
這篇文章主要介紹了java本機(jī)內(nèi)存分配Native?memory?allocation?mmap失敗問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

