Mapper 映射文件中常用的标签主要包括 SQL 定义、结果映射、动态 SQL 等。
基本标签:<select>, <insert>, <update>, <delete>
结果映射标签:<resultMap>, <id>, <result>, <association>, <collection>
动态 SQL 标签:<if>, <choose>, <when>, <otherwise>, <trim>, <where>, <set>, <foreach>
其他标签:<sql>, <include>
1. 基本标签
1.1 <select>
- 作用:用于查询数据,并将查询结果映射到 Java 对象或集合中。
属性:
id
:方法名,Java 代码中调用接口时对应的方法名。resultType
:返回的数据类型,可以是实体类、集合等。parameterType
:传递的参数类型,通常为 Java 类或基础类型。resultMap
:用于指定结果映射关系,代替resultType
时使用。
示例:
<select id="selectUserById" parameterType="int" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select>
1.2 <insert>
- 作用:用于插入数据到数据库中。
属性
id
:方法名。parameterType
:传递的参数类型。useGeneratedKeys
和keyProperty
:用于获取数据库生成的主键值。
示例:
<insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert>
1.3 <update>
- 作用:用于更新数据库中的数据。
属性:
id
:方法名。parameterType
:传递的参数类型。
示例:
<update id="updateUser" parameterType="com.example.User"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update>
1.4 <delete>
- 作用:用于删除数据库中的数据。
属性:
id
:方法名。parameterType
:传递的参数类型。
示例:
<delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete>
2. 结果映射标签
2.1 <resultMap>
- 作用:用于定义复杂结果集的映射,将数据库表中的字段映射到 Java 对象的属性上。
常用子标签:
<id>
:表示主键字段的映射。<result>
:表示普通字段的映射。<association>
:表示一对一关系映射。<collection>
:表示一对多关系映射。
示例:
<resultMap id="userResultMap" type="com.example.User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <association property="address" javaType="com.example.Address" column="address_id" select="selectAddressById"/> </resultMap>
3. 动态 SQL 标签
动态 SQL 标签是 MyBatis 的强大功能之一,允许通过逻辑控制来动态拼接 SQL 语句。以下是常用动态 SQL 标签的详细介绍:
3.1 <if>
- 作用:根据条件判断是否生成 SQL 片段。
属性:
test
:判断条件。
示例:
<select id="selectUser" parameterType="map" resultType="com.example.User"> SELECT * FROM users <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
3.2 <choose>
、<when>
、<otherwise>
- 作用:类似于 Java 中的
switch
语句,用于条件判断。 示例:
<select id="selectUserByStatus" parameterType="map" resultType="com.example.User"> SELECT * FROM users <where> <choose> <when test="status == 'ACTIVE'"> AND status = 'ACTIVE' </when> <when test="status == 'INACTIVE'"> AND status = 'INACTIVE' </when> <otherwise> AND status IS NOT NULL </otherwise> </choose> </where> </select>
3.3 <trim>
、<where>
、<set>
<trim>
:用于定制去除多余的符号(如逗号、AND 等)或添加特定的前后缀。
属性:
prefix
:添加的前缀,如SET
、WHERE
。suffix
:添加的后缀。suffixOverrides
:去除的后缀符号,如多余的逗号。
示例:
<update id="updateUser"> UPDATE users <trim prefix="SET" suffixOverrides=","> <if test="name != null"> name = #{name}, </if> <if test="age != null"> age = #{age}, </if> <if test="email != null"> email = #{email}, </if> </trim> WHERE id = #{id} </update>
<where>
:自动加上 WHERE 关键字,并去除前后多余的 AND 或 OR。示例:
<select id="selectUserWithConditions" parameterType="map" resultType="com.example.User"> SELECT * FROM users <where> <if test="name != null"> name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select>
<set>
:用于 UPDATE语句中,自动添加 SET 关键字并去除多余的逗号。示例:
<update id="updateUserSelective" parameterType="com.example.User"> UPDATE users <set> <if test="name != null"> name = #{name}, </if> <if test="age != null"> age = #{age}, </if> </set> WHERE id = #{id} </update>
3.4 <foreach>
- 作用:用于遍历集合,如
List
、Array
等,以生成动态的 SQL 语句,常用于IN
查询或者批量插入等。 属性:
collection
:集合名称。item
:每次迭代的元素名称。index
:每次迭代的索引。open
、close
、separator
:用于指定生成的 SQL 片段的开头、结尾和分隔符。
示例:
<select id="selectUsersByIds" parameterType="list" resultType="com.example.User"> SELECT * FROM users WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </select>
4. 其他标签
4.1 <sql>
和 <include>
- 作用:用于定义可重用的 SQL 片段,避免重复代码。
<sql>
:定义一个可重用的 SQL 片段。<include>
:引用前面定义的 SQL 片段。示例:
<sql id="userColumns"> id, name, age, address </sql> <select id="selectAllUsers" resultType="com.example.User"> SELECT <include refid="userColumns"/> FROM users </select>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。