Mybatis学习笔记——动态Sql

关于条件的判断

  • if      判断语句
  • choose (when, otherwise) 类似于switch case语句

if 和 when 都需要与test属性连用,test为具体判断逻辑



  • 在判断之前都加1=1的原因是:如果不加1=1,当断语句返回false时,后面判断部分的sql为空,这样整体sql语句就变成了xxx where,因而会出错
  • 可以通过使用where或trim元素去掉1=1这样的语句

对sql语句进行相关修饰的元素(where,set,trim)

where

<select id="user" parameterType="user" resultType="User">
        select * from user 
          <where>
            <if test="id!=null and id!=''">
              id=#{id}
            </if>
            <if test="name!=null and name!=''">
              and name=#{name}
            </if>
            <if test="gender!=null and gender!=''">
              and gender=#{gender}
            </if>
          </where>
       </select>

where元素的作用是:描述sql中的where条件部分,当where条件为空时,此时where语句为空(不出现where关键字);当where条件不为空时,它可以忽略where条件部分首个AND或OR

set

 <update id="userUpdate" parameterType="user">
      update user 
        <set>
          <if test="id!=null and id!=''">
            id=#{id},
          </if>
          <if test="name!=null and name!=''">
            name=#{name},
          </if>
          <if test="gender!=null and gender!=''">
            gender=#{gender},
          </if>
        </set>
</update>

set元素的作用:描述update语句中的set部分,可以或略掉最后一个逗号

trim

包含的属性:

  • prefix:前缀
  • suffix:后缀
  • prefixOverrides:忽略第一个指定分隔符
  • suffixOverrides:忽略最后一个指定分隔符
//与上面等同的where例子
<select id="user" parameterType="user" resultType="User">
      select * from user 
        <trim prefix="WHERE" prefixoverride="and | or">
          <if test="id!=null and id!=''">
            id=#{id}
          </if>
          <if test="name!=null and name!=''">
            and name=#{name}
          </if>
          <if test="gender!=null and gender!=''">
            and gender=#{gender}
          </if>
       </trim>
    </select>

//与上面等同的set例子

<update>
    update user 
      <trim prefix="set" suffixoverride=",">
        <if test="id!=null and id!=''">
          id=#{id},
        </if>
        <if test="name!=null and name!=''">
          name=#{name},
        </if>
        <if test="gender!=null and gender!=''">
          gender=#{gender}
        </if>
        </trim>
  </update>

foreach

循环语句,接收的类型是:list、set、map、数组等

参数:

  • collection , 要进行迭代的元素
  • index  为索引定义一个名字,表示每次迭代到的位置(map为其key)
  • item   当前迭代到的元素别名
  • open  循环区间对应的sql语句部分的前面加上的字符串(以什么开始)
  • close 循环区间对应的sql语句部分的后面加上的字符串(以什么结束)
  • separate 循环内容以什么分隔
(1)批量插入
<insert id="add" parameterType="List">
      insert into user(id,name,gender) values
        <foreach collection="list" item="user" separator=",">
          (#{user.id},#{user.name},#{user.gender})
        </foreach>
</insert>

(2)批量删除

<delete id="deleteUser" parameterType="array">
        delete from user where id in
          <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
          </foreach>
</delete>

注意:如果集合为空,sql语句会出问题,因此需要在业务层进行判断集合是否为空

bind元素

用于定义上下文变量




猜你喜欢

转载自blog.csdn.net/long798266215/article/details/79438906