MyBatis中常用的SQL語(yǔ)句詳解
MyBatis 中常用的 SQL 語(yǔ)句與標(biāo)準(zhǔn) SQL 語(yǔ)句基本一致,但 MyBatis 提供了一些額外的特性和標(biāo)簽來(lái)更方便地構(gòu)建和管理 SQL 語(yǔ)句。
以下列出 MyBatis 中常用的 SQL 語(yǔ)句,并結(jié)合 MyBatis 的特性進(jìn)行說(shuō)明:
1. SELECT (查詢)
基本查詢:
<select id="selectUserById" parameterType="int" resultType="User">
SELECT id, username, password, email FROM users WHERE id = #{id}
</select>id: 該 SQL 語(yǔ)句的唯一標(biāo)識(shí)符,用于在 Java 代碼中引用。parameterType: 傳入?yún)?shù)的類型 (可選,MyBatis 可以自動(dòng)推斷)。resultType: 查詢結(jié)果映射的 Java 類型 (POJO)。#{id}: 占位符,表示傳入的參數(shù),MyBatis 會(huì)自動(dòng)進(jìn)行參數(shù)綁定和類型轉(zhuǎn)換,防止 SQL 注入。
多條件查詢 (動(dòng)態(tài) SQL):
<select id="selectUsers" parameterType="map" resultType="User">
SELECT id, username, password, email FROM users
<where>
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="email != null and email != ''">
AND email = #{email}
</if>
</where>
</select><where>: 自動(dòng)添加WHERE關(guān)鍵字,并處理多余的AND或OR。<if>: 根據(jù)條件判斷是否包含該 SQL 片段。test: 條件表達(dá)式,使用 OGNL 表達(dá)式。LIKE: 模糊查詢,CONCAT('%', #{username}, '%')用于構(gòu)建模糊查詢條件。
關(guān)聯(lián)查詢 (JOIN):
<select id="selectUserWithOrders" parameterType="int" resultMap="userWithOrdersResultMap">
SELECT
u.id AS user_id,
u.username,
o.id AS order_id,
o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
<resultMap id="userWithOrdersResultMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="orderDate" column="order_date"/>
</collection>
</resultMap>LEFT JOIN: 左連接,獲取用戶及其所有訂單。resultMap: 自定義結(jié)果映射,用于處理復(fù)雜的關(guān)聯(lián)關(guān)系。<collection>: 映射一對(duì)多關(guān)系,將訂單列表映射到User對(duì)象的orders屬性。
分頁(yè)查詢 :
<!-- MySQL -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
SELECT id, username, password, email FROM users LIMIT #{offset}, #{pageSize}
</select>
<!-- Oracle -->
<select id="selectUsersByPage" parameterType="map" resultType="User">
SELECT * FROM (
SELECT t.*, ROWNUM rn FROM (
SELECT id, username, password, email FROM users
) t WHERE ROWNUM <= #{endRow}
) WHERE rn > #{startRow}
</select>LIMIT: MySQL 中的分頁(yè)關(guān)鍵字。ROWNUM: Oracle 中的偽列,用于分頁(yè)。- 需要根據(jù)不同的數(shù)據(jù)庫(kù)方言使用不同的分頁(yè)語(yǔ)法。 MyBatis 提供了
Dialect接口來(lái)支持不同的數(shù)據(jù)庫(kù)方言。
2. INSERT (插入)
- 基本插入:
<insert id="insertUser" parameterType="User">
INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>- 獲取自增主鍵:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
</insert>useGeneratedKeys="true": 啟用獲取自增主鍵。keyProperty="id": 指定將自增主鍵值設(shè)置到User對(duì)象的哪個(gè)屬性 (通常是id)。
批量插入 (foreach):
<insert id="batchInsertUsers" parameterType="java.util.List">
INSERT INTO users (username, password, email) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.username}, #{user.password}, #{user.email})
</foreach>
</insert><foreach>: 循環(huán)遍歷list集合,生成多個(gè)插入值。collection: 指定要遍歷的集合。item: 集合中每個(gè)元素的別名。separator: 分隔符,用于分隔每次循環(huán)生成的 SQL 片段。
3. UPDATE (更新)
- 基本更新:
<update id="updateUser" parameterType="User">
UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
</update>- 動(dòng)態(tài)更新 (set + if):
<update id="updateUserSelective" parameterType="User">
UPDATE users
<set>
<if test="username != null and username != ''">
username = #{username},
</if>
<if test="password != null and password != ''">
password = #{password},
</if>
<if test="email != null and email != ''">
email = #{email},
</if>
</set>
WHERE id = #{id}
</update><set>: 自動(dòng)添加SET關(guān)鍵字,并處理多余的逗號(hào)。- 只更新傳入的非空字段。
4. DELETE (刪除)
- 基本刪除:
<delete id="deleteUserById" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>- 批量刪除 (foreach):
<delete id="deleteUsersByIds" parameterType="java.util.List">
DELETE FROM users WHERE id IN
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>open: 循環(huán)開(kāi)始前添加的字符串。close: 循環(huán)結(jié)束后添加的字符串。
5. 其他常用標(biāo)簽和特性
<sql>: 定義可重用的 SQL 片段。
<sql id="userColumns">
id, username, password, email
</sql>
<select id="selectUserById" parameterType="int" resultType="User">
SELECT <include refid="userColumns"/> FROM users WHERE id = #{id}
</select>#{} vs ${}:#{}: 預(yù)編譯參數(shù),防止 SQL 注入,推薦使用。${}: 字符串替換,直接將值拼接到 SQL 語(yǔ)句中,有 SQL 注入風(fēng)險(xiǎn),謹(jǐn)慎使用 (例如,用于動(dòng)態(tài)表名或列名)。
typeAliases: 定義類型別名,簡(jiǎn)化resultType和parameterType的書(shū)寫(xiě)。<cache>: 開(kāi)啟二級(jí)緩存,提高查詢性能。- Result Maps (結(jié)果映射): 處理復(fù)雜類型和關(guān)聯(lián)關(guān)系的映射。
總結(jié)
MyBatis 的核心在于將 SQL 語(yǔ)句與 Java 代碼分離,并通過(guò) XML 或注解的方式進(jìn)行配置。 盡可能使用 #{} 進(jìn)行參數(shù)綁定,以防止 SQL 注入。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例
這篇文章主要介紹了Java編程實(shí)現(xiàn)從尾到頭打印鏈表代碼實(shí)例,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10
SpringBoot集成Devtools實(shí)現(xiàn)熱更新
DevTools是開(kāi)發(fā)者工具集,主要用于簡(jiǎn)化開(kāi)發(fā)過(guò)程中的熱部署問(wèn)題,熱部署是指在開(kāi)發(fā)過(guò)程中,當(dāng)代碼發(fā)生變化時(shí),無(wú)需手動(dòng)重啟應(yīng)用,系統(tǒng)能夠自動(dòng)檢測(cè)并重新加載修改后的代碼,本文給大家介紹了SpringBoot集成Devtools實(shí)現(xiàn)熱更新,需要的朋友可以參考下2024-08-08
Java中關(guān)于字典樹(shù)的算法實(shí)現(xiàn)
字典樹(shù),又稱單詞查找樹(shù),Trie樹(shù),是一種樹(shù)形結(jié)構(gòu),哈希表的一個(gè)變種。用于統(tǒng)計(jì),排序和保存大量的字符串,本文針對(duì)字典樹(shù)給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解
這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時(shí)任務(wù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java性能調(diào)優(yōu)System的gc垃圾回收方法
這篇文章主要為大家介紹了java性能調(diào)優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03

