MyBatis 是一个优秀的持久层框架,它通过 XML 或注解的方式将 Java 对象与数据库操作进行映射。在 MyBatis 的 XML 映射文件中,可以使用多种标签来定义 SQL 语句、参数映射、结果映射等。以下是一些常用的 MyBatis 标签及其作用:
1. 基本标签
1.1 <select>
用于定义查询语句。
xml
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
id
:唯一标识符,用于在 Java 代码中调用。resultType
:返回结果的类型(可以是 Java 类型或别名)。resultMap
:引用一个结果映射(<resultMap>
)。
1.2 <insert>
用于定义插入语句。
xml
<insert id="insertUser" parameterType="User">
INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
parameterType
:参数类型(可以是 Java 类型或别名)。useGeneratedKeys
:是否使用数据库生成的主键。keyProperty
:将生成的主键值赋值给哪个属性。
1.3 <update>
用于定义更新语句。
xml
<update id="updateUser" parameterType="User">
UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
1.4 <delete>
用于定义删除语句。
xml
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
2. 参数映射标签
2.1 <parameterMap>
(已废弃)
用于定义参数映射(不推荐使用,建议使用 parameterType
或 @Param
注解)。
2.2 <parameter>
用于定义参数映射的细节(通常与 <parameterMap>
一起使用,已废弃)。
3. 结果映射标签
3.1 <resultMap>
用于定义复杂的结果映射。
xml
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
id
:唯一标识符。type
:映射的 Java 类型。<id>
:主键字段映射。<result>
:普通字段映射。
3.2 <result>
用于定义单个字段的映射。
xml
<result property="name" column="name"/>
property
:Java 对象的属性名。column
:数据库表的列名。
3.3 <association>
用于映射一对一关联关系。
xml
<association property="department" javaType="Department">
<id property="id" column="dept_id"/>
<result property="name" column="dept_name"/>
</association>
property
:Java 对象的属性名。javaType
:关联对象的类型。
3.4 <collection>
用于映射一对多关联关系。
xml
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
</collection>
property
:Java 对象的属性名。ofType
:集合中元素的类型。
4. 动态 SQL 标签
4.1 <if>
用于条件判断。
xml
<select id="findUser" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
test
:判断条件(OGNL 表达式)。
4.2 <choose>
、<when>
、<otherwise>
用于多条件判断。
xml
<select id="findUser" resultType="User">
SELECT * FROM user
WHERE 1=1
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
</select>
4.3 <where>
用于动态生成 WHERE
子句,并自动处理前缀 AND
或 OR
。
xml
<select id="findUser" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
4.4 <set>
用于动态生成 SET
子句,并自动处理后缀逗号。
xml
<update id="updateUser" parameterType="User">
UPDATE user
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
4.5 <trim>
用于自定义字符串截取。
xml
<update id="updateUser" parameterType="User">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</trim>
WHERE id = #{id}
</update>
prefix
:前缀。suffixOverrides
:需要移除的后缀。
4.6 <foreach>
用于遍历集合。
xml
<select id="findUsersByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
collection
:集合属性名。item
:集合中元素的别名。open
:开始符号。separator
:分隔符。close
:结束符号。
5. 其他标签
5.1 <sql>
用于定义可重用的 SQL 片段。
xml
<sql id="userColumns">
id, name, age
</sql>
<select id="selectUser" resultType="User">
SELECT <include refid="userColumns"/> FROM user
</select>
5.2 <include>
用于引用 <sql>
标签定义的 SQL 片段。
xml
<select id="selectUser" resultType="User">
SELECT <include refid="userColumns"/> FROM user
</select>
6. 总结
MyBatis 提供了丰富的 XML 标签来定义 SQL 语句、参数映射、结果映射以及动态 SQL。常用的标签包括:
- 基本标签 :
<select>
、<insert>
、<update>
、<delete>
。 - 结果映射标签 :
<resultMap>
、<result>
、<association>
、<collection>
。 - 动态 SQL 标签 :
<if>
、<choose>
、<where>
、<set>
、<foreach>
。 - 其他标签 :
<sql>
、<include>
。
掌握这些标签的使用,可以更灵活地编写 MyBatis 的 SQL 映射文件。
7. 面试回答建议
在面试中回答这个问题时,可以按照以下思路:
- 分类介绍 MyBatis 的常用标签(基本标签、结果映射标签、动态 SQL 标签等)。
- 结合实际项目经验,举例说明如何使用这些标签。
- 强调动态 SQL 标签的优势(如
<if>
、<foreach>
等)。
这样回答既展示了你的技术深度,也体现了你对 MyBatis 的熟练使用。