MyBatis中常用的SQL語句詳解
更新時間:2025年03月10日 09:39:55 作者:冰糖心書房
MyBatis是一種優(yōu)秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射,本文介紹了MyBatis中常用的SQL語句,包括基本查詢、多條件查詢、關聯(lián)查詢、分頁查詢、插入、更新、刪除等,并結合MyBatis的特性進行了說明
MyBatis 中常用的 SQL 語句與標準 SQL 語句基本一致,但 MyBatis 提供了一些額外的特性和標簽來更方便地構建和管理 SQL 語句。
以下列出 MyBatis 中常用的 SQL 語句,并結合 MyBatis 的特性進行說明:
1. SELECT (查詢)
基本查詢:
<select id="selectUserById" parameterType="int" resultType="User"> SELECT id, username, password, email FROM users WHERE id = #{id} </select>
id
: 該 SQL 語句的唯一標識符,用于在 Java 代碼中引用。parameterType
: 傳入?yún)?shù)的類型 (可選,MyBatis 可以自動推斷)。resultType
: 查詢結果映射的 Java 類型 (POJO)。#{id}
: 占位符,表示傳入的參數(shù),MyBatis 會自動進行參數(shù)綁定和類型轉換,防止 SQL 注入。
多條件查詢 (動態(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>
: 自動添加WHERE
關鍵字,并處理多余的AND
或OR
。<if>
: 根據(jù)條件判斷是否包含該 SQL 片段。test
: 條件表達式,使用 OGNL 表達式。LIKE
: 模糊查詢,CONCAT('%', #{username}, '%')
用于構建模糊查詢條件。
關聯(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
: 自定義結果映射,用于處理復雜的關聯(lián)關系。<collection>
: 映射一對多關系,將訂單列表映射到User
對象的orders
屬性。
分頁查詢 :
<!-- 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 中的分頁關鍵字。ROWNUM
: Oracle 中的偽列,用于分頁。- 需要根據(jù)不同的數(shù)據(jù)庫方言使用不同的分頁語法。 MyBatis 提供了
Dialect
接口來支持不同的數(shù)據(jù)庫方言。
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"
: 指定將自增主鍵值設置到User
對象的哪個屬性 (通常是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
集合,生成多個插入值。collection
: 指定要遍歷的集合。item
: 集合中每個元素的別名。separator
: 分隔符,用于分隔每次循環(huán)生成的 SQL 片段。
3. UPDATE (更新)
- 基本更新:
<update id="updateUser" parameterType="User"> UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id} </update>
- 動態(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>
: 自動添加SET
關鍵字,并處理多余的逗號。- 只更新傳入的非空字段。
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)開始前添加的字符串。close
: 循環(huán)結束后添加的字符串。
5. 其他常用標簽和特性
<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 ${}
:#{}
: 預編譯參數(shù),防止 SQL 注入,推薦使用。${}
: 字符串替換,直接將值拼接到 SQL 語句中,有 SQL 注入風險,謹慎使用 (例如,用于動態(tài)表名或列名)。
typeAliases
: 定義類型別名,簡化resultType
和parameterType
的書寫。<cache>
: 開啟二級緩存,提高查詢性能。- Result Maps (結果映射): 處理復雜類型和關聯(lián)關系的映射。
總結
MyBatis 的核心在于將 SQL 語句與 Java 代碼分離,并通過 XML 或注解的方式進行配置。 盡可能使用 #{}
進行參數(shù)綁定,以防止 SQL 注入。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot集成Devtools實現(xiàn)熱更新
DevTools是開發(fā)者工具集,主要用于簡化開發(fā)過程中的熱部署問題,熱部署是指在開發(fā)過程中,當代碼發(fā)生變化時,無需手動重啟應用,系統(tǒng)能夠自動檢測并重新加載修改后的代碼,本文給大家介紹了SpringBoot集成Devtools實現(xiàn)熱更新,需要的朋友可以參考下2024-08-08Java下SpringBoot創(chuàng)建定時任務詳解
這篇文章主要介紹了Java下SpringBoot創(chuàng)建定時任務詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07