高效 MyBatis SQL 寫(xiě)法一

高效 MyBatis SQL 寫(xiě)法一

前言

image.png

MyBatis 作為一款優(yōu)秀的持久層框架,極大地簡(jiǎn)化了數(shù)據(jù)庫(kù)操作。

然而,在實(shí)際開(kāi)發(fā)中,XML 配置的編寫(xiě)仍然可能顯得繁瑣。

本文將分享一些 MyBatis 動(dòng)態(tài) SQL 的優(yōu)質(zhì)寫(xiě)法,幫助開(kāi)發(fā)者提升效率并減少錯(cuò)誤。

forEach 標(biāo)簽的使用

forEach 標(biāo)簽常用于循環(huán)遍歷集合,生成動(dòng)態(tài) SQL

其核心屬性包括:

  • item:集合中元素的別名。
  • index:集合中元素的索引。
  • collection:集合對(duì)象,必須指定。
  • open:循環(huán)開(kāi)始時(shí)的符號(hào),如 (
  • separator:元素間的分隔符,如 ,
  • close:循環(huán)結(jié)束時(shí)的符號(hào),如 )

示例:

public List<Entity> queryById(List<String> userIds);

對(duì)應(yīng)的 XML 配置:

<select id="queryById" resultMap="BaseResultMap">
    SELECT * FROM entity
    WHERE id IN
    <foreach collection="userIds" item="userId" index="index" open="(" separator="," close=")">
        #{userId}
    </foreach>
</select>

注意collection 屬性的值取決于傳入?yún)?shù)的類(lèi)型。

如果傳入的是 List,則值為 list;如果是數(shù)組,則為 array;如果是多個(gè)參數(shù),則需封裝為 Map

模糊查詢(xún)與 concat 函數(shù)

模糊查詢(xún)時(shí),可以使用 concat 函數(shù)動(dòng)態(tài)拼接 SQL 語(yǔ)句。

示例:

<select id="queryByName" resultMap="BaseResultMap" parameterType="Entity">
    SELECT * FROM entity
    <where>
        <if test="name != null">
            name LIKE concat('%', #{name}, '%')
        </if>
    </where>
</select>

choose 標(biāo)簽的多條件判斷

choose 標(biāo)簽類(lèi)似于 Java 中的 switch 語(yǔ)句,用于多條件判斷。

示例:

<select id="getUserList_choose" resultMap="resultMap_user" parameterType="User">
    SELECT * FROM User u
    <where>
        <choose>
            <when test="username != null">
                u.username LIKE CONCAT('%', #{username}, '%')
            </when>
            <when test="sex != null">
                AND u.sex = #{sex}
            </when>
            <otherwise>
                AND u.status = 'ACTIVE'
            </otherwise>
        </choose>
    </where>
</select>

selectKey 標(biāo)簽的主鍵生成

在插入數(shù)據(jù)時(shí),selectKey 標(biāo)簽可用于生成主鍵。

示例:

<insert id="createStudentAutoKey" parameterType="StudentEntity" keyProperty="studentId">
    <selectKey keyProperty="studentId" resultType="String" order="BEFORE">
        SELECT nextval('student')
    </selectKey>
    INSERT INTO STUDENT_TBL (student_id, student_name, student_sex, student_birthday)
    VALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday})
</insert>

if 標(biāo)簽的動(dòng)態(tài)條件

if 標(biāo)簽用于動(dòng)態(tài)生成 SQL 條件。

示例:

<select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="StudentEntity">
    SELECT * FROM STUDENT_TBL ST
    <where>
        <if test="studentName != null">
            ST.STUDENT_NAME LIKE CONCAT('%', #{studentName}, '%')
        </if>
        <if test="studentSex != null">
            AND ST.STUDENT_SEX = #{studentSex}
        </if>
    </where>
</select>

總結(jié)

通過(guò)合理使用 MyBatis 的動(dòng)態(tài) SQL 標(biāo)簽,開(kāi)發(fā)者可以顯著提升代碼的可讀性和維護(hù)性,同時(shí)減少錯(cuò)誤的發(fā)生。

本文介紹的幾種常見(jiàn)用法,涵蓋了從條件判斷到批量操作的多種場(chǎng)景,希望能為你的開(kāi)發(fā)工作帶來(lái)幫助。

– 歡迎點(diǎn)贊、關(guān)注、轉(zhuǎn)發(fā)、收藏【我碼玄黃】,各大平臺(tái)同名。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。