Mybatis中處理特殊SQL處理邏輯解析
在MyBatis中可能會有一些特殊的SQL需要去執(zhí)行,一般就是模糊查詢、批量刪除、動態(tài)設(shè)置表名、添加功能獲取自增的主鍵這幾種,現(xià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);--><!-- 使用#{},因為包括在單引號里,會被認為是字符串的一部分:select * from t_user where username like '%#{username}%'--><!-- 三種方式--> <select 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進行了進一步封裝,使得我們可以更加便捷的使用Java操作數(shù)據(jù)庫。Mybatis獲取參數(shù)值有兩種方式:#{}和${}
在大部分情況下,#{}和${}都能相互替代,使用兩者之一即可,更加推薦使用#{},因為可以防止SQL注入問題,但是由于#{}和${}本質(zhì)上的不同,部分SQL語句使用#{}和${}需要格外注意
#{}和${}本質(zhì)區(qū)別
#{}本質(zhì)上是占位符賦值,為字符串類型或日期類型的字段進行賦值時,可以自動添加單引號${}本質(zhì)上是字符串拼接,為字符串類型或日期類型的字段進行賦值時,需要手動加單引號這個場景下,使用#{}和${}都能達到目的,但是用法稍有不同如果是直接使用
<select resultType='pojo.User'>select * from user where user_name like '%#{username}%'</select>這種方式,?被作為是字符串來處理了。
將#{}換成${}
<select resultType='pojo.User'> select * from user where user_name like '%${username}%'</select>成功執(zhí)行如果非要使用#{},也不是沒有解決辦法使用""拼接
<select resultType='pojo.User'> select * from user where user_name like '%'#{username}'%'</select>執(zhí)行結(jié)果
或者是使用concat()函數(shù)來拼接
<select resultType='pojo.User'> select * from user where user_name like concat('%',#{likeString},'%')</select>結(jié)果是;
在某些場景下,我們需要來回操作各種表,但SQL語句功能一致,這時我們可以使用動態(tài)表名,即傳參為表名類型,這時就要從#{}和${}中進行選擇了Mapper接口
List<User> selectAllFromTable(@Param('tableName') String tableName);如果是直接使用#{}的方式
<select resultType='pojo.User'> select * from #{tableName}</select>結(jié)果報錯,原因在于#{}為占位符賦值,傳參為String的話就會自動補上單引號'',而表名不允許添加單引號,所以導致出錯。
直接使用${}的方式
<select resultType='pojo.User'> select * from ${tableName}</select>結(jié)果成功了,所以在動態(tài)表名的情況下,我們只能使用${}
需要在xml中配置 useGeneratedKeys , keyProperty 兩個屬性的值.
<!-- void insetUser(User user);--><!-- 方法的返回值是固定的useGeneratedKeys 設(shè)置當前標簽中的sql使用了自增的主鍵 (id)keyProperty 將自增的主鍵的值 賦值給 傳輸?shù)接成湮募械膮?shù)的某個屬性(user.id)--> <insert 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)為字符串進行傳參就好了。[1,2,3] => 1,2,3Mapper接口
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)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
