您好,登錄后才能下訂單哦!
這篇文章主要講解了“MyBatis在SQL語句中怎么獲取list的大小”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MyBatis在SQL語句中怎么獲取list的大小”吧!
需求:使用MyBatis進行開發時,在一個SQL語句中需要拼接list的大小。
大家都知道,當我們在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>
但是你會發現報錯了,PersistenceException、UnsupportOperationException。
因為list.size用#{}是取不出來的,需要用${},把#換成$就可以了。
#{}能夠有效防止SQL注入,但是也有它的缺點,它會把傳入的數據自動加上一個雙引號,所以如果要的是數字的話,就會比較尷尬。
而${}可以直接解析出原本的數據,所以需要數值比較的話,還是要加${}。
1.1 select
select中屬性說明:
id
屬性:當前名稱空間下的statement的唯一標識。必須。要求id和mapper接口中的方法的名字一致。
resultType
:將結果集映射為java的對象類型。必須(和 resultMap 二選一)
parameterType
:傳入參數類型。可以省略
標簽內部:具體的sql語句。
<select id="接口名稱" parameterType="包名.類名" resultType="包名.返回結果集類型"> select 字段名 from 表名 where 條件 </select>
注意:resultType中填寫返回結果集中對象的類型,而不是結果集的類型
例如:
返回結果是一個集合---> List<User>
resultType里面應該填寫User ---> resultType="包名.User"
1.2 insert
insert中屬性說明:
id
:唯一標識,必須,在同一個命名空間下保持唯一,使用動態代理之后要求和方法名保持一致
parameterType
:參數的類型,使用動態代理之后和方法的參數類型一致
useGeneratedKeys
:開啟主鍵回寫
keyColumn
:指定數據庫的主鍵
keyProperty
:主鍵對應的實體類屬性名
標簽內部:具體的sql語句。
<insert id="接口名稱" parameterType="包名.類名" useGeneratedKeys="true" keyProperty="對象屬性"> insert into student(字段名,字段名,字段名,字段名) values(參數,參數,參數,參數); </insert>
注意:keyProperty 返回的主鍵值會寫入傳入參數的對象中,所以其中填寫對象接收主鍵值的屬性
1.3 update
update中屬性說明
id
屬性:當前名稱空間下的statement的唯一標識,必須,使用動態代理之后要求和方法名保持一致;
parameterType
:傳入的參數類型,可以省略。
標簽內部:具體的sql語句。
<update id="接口名稱" parameterType="包名.類名"> update 表名 set 字段名=參數... where 條件 </update>
1.4 delete
delete 的幾個屬性說明:
id
屬性:當前名稱空間下的statement的唯一標識,必須,使用動態代理之后要求和方法名保持一致;
parameterType
:傳入的參數類型,可以省略。
標簽內部:具體的sql語句。
<delete id="delete" > delete from 表名 where 條件 </delete>
1.5 #{ }和${ }的區別
#{} 只是替換?,相當于PreparedStatement使用占位符去替換參數,可以防止sql注入。
${} 是進行字符串拼接,相當于sql語句中的Statement,使用字符串去拼接sql;${} 可以是sql中的任一部分傳入到Statement中,不能防止sql注入
簡單說可以理解為:
#{} 相當于對數據加上了引號,預編譯的時候相當于占位符號,能夠防止sql注入。
${} 沒有給數據加上引號,預編譯是相當于字符串拼接,所以不能防止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標簽內的內容拼接到sql語句中
多個if連接,只要自身條件成立就會實現sql語句拼接,和其他if標簽無關
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,后續的when則不會執行
2.當所有的when都不執行時,才會執行otherwise
2.3 where set
<where> </where> <set> </set>
**作用:
where標簽相當于在sql語句中拼接一個where單詞,里面可以填寫條件
set標簽相當于在sql語句中拼接一個set單詞,當對數據修改時可以修改,里面也可以填寫部分語句
兩個標簽都沒有屬性,就是直接在語句中拼接上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時,傳入的參數都是集合。
其中各元素說明:
collection
:傳入集合參數名稱
id
:循環對象名稱,自己設置
open
:開始符號,與close一起使用,就是循環輸出的結果外面加上所需要的符號
close
:結束符號
separator
:設置迭代元素之間的間隔符
感謝各位的閱讀,以上就是“MyBatis在SQL語句中怎么獲取list的大小”的內容了,經過本文的學習后,相信大家對MyBatis在SQL語句中怎么獲取list的大小這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。