最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis在SQL語句中如何獲取list的大小

 更新時間:2023年03月16日 09:18:18   作者:Counter-Strike大牛  
這篇文章主要介紹了MyBatis在SQL語句中如何獲取list的大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

MyBatis在SQL語句中獲取list大小

需求:使用MyBatis進行開發(fā)時,在一個SQL語句中需要拼接list的大小。

大家都知道,當(dāng)我們在MyBatis中寫SQL時,如果需要遍歷list,先對list進行非空判斷的時候,可以加下面這行:

<if test="null != list and list.size != 0">SQL</if>

但是如果想在SQL中取到list.size的值,則比較麻煩。

一般會想到如下:

? ? <select id="getArticleIdByTags" parameterType="java.util.List" resultType="java.lang.Integer">
? ? ? ? SELECT id
? ? ? ? FROM table_name
? ? ? ? where 1=1
? ? ? ? <foreach collection="list" item="item" open="AND" separator="OR" close="GROUP BY id HAVING COUNT(*) >=">
? ? ? ? ? ? field1 = #{item.a} AND field2 = #{item.b}
? ? ? ? </foreach>
? ? ? ? #{list.size}
? ? </select>

但是你會發(fā)現(xiàn)報錯了,PersistenceException、UnsupportOperationException。

因為list.size用#{}是取不出來的,需要用${},把#換成$就可以了。

#{}能夠有效防止SQL注入,但是也有它的缺點,它會把傳入的數(shù)據(jù)自動加上一個雙引號,所以如果要的是數(shù)字的話,就會比較尷尬。

而${}可以直接解析出原本的數(shù)據(jù),所以需要數(shù)值比較的話,還是要加${}。

MyBatis SQL語句解讀

1 CRUD標簽

1.1 select

select中屬性說明:

  • id屬性:當(dāng)前名稱空間下的statement的唯一標識。必須。要求id和mapper接口中的方法的名字一致。
  • resultType:將結(jié)果集映射為java的對象類型。必須(和 resultMap 二選一)
  • parameterType:傳入?yún)?shù)類型。可以省略

標簽內(nèi)部:具體的sql語句。

?? ??? ?<select id="接口名稱" parameterType="包名.類名" resultType="包名.返回結(jié)果集類型">
?? ??? ??? ?select 字段名 from 表名 where 條件?
?? ??? ?</select>

注意:resultType中填寫返回結(jié)果集中對象的類型,而不是結(jié)果集的類型

例如:

返回結(jié)果是一個集合--->  List<User>

resultType里面應(yīng)該填寫User ---> resultType="包名.User"

1.2 insert

insert中屬性說明:

  • id:唯一標識,必須,在同一個命名空間下保持唯一,使用動態(tài)代理之后要求和方法名保持一致
  • parameterType:參數(shù)的類型,使用動態(tài)代理之后和方法的參數(shù)類型一致
  • useGeneratedKeys:開啟主鍵回寫
  • keyColumn:指定數(shù)據(jù)庫的主鍵
  • keyProperty:主鍵對應(yīng)的實體類屬性名

標簽內(nèi)部:具體的sql語句。

<insert id="接口名稱" parameterType="包名.類名" useGeneratedKeys="true" keyProperty="對象屬性">
? ? ? ? insert into student(字段名,字段名,字段名,字段名) values(參數(shù),參數(shù),參數(shù),參數(shù));
</insert>

注意:keyProperty 返回的主鍵值會寫入傳入?yún)?shù)的對象中,所以其中填寫對象接收主鍵值的屬性

1.3 update

update中屬性說明

  • id屬性:當(dāng)前名稱空間下的statement的唯一標識,必須,使用動態(tài)代理之后要求和方法名保持一致;
  • parameterType:傳入的參數(shù)類型,可以省略。

標簽內(nèi)部:具體的sql語句。

?? ??? ?<update id="接口名稱" parameterType="包名.類名">
?? ??? ??? ?update 表名 set 字段名=參數(shù)... ?where 條件
?? ??? ?</update>

1.4 delete

delete 的幾個屬性說明:

  • id屬性:當(dāng)前名稱空間下的statement的唯一標識,必須,使用動態(tài)代理之后要求和方法名保持一致;
  • parameterType:傳入的參數(shù)類型,可以省略。

標簽內(nèi)部:具體的sql語句。

?? ??? ??? ??? ?<delete id="delete" >
?? ??? ??? ??? ??? ?delete from 表名 where 條件
?? ??? ??? ??? ?</delete>

1.5 #{ }和${ }的區(qū)別

#{} 只是替換?,相當(dāng)于PreparedStatement使用占位符去替換參數(shù),可以防止sql注入。

${} 是進行字符串拼接,相當(dāng)于sql語句中的Statement,使用字符串去拼接sql;${} 可以是sql中的任一部分傳入到Statement中,不能防止sql注入

簡單說可以理解為:

#{} 相當(dāng)于對數(shù)據(jù)加上了引號,預(yù)編譯的時候相當(dāng)于占位符號,能夠防止sql注入。

${} 沒有給數(shù)據(jù)加上引號,預(yù)編譯是相當(dāng)于字符串拼接,所以不能防止sql注入。

2 動態(tài)SQL

2.1 if 標簽

?? ??? ??? ??? ??? ?<if test=" id != 0 ">
?? ??? ??? ??? ??? ? ? ? ?and id = #{id}
?? ??? ??? ??? ??? ?</if>
?? ??? ??? ??? ??? ?<if test=" name!=null and name.trim()!='' ">
?? ??? ??? ??? ??? ? ? ? ?and name = #{name}
?? ??? ??? ??? ??? ?</if>

test是if標簽的唯一屬性,它用來判斷后面的條件是否成立。如果條件成立,就將if標簽內(nèi)的內(nèi)容拼接到sql語句中

多個if連接,只要自身條件成立就會實現(xiàn)sql語句拼接,和其他if標簽無關(guān)

2.2 choose when otherwise

?? ??? ??? ??? ?<choose>
?? ??? ??? ??? ? ? ? ? ?<when test="name!=null and name.trim()!=''">
?? ??? ??? ??? ? ? ? ? ? ? ?and name = #{name}
?? ??? ??? ??? ? ? ? ? ?</when>
?? ??? ??? ??? ? ? ? ? ?<when test="id != 0">
?? ??? ??? ??? ? ? ? ? ? ? ?and age = #{age}
?? ??? ??? ??? ? ? ? ? ?</when>
?? ??? ??? ??? ? ? ? ? ?<otherwise>
?? ??? ??? ??? ? ? ? ? ? ? ?and name='鵬程'
?? ??? ??? ??? ? ? ? ? ?</otherwise>
?? ??? ??? ??? ?</choose>

choose when otherwise 三個標簽通常一起使用。

作用:

1.一旦有條件成立的when,后續(xù)的when則不會執(zhí)行

2.當(dāng)所有的when都不執(zhí)行時,才會執(zhí)行otherwise

2.3 where set

<where> ?</where>
<set> ?</set>

**作用:

where標簽相當(dāng)于在sql語句中拼接一個where單詞,里面可以填寫條件

set標簽相當(dāng)于在sql語句中拼接一個set單詞,當(dāng)對數(shù)據(jù)修改時可以修改,里面也可以填寫部分語句

兩個標簽都沒有屬性,就是直接在語句中拼接上where或set

**

2.4 trim

?? ?update student
? ? <trim prefix="set" suffix="" prefixOverrides="" suffixOverrides=",">
? ? ? ? <if test="name!=null and name.trim()!=''">name = #{name},</if>
? ? ? ? <if test="password!=null and password.trim()!=''">password = #{password},</if>
? ? ? ? <if test="sex!=null and sex.trim()!=''">sex = #{sex},</if>
? ? ? ? <if test="age!=0">age = #{age},</if>
? ? ? ? <if test="tel!=null and tel.trim()!=''">tel = #{tel},</if>
? ? ? ? <if test="address!=null and address.trim()!=''">address = #{address},</if>
? ? ?</trim>
? ? ?<if test="id!=0">where id = #{id}</if>
屬性作用
prefix添加前綴
suffix添加后綴
prefixOverrides刪除多余前綴
suffixOverrides刪除多余后綴

2.5 foreach

?? ??? ? select * from tb_user where id in
?? ??? ? <foreach collection="ids" item="id" open="(" close=")" separator=",">
?? ??? ? ? ? ? #{id}
?? ??? ? </foreach>

foreach標簽可以遍歷集合。所以我們在使用foreach時,傳入的參數(shù)都是集合。

其中各元素說明:

  • collection:傳入集合參數(shù)名稱
  • id:循環(huán)對象名稱,自己設(shè)置
  • open:開始符號,與close一起使用,就是循環(huán)輸出的結(jié)果外面加上所需要的符號
  • close:結(jié)束符號
  • separator:設(shè)置迭代元素之間的間隔符

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC中Json數(shù)據(jù)交互處理示例詳解

    SpringMVC中Json數(shù)據(jù)交互處理示例詳解

    這篇文章主要介紹了SpringMVC中Json數(shù)據(jù)交互處理的相關(guān)資料,分別講解了JSON的基本概念、構(gòu)成要素、數(shù)據(jù)類型、對象和數(shù)組的表示方法、字符串的轉(zhuǎn)義規(guī)則以及JSON與JavaScript的關(guān)系,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Java多線程編程基石ThreadPoolExecutor示例詳解

    Java多線程編程基石ThreadPoolExecutor示例詳解

    這篇文章主要為大家介紹了Java多線程編程基石ThreadPoolExecutor示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 關(guān)于SpringSecurity?Context?中獲取和更改當(dāng)前用戶信息的問題

    關(guān)于SpringSecurity?Context?中獲取和更改當(dāng)前用戶信息的問題

    SpringSecurityContext在異步線程中無法獲取用戶信息,因其與請求線程綁定;此外,用戶信息更新后跳轉(zhuǎn)頁面時,身份會被降級為匿名,導(dǎo)致信息無法及時同步,本文給大家介紹SpringSecurity?Context?中獲取和更改當(dāng)前用戶信息的問題,感興趣的朋友一起看看吧
    2024-09-09
  • 新版Android?Studio修改jdk版本的簡單步驟

    新版Android?Studio修改jdk版本的簡單步驟

    這篇文章主要介紹了新版Android?Studio修改jdk版本的簡單步驟,升級Android?Studio后,JDK版本設(shè)置選項消失,可以通過Settings面板進入Gradle設(shè)置,修改GradleJDK路徑來解決問題,需要的朋友可以參考下
    2025-03-03
  • Java中駝峰命名與下劃線命名相互轉(zhuǎn)換

    Java中駝峰命名與下劃線命名相互轉(zhuǎn)換

    這篇文章主要介紹了Java中駝峰命名與下劃線命名相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • springboot jsp支持以及轉(zhuǎn)發(fā)配置方式

    springboot jsp支持以及轉(zhuǎn)發(fā)配置方式

    文章介紹了如何在Spring Boot項目中配置和使用JSP,并提供了一步一步的指導(dǎo),包括添加依賴、配置文件設(shè)置、控制器和視圖的使用
    2024-12-12
  • Java解密微信小程序手機號的方法

    Java解密微信小程序手機號的方法

    這篇文章主要為大家詳細介紹了Java解密微信小程序手機號的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 使用list stream: 任意對象List拼接字符串

    使用list stream: 任意對象List拼接字符串

    這篇文章主要介紹了使用list stream:任意對象List拼接字符串操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java?設(shè)計模式以虹貓藍兔的故事講解簡單工廠模式

    Java?設(shè)計模式以虹貓藍兔的故事講解簡單工廠模式

    簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設(shè)計模式之一。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現(xiàn)
    2022-03-03
  • SpringBoot使用Redis實現(xiàn)消息隊列的方法小結(jié)

    SpringBoot使用Redis實現(xiàn)消息隊列的方法小結(jié)

    在應(yīng)用中把Redis當(dāng)成消息隊列來使用已經(jīng)屢見不鮮了,我想主要原因是當(dāng)代應(yīng)用十有八九都會用到 Redis,因此不用再引入其他消息隊列系統(tǒng),而且Redis提供了好幾種實現(xiàn)消息隊列的方法,用起來也簡單,本文給大家介紹了SpringBoot使用Redis實現(xiàn)消息隊列的方法小結(jié)
    2024-04-04

最新評論

通榆县| 紫阳县| 广州市| 定州市| 隆昌县| 得荣县| 尼木县| 恭城| 玛沁县| 高雄市| 开鲁县| 和田市| 唐山市| 桦甸市| 古交市| 申扎县| 南澳县| 中阳县| 霍城县| 璧山县| 永丰县| 花莲县| 金乡县| 东台市| 洛南县| 泰安市| 浑源县| 和平县| 淅川县| 汉中市| 增城市| 哈尔滨市| 克拉玛依市| 文登市| 图片| 东明县| 太仆寺旗| 织金县| 奎屯市| 临猗县| 南平市|