<select> 标签

  • 功能:定义 SQL 查询语句。
  • 常用属性
    • id:必须,定义该查询的唯一标识符。
    • parameterType:可选,定义输入参数的类型,可以是类的全限定名或别名。
    • resultType:可选,定义查询结果的类型,可以是类的全限定名或别名。
    • resultMap:可选,引用定义好的结果映射。
    • flushCache:可选,默认为 false,设置为 true 时,在执行该查询时会清空一级缓存。
    • timeout:可选,设置 SQL 语句的超时时间。
    • fetchSize:可选,设置查询结果的抓取大小。
    • statementType:可选,设置语句的类型,可以是 STATEMENTPREPAREDCALLABLE,默认为 PREPARED
1
2
3
<select id="selectUser" parameterType="int" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>

<insert> 标签

  • 功能:定义 SQL 插入语句。
  • 常用属性
    • id:必须,定义该插入的唯一标识符。
    • parameterType:可选,定义输入参数的类型,可以是类的全限定名或别名。
    • useGeneratedKeys:可选,默认为 false,设置为 true 时,会使用数据库生成的键。
    • keyProperty:可选,定义接受数据库生成的键的属性。
    • keyColumn:可选,定义数据库生成的键对应的列。
1
2
3
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

<update> 标签

  • 功能:定义 SQL 更新语句。
  • 常用属性
    • id:必须,定义该更新的唯一标识符。
    • parameterType:可选,定义输入参数的类型,可以是类的全限定名或别名。
    • flushCache:可选,默认为 true,执行更新操作后会清空一级缓存。
1
2
3
<update id="updateUser" parameterType="User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

<delete> 标签

  • 功能:定义 SQL 删除语句。
  • 常用属性
    • id:必须,定义该删除的唯一标识符。
    • parameterType:可选,定义输入参数的类型,可以是类的全限定名或别名。
    • flushCache:可选,默认为 true,执行删除操作后会清空一级缓存。
1
2
3
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>

<resultMap> 标签

  • 功能:定义结果映射,将查询结果映射到 Java 对象。

  • 常用属性

    • id:必须,定义结果映射的唯一标识符。
    • type:必须,定义结果映射的目标 Java 类型。
  • 子标签

    • <id>:用于标识主键字段。
    • <result>:用于标识普通字段。
    • <association>:用于映射一个一对一的关系。
    • <collection>:用于映射一个一对多的关系。
    • <constructor>:用于映射构造器参数。
1
2
3
4
5
6
7
8
9
<resultMap id="UserResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>

<select id="selectUser" parameterType="int" resultMap="UserResultMap">
SELECT * FROM users WHERE id = #{id}
</select>

<sql> 标签

  • 功能:定义可重用的 SQL 片段。
  • 常用属性
    • id:必须,定义该 SQL 片段的唯一标识符。
1
2
3
<sql id="userColumns">
id, name, age
</sql>

<include> 标签

  • 功能:引用 <sql> 标签定义的 SQL 片段。
  • 常用属性
    • refid:必须,引用 <sql> 标签的 id 属性。
1
2
3
<select id="selectUsers" resultType="User">
SELECT <include refid="userColumns"/> FROM users
</select>

动态 SQL 标签

<if> 标签

  • 功能:条件性地包含 SQL 语句片段。
  • 常用属性
    • test:必须,定义一个测试表达式,如果为 true,则包含标签内的内容。
1
2
3
4
5
6
7
<select id="selectUsersByCondition" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>

<choose><when><otherwise> 标签

  • 功能:类似于 Java 中的 switch 语句,进行条件选择。
  • 常用属性
    • <when>:必须,包含 test 属性,用于定义测试表达式。
    • <otherwise>:可选,当所有 <when> 都不匹配时执行。
1
2
3
4
5
6
7
8
9
10
<select id="selectUsersByCondition" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">AND name = #{name}</when>
<when test="age != null">AND age = #{age}</when>
<otherwise>AND 1 = 1</otherwise>
</choose>
</where>
</select>

<foreach> 标签

  • 功能:用于遍历集合,以生成动态 SQL。
  • 常用属性
    • item:必须,定义集合中每个元素的别名。
    • index:可选,定义集合中每个元素的索引。
    • collection:必须,定义要遍历的集合。
    • open:可选,定义遍历生成的 SQL 的起始字符串。
    • separator:可选,定义每个元素之间的分隔符。
    • close:可选,定义遍历生成的 SQL 的结束字符串。
1
2
3
4
5
6
<select id="selectUsersByIds" parameterType="list" resultType="User">
SELECT * FROM users WHERE id IN
<foreach item="id" index="index" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>

<trim><where><set> 标签

  • 功能:用于动态地生成 SQL 语句。
  • 常用属性
    • <trim>:用于在 SQL 片段中添加前缀或后缀,并删除多余的前缀或后缀。
      • prefix:可选,定义在生成的 SQL 语句前添加的字符串。
      • suffix:可选,定义在生成的 SQL 语句后添加的字符串。
      • prefixOverrides:可选,定义需要删除的多余前缀。
      • suffixOverrides:可选,定义需要删除的多余后缀。
1
2
3
4
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</trim>
  • ****:自动在内容前添加 WHERE 关键字,如果内容不为空,并删除多余的 AND 或 OR。

    1
    2
    3
    4
    <where>
    <if test="name != null">AND name = #{name}</if>
    <if test="age != null">AND age = #{age}</if>
    </where>
  • ****:自动在内容前添加 SET 关键字,并删除多余的逗号。

    1
    2
    3
    4
    5
    6
    7
    8
    <update id="updateUser" parameterType="User">
    UPDATE users
    <set>
    <if test="name != null">name = #{name},</if>
    <if test="age != null">age = #{age},</if>
    </set>
    WHERE id = #{id}
    </update>

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<mapper namespace="com.example.mapper.UserMapper">
<sql id="baseColumns">
id, name, age
</sql>

<resultMap id="UserResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>

<select id="selectUser" parameterType="int" resultMap="UserResultMap">
SELECT <include refid="baseColumns"/> FROM users WHERE id = #{id}
</select>

<select id="selectUsersByCondition" parameterType="map" resultType="User">
SELECT <include refid="baseColumns"/> FROM users
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
</select>

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>

<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>

<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>

通过合理使用这些标签,MyBatis 可以实现非常灵活和强大的 SQL 生成和映射功能。如果有任何具体问题或需要进一步的示例,请随时告诉我。