Mybatis动态SQL

    Mybatis动态SQL的实现依靠的几个标签:if、(choose,when,otherwise)、foreach、where、set、trim。

1、if

    示例:

<if test=" 判断条件 ">
  执行的语句
</if>

    若满足test中的条件,则被if包裹的语句才能执行。

SELECT
  *
FROM
  student
<if test="studentName != null and studentName != ''">
  WHERE
    student_name = #{studentName}
</if>

    若studentName不为null,并且不为空字符串,则执行WHERE语句。

2、choose、when、otherwise

    示例:

<choose>
  <when test="判断条件1">
    执行的语句1
  </when>
  <when test="判断条件2">
    执行的语句2
  </when>
   ......
  <otherwise>
    执行语句
  </otherwise>
</choose>

    when标签可以有1个或多个,otherwise标签可以有0个或1个。若满足when标签中的判断条件,则执行对应的语句,执行完毕后退出choose标签。若所有when标签中的判断条件都不满足则执行otherwise中的语句。(有点类似于java中带break的switch、case、default语句)

3、foreach

    示例:

<foreach  collection="需要循环的集合"  item="变量名" open="整个循环内容开头的字符串" separator="每次循环的分隔符"  
        index="索引的属性名" close="整个循环体结束的字符串">  
  #{变量名}
</foreach>

    其中collection为必填,index不常用。该标签与JSTL中的c:forEach十分相似。

SELECT
  *
FROM
  student
WHERE
  age IN
<foreach  collection="ageList" index="index" item="age" open="(" separator="," close=")">  
  #{age}
</foreach>

    foreach标签循环完毕后为(age1,age2,age3,.....)

4、where&set

    示例:

SELECT
  *
FROM
  student
<where>
  <if test="age != null and age != ''"> 
    age = #{age}
  </if>
  <if test="name != null and name != ''">
    AND name = #{name}  
  </if>
</where>

    若将where标签替换成关键字“WHERE”,并且age为空,而name不为空也不为空字符串时,例中SQL语句则会变成            "..... WHERE AND name = #{name}",此时是会出现SQL语法错误的。

    而where标签会帮你将开头或者末尾的AND及OR删除,并且在只有一个以上的if条件满足时,才会插入“WHERE”语句。

    示例:

UPDATE
  student
<set>
  <if test="name != null and name != ''">
    name = #{name},
  </if>
  <if test="age != null and age != ''">
    age = #{age}
  </if>
</set>

    若将set标签替换成关键字“SET”,并且name不为空也不为空字符串,而age为空时,例中SQL语句则会变成   "...... SET name = #{name},",多出一个逗号,会出现SQL语法错误。

    set标签的作用与where大同小异,where标签是删除AND及OR,而set标签是删除“,”,并且只有在一个以上的if条件满足时,才会插入“SET”语句。

5、trim

    示例:

<trim prefix="前缀" prefixOverrides="前缀匹配" suffix="后缀" suffixOverrides="后缀匹配">
  ...内容...
</trim>

    prefix是在内容前添加“前缀”,prefixOverrides是匹配内容的开头,若符合匹配,则删除“前缀匹配”。suffix是在内容后添加“后缀”,suffixOverrides是匹配内容的末尾,若符合匹配,则删除“后缀匹配”。

INSERT INTO
  student
<trim prefix="(" suffix=")" suffixOverrides=",">
  <if test="age != null and age != ''">
    age,
  </if>
  <if test="name != null and name != ''">
    name,
  </if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
  <if test="age != null and age != ''">
    #{age},
  </if>
  <if test="name != null and name != ''">
    #{name},
  </if>
</trim>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值