溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis在SQL語句中怎么獲取list的大小

發(fā)布時間:2023-03-16 10:52:00 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“MyBatis在SQL語句中怎么獲取list的大小”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MyBatis在SQL語句中怎么獲取list的大小”吧!

    MyBatis在SQL語句中獲取list大小

    需求:使用MyBatis進行開發(fā)時,在一個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>

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

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

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

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

    MyBatis SQL語句解讀

    1 CRUD標簽

    1.1 select

    select中屬性說明:

    • id屬性:當前名稱空間下的statement的唯一標識。必須。要求id和mapper接口中的方法的名字一致。

    • resultType:將結果集映射為java的對象類型。必須(和 resultMap 二選一)

    • parameterType:傳入?yún)?shù)類型。可以省略

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

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

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

    例如:

    返回結果是一個集合--->  List<User>

    resultType里面應該填寫User ---> resultType="包名.User"

    1.2 insert

    insert中屬性說明:

    • id:唯一標識,必須,在同一個命名空間下保持唯一,使用動態(tài)代理之后要求和方法名保持一致

    • parameterType:參數(shù)的類型,使用動態(tài)代理之后和方法的參數(shù)類型一致

    • useGeneratedKeys:開啟主鍵回寫

    • keyColumn:指定數(shù)據(jù)庫的主鍵

    • keyProperty:主鍵對應的實體類屬性名

    標簽內(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屬性:當前名稱空間下的statement的唯一標識,必須,使用動態(tài)代理之后要求和方法名保持一致;

    • parameterType:傳入的參數(shù)類型,可以省略。

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

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

    1.4 delete

    delete 的幾個屬性說明:

    • id屬性:當前名稱空間下的statement的唯一標識,必須,使用動態(tài)代理之后要求和方法名保持一致;

    • parameterType:傳入的參數(shù)類型,可以省略。

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

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

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

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

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

    簡單說可以理解為:

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

    ${} 沒有給數(shù)據(jù)加上引號,預編譯是相當于字符串拼接,所以不能防止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標簽無關

    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.當所有的when都不執(zhí)行時,才會執(zhí)行otherwise

    2.3 where set

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

    **作用:

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

    set標簽相當于在sql語句中拼接一個set單詞,當對數(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)對象名稱,自己設置

    • open:開始符號,與close一起使用,就是循環(huán)輸出的結果外面加上所需要的符號

    • close:結束符號

    • separator:設置迭代元素之間的間隔符

    感謝各位的閱讀,以上就是“MyBatis在SQL語句中怎么獲取list的大小”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對MyBatis在SQL語句中怎么獲取list的大小這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI