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:传递的参数类型。
    • useGeneratedKeyskeyProperty:用于获取数据库生成的主键值。
  • 示例:

    <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:添加的前缀,如 SETWHERE
      • 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>

  • 作用:用于遍历集合,如 ListArray 等,以生成动态的 SQL 语句,常用于 IN 查询或者批量插入等。
  • 属性:

    • collection:集合名称。
    • item:每次迭代的元素名称。
    • index:每次迭代的索引。
    • opencloseseparator:用于指定生成的 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>

无聊的企鹅
3 声望0 粉丝