MyBatis中動(dòng)態(tài)SQL的使用指南
引言
MyBatis 是一個(gè)流行的持久層框架,它通過(guò) XML 或注解將接口方法與 SQL 映射在一起。動(dòng)態(tài) SQL 是 MyBatis 的一大特性,它使得構(gòu)建靈活的查詢(xún)變得簡(jiǎn)單。本文將通過(guò)一個(gè) User 表的示例,介紹 MyBatis 中常用的動(dòng)態(tài) SQL 方法。
1. 什么是動(dòng)態(tài) SQL?
動(dòng)態(tài) SQL 是指在運(yùn)行時(shí)構(gòu)建 SQL 語(yǔ)句,可以根據(jù)條件生成不同的 SQL 語(yǔ)句。這種方法在處理復(fù)雜查詢(xún)時(shí)尤為重要,可以有效避免 SQL 注入和冗余代碼。
2. 示例表:用戶(hù)表
我們以 User 表為例,表結(jié)構(gòu)如下:
//Lombok @Data @AllArgsConstructor @NoArgsConstructor @Builder public class User implements Serializable { private Long id; // 用戶(hù)id private String username; // 用戶(hù)名 private String password; // 密碼 private String phone; // 注冊(cè)手機(jī)號(hào) private String info; // 詳細(xì)信息 private Integer status; // 使用狀態(tài)(1正常 2凍結(jié)) private Integer balance; // 賬戶(hù)余額 private Date createTime; // 創(chuàng)建時(shí)間 private Date updateTime; // 更新時(shí)間 }
3. 常用動(dòng)態(tài) SQL 方法
3.1 where
使用 where
標(biāo)簽可以自動(dòng)處理 SQL 條件前的 AND 和 OR。
<select id="findByConditions" resultType="com.lps.domain.User"> SELECT * FROM user <where> <if test="username != null and username != ''"> AND USERNAME LIKE CONCAT('%', #{username}, '%') </if> <if test="phone != null and phone != ''"> AND PHONE LIKE CONCAT('%', #{phone}, '%') </if> </where> </select>
3.2 foreach
foreach
標(biāo)簽用于處理集合,可以生成 IN 查詢(xún)。
<select id="findByIds" resultType="com.lps.domain.User"> SELECT * FROM user WHERE id IN <foreach item="id" collection="idList" open="(" separator="," close=")"> #{id} </foreach> </select>
3.3 if
if
標(biāo)簽用于動(dòng)態(tài)決定是否包含某個(gè) SQL 片段。
<update id="updateUser"> UPDATE user <set> <if test="username != null">username = #{username},</if> <if test="phone != null">phone = #{phone},</if> </set> WHERE id = #{id} </update>
3.4 choose, when, otherwise
這些標(biāo)簽實(shí)現(xiàn)了類(lèi)似 Java 中 switch 的功能。
<select id="findByStatus" resultType="com.lps.domain.User"> SELECT * FROM user <where> <choose> <when test="status == 1">AND status = 1</when> <when test="status == 2">AND status = 2</when> <otherwise>AND status IS NULL</otherwise> </choose> </where> </select>
3.5 trim
trim
標(biāo)簽可以去掉 SQL 語(yǔ)句開(kāi)頭或結(jié)尾的特定字符。
<select id="findUsersWithTrim" resultType="com.lps.domain.User"> SELECT * FROM user <trim prefix="WHERE" prefixOverrides="AND |OR "> <if test="username != null">AND username = #{username}</if> <if test="phone != null">AND phone = #{phone}</if> <if test="status != null">AND status = #{status}</if> </trim> </select>
3.6 bind
bind
標(biāo)簽用于在 SQL 查詢(xún)中動(dòng)態(tài)綁定變量,通常用于處理 LIKE 查詢(xún)時(shí)拼接通配符。下面是一個(gè)通過(guò) bind
實(shí)現(xiàn)模糊查詢(xún)的示例:
<select id="selectUserByLike" resultType="com.lps.domain.User"> <bind name="username" value="'%' + username + '%'" /> SELECT * FROM user WHERE username LIKE #{username} </select>
在這個(gè)示例中,bind 標(biāo)簽將輸入的 username 動(dòng)態(tài)地拼接上 % 通配符,以支持模糊查詢(xún)。在查詢(xún)時(shí),MyBatis 會(huì)自動(dòng)將參數(shù) username 轉(zhuǎn)換為帶通配符的值并替換到 SQL 中,從而實(shí)現(xiàn)類(lèi)似于 SQL 中 LIKE '%xxx%' 的效果(類(lèi)似于3.1WHERE中用到的的CONCAT方法)
4. 總結(jié)
MyBatis 的動(dòng)態(tài) SQL 特性為開(kāi)發(fā)者提供了強(qiáng)大的靈活性,使得構(gòu)建復(fù)雜查詢(xún)變得簡(jiǎn)單。通過(guò)合理使用動(dòng)態(tài) SQL,可以提高代碼的可讀性和維護(hù)性。本文介紹了常見(jiàn)的動(dòng)態(tài) SQL 標(biāo)簽和用法,包括 where、foreach、if、choose、trim 和 bind。
以上就是MyBatis中動(dòng)態(tài)SQL的使用指南的詳細(xì)內(nèi)容,更多關(guān)于MyBatis動(dòng)態(tài)SQL使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MyBatis中實(shí)現(xiàn)動(dòng)態(tài)SQL標(biāo)簽
- 使用MyBatis的動(dòng)態(tài)SQL注解實(shí)現(xiàn)實(shí)體的CRUD操作代碼
- MyBatis實(shí)現(xiàn)動(dòng)態(tài)SQL的方法
- Mybatis之動(dòng)態(tài)SQL使用小結(jié)(全網(wǎng)最新)
- Mybatis動(dòng)態(tài)Sql標(biāo)簽使用小結(jié)
- MyBatis中的XML實(shí)現(xiàn)和動(dòng)態(tài)SQL實(shí)現(xiàn)示例詳解
- MyBatis映射文件中的動(dòng)態(tài)SQL實(shí)例詳解
- 詳解MyBatis特性之動(dòng)態(tài)SQL
- Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL的方法詳解
- MyBatis的動(dòng)態(tài)攔截sql并修改
- mybatis動(dòng)態(tài)生成sql語(yǔ)句的實(shí)現(xiàn)示例
相關(guān)文章
Mybatis配置映射文件中parameterType的用法講解
這篇文章主要介紹了Mybatis配置映射文件中parameterType的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09實(shí)現(xiàn)一個(gè)基于Servlet的hello world程序詳解步驟
Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來(lái)自 Web 瀏覽器或其他 HTTP 客戶(hù)端的請(qǐng)求和 HTTP 服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序之間的中間層2022-02-02maven profile實(shí)現(xiàn)多環(huán)境配置的示例
這篇文章主要介紹了maven profile實(shí)現(xiàn)多環(huán)境配置的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01springboot對(duì)接支付寶支付接口(詳細(xì)開(kāi)發(fā)步驟總結(jié))
這篇文章主要介紹了springboot對(duì)接支付寶支付接口(詳細(xì)開(kāi)發(fā)步驟總結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06springboot實(shí)現(xiàn)后臺(tái)上傳圖片(工具類(lèi))
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)后臺(tái)上傳圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04