亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis在SQL語(yǔ)句中如何獲取list的大小

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

MyBatis在SQL語(yǔ)句中獲取list大小

需求:使用MyBatis進(jìn)行開發(fā)時(shí),在一個(gè)SQL語(yǔ)句中需要拼接list的大小。

大家都知道,當(dāng)我們?cè)贛yBatis中寫SQL時(shí),如果需要遍歷list,先對(duì)list進(jìn)行非空判斷的時(shí)候,可以加下面這行:

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

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

一般會(huì)想到如下:

? ? <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>

但是你會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了,PersistenceException、UnsupportOperationException。

因?yàn)閘ist.size用#{}是取不出來(lái)的,需要用${},把#換成$就可以了。

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

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

MyBatis SQL語(yǔ)句解讀

1 CRUD標(biāo)簽

1.1 select

select中屬性說(shuō)明:

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

標(biāo)簽內(nèi)部:具體的sql語(yǔ)句。

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

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

例如:

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

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

1.2 insert

insert中屬性說(shuō)明:

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

標(biāo)簽內(nèi)部:具體的sql語(yǔ)句。

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

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

1.3 update

update中屬性說(shuō)明

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

標(biāo)簽內(nèi)部:具體的sql語(yǔ)句。

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

1.4 delete

delete 的幾個(gè)屬性說(shuō)明:

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

標(biāo)簽內(nèi)部:具體的sql語(yǔ)句。

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

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

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

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

簡(jiǎn)單說(shuō)可以理解為:

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

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

2 動(dòng)態(tài)SQL

2.1 if 標(biāo)簽

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

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

多個(gè)if連接,只要自身?xiàng)l件成立就會(huì)實(shí)現(xiàn)sql語(yǔ)句拼接,和其他if標(biāo)簽無(wú)關(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 三個(gè)標(biāo)簽通常一起使用。

作用:

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

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

2.3 where set

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

**作用:

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

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

兩個(gè)標(biāo)簽都沒(méi)有屬性,就是直接在語(yǔ)句中拼接上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標(biāo)簽可以遍歷集合。所以我們?cè)谑褂胒oreach時(shí),傳入的參數(shù)都是集合。

其中各元素說(shuō)明:

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

總結(jié)

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

相關(guān)文章

  • 解決IntelliJ IDEA中鼠標(biāo)拖動(dòng)選擇為矩形區(qū)域問(wèn)題

    解決IntelliJ IDEA中鼠標(biāo)拖動(dòng)選擇為矩形區(qū)域問(wèn)題

    這篇文章主要介紹了解決IntelliJ IDEA中鼠標(biāo)拖動(dòng)選擇為矩形區(qū)域問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java interceptor攔截器的方法

    Java interceptor攔截器的方法

    java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象,它提供了一種機(jī)制可使開發(fā)者在一個(gè)Action執(zhí)行的先后執(zhí)行一段代碼,也能夠在一個(gè)Action,接下來(lái)通過(guò)本文給大家介紹Java interceptor攔截器的方法,感興趣的朋友一起看看吧
    2022-01-01
  • 老生常談java中的fail-fast機(jī)制

    老生常談java中的fail-fast機(jī)制

    下面小編就為大家?guī)?lái)一篇老生常談java中的fail-fast機(jī)制。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 超簡(jiǎn)單的java獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的實(shí)例(鼠標(biāo)在Jframe上的坐標(biāo))

    超簡(jiǎn)單的java獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的實(shí)例(鼠標(biāo)在Jframe上的坐標(biāo))

    在Java窗體Jframe上獲取鼠標(biāo)點(diǎn)擊的坐標(biāo),其中使用了匿名內(nèi)部類,實(shí)例代碼非常簡(jiǎn)單易懂,大家可以學(xué)習(xí)一下
    2018-03-03
  • Spring?Boot整合郵箱發(fā)送郵件實(shí)例

    Spring?Boot整合郵箱發(fā)送郵件實(shí)例

    大家好,本篇文章主要講的是Spring?Boot整合郵箱發(fā)送郵件實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • java獲取文件的inode標(biāo)識(shí)符的方法

    java獲取文件的inode標(biāo)識(shí)符的方法

    這篇文章主要介紹了java獲取文件的inode標(biāo)識(shí)符,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • mybatis mapper.xml獲取insert后的自增ID問(wèn)題

    mybatis mapper.xml獲取insert后的自增ID問(wèn)題

    這篇文章主要介紹了mybatis mapper.xml獲取insert后的自增ID問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java中Parser的用法

    Java中Parser的用法

    這篇文章主要介紹了Java?Parser使用指南,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Mybatis實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)流程

    Mybatis實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)流程

    這篇文章主要給大家介紹了關(guān)于Mybatis實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)流程,MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,需要的朋友可以參考下
    2023-08-08
  • IDEA怎么設(shè)置maven配置

    IDEA怎么設(shè)置maven配置

    這篇文章主要介紹了IDEA怎么設(shè)置maven配置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論