MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 允许开发者直接编写原生 SQL 查询,并通过参数映射功能,使得数据库操作更加灵活和强大。在处理动态 SQL 时,MyBatis 提供了多种元素和特性来帮助开发者构建灵活的 SQL 语句。

标签

标签是最常用的动态 SQL 元素之一,它可以根据条件包含或排除 SQL 语句的一部分。

<select id="findActiveUsers" resultType="User">
  SELECT * FROM users
  WHERE status = 'ACTIVE'
  <if test="name != null">
    AND name = #{name}
  </if>
</select>

, , 标签

<select id="findUserByStatus" resultType="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 = 'PENDING'
      </otherwise>
    </choose>
  </where>
</select>

标签

当需要处理集合(如 List 或数组)时, 标签非常有用。它可以用来生成 IN 子句。

<select id="findUsersByIds" resultType="User">
  SELECT * FROM users
  WHERE id IN
  <foreach item="id" collection="list" open="(" separator="," close=")">
    #{id}
  </foreach>
</select>

批量插入

<insert id="insertUsers" parameterType="list">
  INSERT INTO users (name, email)
  VALUES 
  <foreach collection="list" item="user" separator=",">
    (#{user.name}, #{user.email})
  </foreach>
</insert>

标签优化 SQL 结构

使用 自动添加 WHERE 关键词,并处理多余的前导 AND

<select id="findUserByName" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="email != null">
      AND email = #{email}
    </if>
  </where>
</select>

使用 在更新操作中自动添加 SET 关键词,并处理多余的前导逗号

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

注意: #{}用来作为预编译SQL语句的占位符。这意味着MyBatis会将你传入的参数设置为PreparedStatement的参数,从而防止SQL注入攻击,并允许MyBatis对传入的数据进行适当的类型转换。 $()用于直接在SQL语句中插入内容,它不会被当作预编译参数处理,而是直接替换掉${}及其内部的内容。这可能导致SQL注入风险,特别是在使用用户输入时。