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);-->
<!-- 使用#{},因?yàn)榘ㄔ趩我柪?,會被認(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ù)值有兩種方式:#{}和${}
在大部分情況下,#{}和${}都能相互替代,使用兩者之一即可,更加推薦使用#{},因?yàn)榭梢苑乐?code>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)文章
sqlserver合并DataTable并排除重復(fù)數(shù)據(jù)的通用方法分享
網(wǎng)上合并DataTable通用方法的文章很多,結(jié)合項(xiàng)目開發(fā)中的常用需求,并借鑒網(wǎng)上的做法,寫了一個合并DataTable的通用方法,主要功能是合并兩個DataTable(結(jié)構(gòu)可以不同,如字段不完全一致),并可以根據(jù)某一列值進(jìn)行排重處理2011-12-12
SQL update select結(jié)合語句詳解及應(yīng)用
這篇文章主要介紹了SQL update select結(jié)合語句詳解及應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
sqlserver之datepart和datediff應(yīng)用查找當(dāng)天上午和下午的數(shù)據(jù)
這篇文章主要介紹了sqlserver之datepart和datediff應(yīng)用查找當(dāng)天上午和下午的數(shù)據(jù),非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié)
SQL Server2016 CTP2.2是微軟數(shù)據(jù)平臺歷史上邁出最大的一步,更快的事務(wù)處理和查詢、任何設(shè)備更深入的洞察力、更先進(jìn)的分析能力、全新安全技術(shù)和全新的混合云場景,本文給大家介紹SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié),需要的朋友可以參考下2015-09-09
SQL?Server2022數(shù)據(jù)庫安裝及配置過程
最近發(fā)現(xiàn)有諸多的小伙伴們對于sqlserver安裝教程2022,sql server安裝教程這個問題都頗為感興趣的,這篇文章主要給大家介紹了關(guān)于SQL?Server2022數(shù)據(jù)庫安裝及配置的相關(guān)資料,需要的朋友可以參考下2023-12-12
SQL Server 創(chuàng)建約束圖解(唯一 主鍵)
SQLServer中有五種約束,Primary Key約束、Foreign Key約束、Unique約束、Default約束和Check約束,今天使用SQL Server2008來演示下這幾種約束的創(chuàng)建和使用的方法2016-07-07
SQL Server數(shù)據(jù)庫入門學(xué)習(xí)總結(jié)
經(jīng)過一段時間的學(xué)習(xí),也對數(shù)據(jù)庫有了一些認(rèn)識,數(shù)據(jù)庫基本是由表,關(guān)系,操作組成;對于初學(xué)者首先要學(xué)的2012-08-08

