Mybatis中處理特殊SQL處理邏輯解析
0、前言
在MyBatis中可能會有一些特殊的SQL需要去執(zhí)行,一般就是模糊查詢、批量刪除、動態(tài)設(shè)置表名、添加功能獲取自增的主鍵這幾種,現(xiàn)在分別來進(jìn)行說明。
為了方便演示 ,定義了訪問的接口
public interface SQLMapper { /** * 根據(jù)用戶名模糊查詢用戶信息 */ List<User> getUserByLike(@Param("username") String username); /** * 批量刪除 */ int deleteMore(String ids); /** * 查詢指定表中的數(shù)據(jù) */ List<User> getUserByTableName(String tableName); /** * 添加用戶 */ void insetUser(User user); }
1、模糊查詢
模糊查詢非常的有用,對于一些訪問量不是很大的搜索都是直接使用模糊查詢的方式來做的。
SQLMapper類:
public interface SQLMapper { /** * 根據(jù)用戶名模糊查詢用戶信息 */ List<User> getUserByLike(@Param("username") String username); }
對于SQLXml的編寫;
<!-- List<User> getUserByLike(@Param("username") String username);--> <!-- 使用#{},因為包括在單引號里,會被認(rèn)為是字符串的一部分:select * from t_user where username like '%#{username}%'--> <!-- 三種方式--> <select id="getUserByLike" resultType="User"> <!-- 第一種 select * from t_user where username like '%${username}%' 第二種 select * from t_user where username like concat('%', #{username}, '%')--> <!--第三種 推薦使用--> select * from t_user where username like "%"#{username}"%" </select>
需要注意的是Mybatis
對JDBC
進(jìn)行了進(jìn)一步封裝,使得我們可以更加便捷的使用Java操作數(shù)據(jù)庫。Mybatis獲取參數(shù)值有兩種方式:#{}
和${}
在大部分情況下,#{}
和${}
都能相互替代,使用兩者之一即可,更加推薦使用#{}
,因為可以防止SQL
注入問題,但是由于#{}
和${}
本質(zhì)上的不同,部分SQL
語句使用#{}
和${}
需要格外注意
#{}
和${}
本質(zhì)區(qū)別
#{}
本質(zhì)上是占位符賦值,為字符串類型或日期類型的字段進(jìn)行賦值時,可以自動添加單引號${}
本質(zhì)上是字符串拼接,為字符串類型或日期類型的字段進(jìn)行賦值時,需要手動加單引號
這個場景下,使用#{}
和${}
都能達(dá)到目的,但是用法稍有不同
如果是直接使用
<select id="selectLike" resultType="pojo.User"> select * from user where user_name like '%#{username}%' </select>
這種方式,?
被作為是字符串來處理了。
將#{}
換成${}
<select id="selectLike" resultType="pojo.User"> select * from user where user_name like '%${username}%' </select>
成功執(zhí)行
如果非要使用#{},也不是沒有解決辦法
使用""
拼接
<select id="selectLike" resultType="pojo.User"> select * from user where user_name like "%"#{username}"%" </select>
執(zhí)行結(jié)果
或者是使用concat()
函數(shù)來拼接
<select id="selectLike" resultType="pojo.User"> select * from user where user_name like concat('%',#{likeString},'%') </select>
結(jié)果是;
2、動態(tài)表名
在某些場景下,我們需要來回操作各種表,但SQL
語句功能一致,這時我們可以使用動態(tài)表名,即傳參為表名類型,這時就要從#{}
和${}
中進(jìn)行選擇了
Mapper接口
List<User> selectAllFromTable(@Param("tableName") String tableName);
如果是直接使用#{}
的方式
<select id="selectAllFromTable" resultType="pojo.User"> select * from #{tableName} </select>
結(jié)果報錯,原因在于#{}
為占位符賦值,傳參為String
的話就會自動補(bǔ)上單引號''
,而表名不允許添加單引號,所以導(dǎo)致出錯。
直接使用${}
的方式
<select id="selectAllFromTable" resultType="pojo.User"> select * from ${tableName} </select>
結(jié)果成功了,所以在動態(tài)表名的情況下,我們只能使用${}
3、獲取自增的組件
需要在xml中配置 useGeneratedKeys
, keyProperty
兩個屬性的值.
<!-- void insetUser(User user);--> <!-- 方法的返回值是固定的 useGeneratedKeys 設(shè)置當(dāng)前標(biāo)簽中的sql使用了自增的主鍵 (id) keyProperty 將自增的主鍵的值 賦值給 傳輸?shù)接成湮募械膮?shù)的某個屬性(user.id) --> <insert id="insetUser" useGeneratedKeys="true" keyProperty="id"> insert into t_user values(null, #{username}, #{password},#{age},#{gender},#{email}) </insert>
4、批量刪除
有些場景,需要我們根據(jù)id數(shù)組批量刪除記錄,這個時候也有一些坑
由于id
數(shù)組的長度是不確定的,所以我們不能確定參數(shù)的個數(shù),但是我們可以使用in
關(guān)鍵字,這個時候我們將id數(shù)組轉(zhuǎn)為字符串進(jìn)行傳參就好了。[1,2,3] => 1,2,3
Mapper接口
Integer deleteByIds(String Ids);
使用#{}
<delete id="deleteByIds"> delete from user where id in (#{ids}) </delete>
結(jié)果報錯,原因在于in后面的小括號里面的'1,2,3'
為字符串類型且為一個整體,與整數(shù)類型不符,因此不能使用#{}
使用${}
<delete id="deleteByIds"> delete from user where id in (${ids}) </delete>
結(jié)果成功了,看來有些場景不得不使用${}
到此這篇關(guān)于Mybatis中處理特殊SQL處理邏輯的文章就介紹到這了,更多相關(guān)Mybatis特殊SQL處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sql Server中Substring函數(shù)的用法實例解析
在sqlserver中substring函數(shù)是用來處理字符串的,常用于字符串截取了,下面我來給大家介紹下Sql Server中Substring函數(shù)的用法實例解析,需要的朋友參考下吧2016-12-12SQL Server的Descending Indexes降序索引實例展示
在涉及多字段排序的復(fù)雜查詢中,合理使用降序索引可以顯著提升SQLServer的查詢效率,本文通過構(gòu)建實際的查詢案例,展示了如何在SQLServer中建立并利用降序索引優(yōu)化查詢性能,感興趣的朋友一起看看吧2024-09-09SQLServer2008R2版安裝和測試的實現(xiàn)
本文主要介紹了在Windows10上安裝和配置SQL?Server?2008R2,內(nèi)容涵蓋了安裝過程中的注意事項,如安裝.NET?Framework?3.5、處理遠(yuǎn)程過程調(diào)用失敗等常見問題,感興趣的可以了解一下2024-12-12Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯誤詳解
這篇文章主要給大家介紹了關(guān)于Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯誤的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-09-09SQL Server 2000/2005/2008刪除或壓縮數(shù)據(jù)庫日志的方法
最近win2008 r2的服務(wù)器比較卡,打開服務(wù)器顯示也特別慢,sqlserver業(yè)務(wù)費(fèi)正常執(zhí)行,服務(wù)器桌面操作也比較卡,經(jīng)過多方研究發(fā)現(xiàn)原來是sqlserver日志文件已經(jīng)達(dá)到了84G導(dǎo)致,這里就為大家分享一下解決方法,需要的朋友可以參考一下2019-09-09ACCESS數(shù)據(jù)庫的壓縮,備份,還原,下載,刪除的實現(xiàn)
ACCESS數(shù)據(jù)庫的壓縮,備份,還原,下載,刪除的實現(xiàn)...2006-08-08SQL中遇到多條相同內(nèi)容只取一條的最簡單實現(xiàn)方法
本文主要介紹SQL中遇到多條相同內(nèi)容只取一條的最簡單實現(xiàn)方法,比較實用,希望能給大家做一個參考。2016-06-06