欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis中處理特殊SQL處理邏輯解析

 更新時(shí)間:2023年06月12日 09:14:54   作者:fckey  
這篇文章主要介紹了Mybatis中處理特殊SQL處理邏輯,在MyBatis中可能會(huì)有一些特殊的SQL需要去執(zhí)行,一般就是模糊查詢(xún)、批量刪除、動(dòng)態(tài)設(shè)置表名、添加功能獲取自增的主鍵這幾種,現(xiàn)在分別來(lái)進(jìn)行說(shuō)明,需要的朋友可以參考下

0、前言

在MyBatis中可能會(huì)有一些特殊的SQL需要去執(zhí)行,一般就是模糊查詢(xún)、批量刪除、動(dòng)態(tài)設(shè)置表名、添加功能獲取自增的主鍵這幾種,現(xiàn)在分別來(lái)進(jìn)行說(shuō)明。
為了方便演示 ,定義了訪(fǎng)問(wèn)的接口

public interface SQLMapper {
    /**
     * 根據(jù)用戶(hù)名模糊查詢(xún)用戶(hù)信息
     */
    List<User> getUserByLike(@Param("username") String username);
    /**
     * 批量刪除
     */
    int deleteMore(String ids);
    /**
     * 查詢(xún)指定表中的數(shù)據(jù)
     */
    List<User> getUserByTableName(String tableName);
    /**
     * 添加用戶(hù)
     */
    void insetUser(User user);
}

1、模糊查詢(xún)

模糊查詢(xún)非常的有用,對(duì)于一些訪(fǎng)問(wèn)量不是很大的搜索都是直接使用模糊查詢(xún)的方式來(lái)做的。
SQLMapper類(lèi):

public interface SQLMapper {
    /**
     * 根據(jù)用戶(hù)名模糊查詢(xún)用戶(hù)信息
     */
    List<User> getUserByLike(@Param("username") String username);
}

對(duì)于SQLXml的編寫(xiě);

<!--    List<User> getUserByLike(@Param("username") String username);-->
<!--    使用#{},因?yàn)榘ㄔ趩我?hào)里,會(huì)被認(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對(duì)JDBC進(jìn)行了進(jìn)一步封裝,使得我們可以更加便捷的使用Java操作數(shù)據(jù)庫(kù)。Mybatis獲取參數(shù)值有兩種方式:#{}${}

在大部分情況下,#{}${}都能相互替代,使用兩者之一即可,更加推薦使用#{},因?yàn)榭梢苑乐?code>SQL注入問(wèn)題,但是由于#{}${}本質(zhì)上的不同,部分SQL語(yǔ)句使用#{}${}需要格外注意

#{}${}本質(zhì)區(qū)別

  • #{}本質(zhì)上是占位符賦值,為字符串類(lèi)型或日期類(lèi)型的字段進(jìn)行賦值時(shí),可以自動(dòng)添加單引號(hào)
  • ${}本質(zhì)上是字符串拼接,為字符串類(lèi)型或日期類(lèi)型的字段進(jìn)行賦值時(shí),需要手動(dòng)加單引號(hào)

這個(gè)場(chǎng)景下,使用#{}${}都能達(dá)到目的,但是用法稍有不同
如果是直接使用

<select id="selectLike" resultType="pojo.User">
	select * from user where user_name like '%#{username}%'
</select>

這種方式,?被作為是字符串來(lái)處理了。

#{}換成${}

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like '%${username}%'
</select>

成功執(zhí)行
如果非要使用#{},也不是沒(méi)有解決辦法
使用""拼接

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like "%"#{username}"%"
</select>

執(zhí)行結(jié)果

或者是使用concat()函數(shù)來(lái)拼接

<select id="selectLike" resultType="pojo.User">
    select * from user where user_name like concat('%',#{likeString},'%')
</select>

結(jié)果是;

2、動(dòng)態(tài)表名

在某些場(chǎng)景下,我們需要來(lái)回操作各種表,但SQL語(yǔ)句功能一致,這時(shí)我們可以使用動(dòng)態(tài)表名,即傳參為表名類(lèi)型,這時(shí)就要從#{}${}中進(jìn)行選擇了
Mapper接口

List<User> selectAllFromTable(@Param("tableName") String tableName);

如果是直接使用#{}的方式

<select id="selectAllFromTable" resultType="pojo.User">
    select * from #{tableName}
</select>

結(jié)果報(bào)錯(cuò),原因在于#{}為占位符賦值,傳參為String的話(huà)就會(huì)自動(dòng)補(bǔ)上單引號(hào)'',而表名不允許添加單引號(hào),所以導(dǎo)致出錯(cuò)。

直接使用${}的方式

<select id="selectAllFromTable" resultType="pojo.User">
    select * from ${tableName}
</select>

結(jié)果成功了,所以在動(dòng)態(tài)表名的情況下,我們只能使用${}

3、獲取自增的組件

需要在xml中配置 useGeneratedKeys , keyProperty 兩個(gè)屬性的值.

<!--    void insetUser(User user);-->
<!--    方法的返回值是固定的
        useGeneratedKeys    設(shè)置當(dāng)前標(biāo)簽中的sql使用了自增的主鍵 (id)
        keyProperty         將自增的主鍵的值 賦值給 傳輸?shù)接成湮募械膮?shù)的某個(gè)屬性(user.id)
-->
    <insert id="insetUser" useGeneratedKeys="true" keyProperty="id">
        insert into t_user values(null, #{username}, #{password},#{age},#{gender},#{email})
    </insert>

4、批量刪除

有些場(chǎng)景,需要我們根據(jù)id數(shù)組批量刪除記錄,這個(gè)時(shí)候也有一些坑
由于id數(shù)組的長(zhǎng)度是不確定的,所以我們不能確定參數(shù)的個(gè)數(shù),但是我們可以使用in關(guān)鍵字,這個(gè)時(shí)候我們將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é)果報(bào)錯(cuò),原因在于in后面的小括號(hào)里面的'1,2,3'為字符串類(lèi)型且為一個(gè)整體,與整數(shù)類(lèi)型不符,因此不能使用#{}

使用${}

<delete id="deleteByIds">
    delete from user where id in (${ids})
</delete>

結(jié)果成功了,看來(lái)有些場(chǎng)景不得不使用${}

到此這篇關(guān)于Mybatis中處理特殊SQL處理邏輯的文章就介紹到這了,更多相關(guān)Mybatis特殊SQL處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文搞懂SQL注入攻擊

    一文搞懂SQL注入攻擊

    SQL注入(SQL Injection)攻擊是其中最普遍的安全隱患之一,因此,如何防范SQL注入攻擊成為了網(wǎng)絡(luò)安全領(lǐng)域的一個(gè)重要議題。本文通過(guò)代碼示例詳細(xì)介紹了SQL注入攻擊,需要的朋友可以參考一下
    2023-04-04
  • Sql Server中Substring函數(shù)的用法實(shí)例解析

    Sql Server中Substring函數(shù)的用法實(shí)例解析

    在sqlserver中substring函數(shù)是用來(lái)處理字符串的,常用于字符串截取了,下面我來(lái)給大家介紹下Sql Server中Substring函數(shù)的用法實(shí)例解析,需要的朋友參考下吧
    2016-12-12
  • SQL Server的Descending Indexes降序索引實(shí)例展示

    SQL Server的Descending Indexes降序索引實(shí)例展示

    在涉及多字段排序的復(fù)雜查詢(xún)中,合理使用降序索引可以顯著提升SQLServer的查詢(xún)效率,本文通過(guò)構(gòu)建實(shí)際的查詢(xún)案例,展示了如何在SQLServer中建立并利用降序索引優(yōu)化查詢(xún)性能,感興趣的朋友一起看看吧
    2024-09-09
  • SQLServer2008R2版安裝和測(cè)試的實(shí)現(xiàn)

    SQLServer2008R2版安裝和測(cè)試的實(shí)現(xiàn)

    本文主要介紹了在Windows10上安裝和配置SQL?Server?2008R2,內(nèi)容涵蓋了安裝過(guò)程中的注意事項(xiàng),如安裝.NET?Framework?3.5、處理遠(yuǎn)程過(guò)程調(diào)用失敗等常見(jiàn)問(wèn)題,感興趣的可以了解一下
    2024-12-12
  • Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯(cuò)誤詳解

    Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯(cuò)誤詳解

    這篇文章主要給大家介紹了關(guān)于Sql server中內(nèi)部函數(shù)fn_PhysLocFormatter存在解析錯(cuò)誤的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-09-09
  • SQL Server 2000/2005/2008刪除或壓縮數(shù)據(jù)庫(kù)日志的方法

    SQL Server 2000/2005/2008刪除或壓縮數(shù)據(jù)庫(kù)日志的方法

    最近win2008 r2的服務(wù)器比較卡,打開(kāi)服務(wù)器顯示也特別慢,sqlserver業(yè)務(wù)費(fèi)正常執(zhí)行,服務(wù)器桌面操作也比較卡,經(jīng)過(guò)多方研究發(fā)現(xiàn)原來(lái)是sqlserver日志文件已經(jīng)達(dá)到了84G導(dǎo)致,這里就為大家分享一下解決方法,需要的朋友可以參考一下
    2019-09-09
  • ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)

    ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)

    ACCESS數(shù)據(jù)庫(kù)的壓縮,備份,還原,下載,刪除的實(shí)現(xiàn)...
    2006-08-08
  • SQL?Server中使用表變量和臨時(shí)表

    SQL?Server中使用表變量和臨時(shí)表

    這篇文章介紹了SQL?Server中使用表變量和臨時(shí)表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法

    SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法

    本文主要介紹SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法,比較實(shí)用,希望能給大家做一個(gè)參考。
    2016-06-06
  • SQL Server 觸發(fā)器實(shí)例詳解

    SQL Server 觸發(fā)器實(shí)例詳解

    觸發(fā)器是一種特殊類(lèi)型的存儲(chǔ)過(guò)程,它不同于之前的我們介紹的存儲(chǔ)過(guò)程。觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)被自動(dòng)調(diào)用執(zhí)行的,接下來(lái)本文通過(guò)實(shí)例詳解sqlserver觸發(fā)器,對(duì)sqlserver觸發(fā)器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01

最新評(píng)論