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