Mybatis的Mapper映射文件中常用标签及作用


1.<mapper>标签

主要用于定义 Mapper 接口的映射文件。通常包含命名空间(namespace),该命名空间通常是接口的全限定类名。

 <mapper namespace="com.example.demo.mapper.UserMapper">

2.<insert>标签

用于定义插入语句,对应于 Mapper 接口中带有 @Insert 注解的方法。

   <insert id="insertUser" parameterType="com.example.demo.entity.User">
     INSERT INTO user (name, age) VALUES (#{name}, #{age})
   </insert>

其中id对应mapper层的方法名,parameterType对应传入的参数类型

3.<update>标签

用于定义更新语句,对应于 Mapper 接口中带有 @Update 注解的方法。

   <update id="updateUser" parameterType="com.example.demo.entity.User">
     UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
   </update>

4.<delete>标签

用于定义删除语句,对应于 Mapper 接口中带有 @Delete 注解的方法。

   <delete id="deleteUserById" parameterType="int">
     DELETE FROM user WHERE id = #{id}
   </delete>

注意在使用<delete>和<updatev标签是需要使用where关键字或者<where>标签加入筛选条件,否则会影响整张表的字段

5.<select>标签

用于定义查询语句,对应于 Mapper 接口中带有 @Select 注解的方法。

   <select id="selectUserById" resultType="com.example.demo.entity.User">
     SELECT * FROM user WHERE id = #{id}
   </select>

其中resultType对应返回值的接收参数的类型。
注意:如果返回多个数据,需要使用List集合接收,否则会报错

6.<resultMap>标签

对于复杂的映射关系,尤其是数据库表和对象模型不完全一致时。可以使用<resultMap>定义一对一或一对多的关系。效果和在查询时给数据库中的字段起别名的效果是一样的,主要是用于将数据库字段与对象属性进行一对一映射的

<resultMap id="userResultMap" type="com.example.demo.entity.User">
     <id property="id" column="user_id"/>
     <result property="name" column="username"/>
     <result property="age" column="user_age"/>
   </resultMap>

7.<if>标签

主要用于增删改查四大标签中指定条件使用,主要用于解决同一条查询中可以存在为空的字段查询导致查找结果异常的问题。

<if test="productKey != null and productKey != ''">
    and product_id = #{productKey}
</if>
<if test="functionName != null and functionName != ''">
    and function_name like concat('%',#{functionName},'%')
</if>
<if test="alertRuleName != null and !alertRuleName.isBlanck()">
    and alert_rule_name like concat('%',#{alertRuleName},'%')
</if>

8.<where>标签

主要用于解决在使用<if>标签是参数全为空导致使用where关键字后面需要拼接 1=1 条件的情况。在使用<where>标签后,会在标签内为空的情况下自动删除该标签,可以自动优化多余的and连接词。

<where>
    <if test="productKey != null and productKey != ''">
       and product_id = #{productKey}
    </if>
    <if test="functionName != null and functionName != ''">
       and function_name like concat('%',#{functionName},'%')
    </if>
    <if test="alertRuleName != null and alertRuleName != ''">
       and alert_rule_name like concat('%',#{alertRuleName},'%')
     </if>
</where>

9.<set>标签

与<where>标签同理,主要用于解决<update>标签出现的可能修改参数全为空的情况,,可以自动优化多余的,连接符

 <update id="updateUser" parameterType="com.example.demo.entity.User">
     <set>
       <if test="name != null">name=#{name},</if>
       <if test="age != null">age=#{age},</if>
     </set>
     WHERE id=#{id}
   </update>

10.<parameter>

用于定义参数类型和参数映射。虽然 <insert>、<update> 和 <delete> 标签本身可以定义参数类型,但<parameter> 标签提供了更细粒度的控制。

   <update id="updateUser" parameterType="com.example.demo.entity.User">
     <set>
       <if test="name != null">name=#{name},</if>
       <if test="age != null">age=#{age},</if>
     </set>
     WHERE id=#{id}
   </update>

11.<sql>和<include>标签

主要用于引用其他 SQL 片段,避免重复编写相同的 SQL 代码。

   <sql id="userColumns">name, age</sql>

   <select id="selectUserById" resultType="com.example.demo.entity.User">
     SELECT <include refid="userColumns"/> FROM user WHERE id = #{id}
   </select>

12.<choose>、<when>、<otherwise>标签

用于条件判断,使得 SQL 更加灵活。

  <select id="selectUsersByCondition" resultType="com.example.demo.entity.User">
    SELECT * FROM user WHERE
    <choose>
      <when test="name != null">
        name LIKE '%${name}%'
      </when>
      <when test="age != null">
        age = #{age}
      </when>
      <otherwise>
        1=1
      </otherwise>
    </choose>
  </select>

13.<foreach>标签

用于遍历集合或数组,常用于批量操作或多条件查询。

    <select id="selectUsersByIds" resultType="com.example.demo.entity.User">
      SELECT * FROM user WHERE id IN
      <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
      </foreach>
    </select>

主要item的值就是mapper层方法对于的属性名或者使用@Param注解指定的值

14.<cache>标签

用于定义缓存策略,可以显著提高查询性能。通过使用缓存,可以避免频繁地执行相同的查询操作,从而减少数据库的负担。

<mapper namespace="com.example.demo.mapper.UserMapper">
  <cache/>
  
  <!-- 其他 SQL 映射 -->
</mapper>

type:指定缓存实现的类型,默认为 PERPETUAL(永久缓存)。常见的类型有:
PERPETUAL:永久缓存。
LRU:最近最少使用的缓存。
FIFO:先进先出缓存。
SOFT:软引用缓存。
WEAK:弱引用缓存。
eviction:缓存驱逐策略,默认为 LRU。常见的驱逐策略有:
LRU:最近最少使用的缓存。
FIFO:先进先出缓存。
flushInterval:缓存刷新间隔,单位为毫秒,默认为 0(不自动刷新)。
size:引用表的大小,默认为 1024。
readOnly:是否只读,默认为 false。设置为 true 表示缓存的数据被认为是只读的,因此不会被更新。
blocking:是否阻塞,默认为 false。设置为 true 表示等待缓存加载完成再返回结果。

15.<bind>标签

用于定义变量绑定,可以在 SQL 中使用变量。

    <select id="selectUserById" resultType="com.example.demo.entity.User">
      <bind name="userId" value="'U_' + id"/>
      SELECT * FROM user WHERE id = #{userId}
    </select>

还有一些不常用的标签我就不一一举例了·········