MyBatis 常用 XML 语法参考
本文将为你汇总 MyBatis 常用 XML 语法,便于查询和使用。
1. resultMap
- 定义结果映射
resultMap
是 MyBatis 中的核心元素,用于将数据库中的列映射到 Java 对象的字段上。通常用于自定义字段的映射关系、嵌套对象和集合映射。
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<result property="email" column="email_address" />
</resultMap>
常用子标签
<id>
: 指定主键字段。<result>
: 非主键字段。<association>
: 一对一关系的嵌套对象。<collection>
: 一对多关系的嵌套对象集合。
2. select
- 查询语句
select
用于定义 SQL 查询语句,支持简单查询、动态 SQL 和结果映射。
<select id="selectUser" resultMap="userResultMap">
SELECT * FROM users WHERE id = #{id}
</select>
常用属性
id
: 方法名称,对应 Mapper 接口中的方法。resultMap
: 指定结果映射的resultMap
。resultType
: 直接指定结果的 Java 类型,适合简单查询。parameterType
: 输入参数类型。
3. insert
- 插入语句
insert
标签用于定义插入操作,支持批量插入和动态 SQL。
<insert id="insertUser" parameterType="User">
INSERT INTO users (username, email_address)
VALUES (#{username}, #{emailAddress})
</insert>
常用属性
id
: 方法名称。parameterType
: 插入对象的类型。
4. update
- 更新语句
update
标签用于定义更新操作,支持动态 SQL。
<update id="updateUser" parameterType="User">
UPDATE users SET
username = #{username},
email_address = #{emailAddress}
WHERE id = #{id}
</update>
常用属性
id
: 方法名称。parameterType
: 输入参数类型。
5. delete
- 删除语句
delete
标签用于定义删除操作。
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
常用属性
id
: 方法名称。parameterType
: 输入参数类型。
6. 动态 SQL 标签
MyBatis 提供了一系列动态 SQL 标签,以便灵活构造 SQL 查询,减少代码冗余。
if
if
标签用于根据条件判断是否包含某段 SQL。
<select id="findUsers" resultType="User">
SELECT * FROM users
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="emailAddress != null">
AND email_address = #{emailAddress}
</if>
</where>
</select>
choose
, when
, otherwise
choose
类似 Java 中的 switch
,允许多条件选择。
<select id="findUser" resultType="User">
SELECT * FROM users
WHERE
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="username != null">
username = #{username}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</select>
where
where
标签会自动忽略第一个 “AND” 或 “OR”,以确保 SQL 语法正确。
<where>
<if test="username != null">
AND username = #{username}
</if>
<if test="emailAddress != null">
AND email_address = #{emailAddress}
</if>
</where>
set
set
标签用于动态构建 UPDATE
语句中的 SET
部分,避免多余的逗号。
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="username != null">
username = #{username},
</if>
<if test="emailAddress != null">
email_address = #{emailAddress},
</if>
</set>
WHERE id = #{id}
</update>
foreach
foreach
标签用于遍历集合,例如 IN
查询或批量插入。
<select id="findUsersByIds" resultType="User">
SELECT * FROM users WHERE id IN
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
bind
bind
标签用于创建一个新的变量,便于在 SQL 语句中引用。
<select id="searchUsers" resultType="User">
<bind name="pattern" value="'%' + username + '%'" />
SELECT * FROM users WHERE username LIKE #{pattern}
</select>
7. SQL 片段 (sql
)
sql
标签用于定义可复用的 SQL 片段,通过 include
标签引用,适合处理重复 SQL 片段。
<sql id="userColumns">
id, username, email_address
</sql>
<select id="selectUser" resultType="User">
SELECT <include refid="userColumns" /> FROM users WHERE id = #{id}
</select>
8. cache
和 cache-ref
- 缓存配置
MyBatis 支持一级缓存和二级缓存。通过在 XML 中配置 cache
和 cache-ref
标签,可以轻松开启和管理缓存。
<!-- 开启二级缓存 -->
<cache/>
<!-- 引用其他命名空间的缓存配置 -->
<cache-ref namespace="com.example.mapper.UserMapper"/>
常用属性
eviction
: 缓存清除策略,如LRU
、FIFO
等。flushInterval
: 刷新间隔时间(毫秒)。size
: 缓存的最大对象数。readOnly
: 是否只读,默认为false
。