动态的拼接SQL

if标签

if标签可通过test属性(即传递过来的数据)的表达式进行判断。
就是if成立,就拼接这段sql。
test里面用andor表达逻辑

  1. <!--List<Emp> getEmpByCondition(Emp emp);-->
  2. <select id="getEmpByCondition" resultType="Emp">
  3. select * from t_emp where 1=1
  4. <if test="empName != null and empName !=''">
  5. and emp_name = #{empName}
  6. </if>
  7. <if test="age != null and age !=''">
  8. and age = #{age}
  9. </if>
  10. <if test="sex != null and sex !=''">
  11. and sex = #{sex}
  12. </if>
  13. <if test="email != null and email !=''">
  14. and email = #{email}
  15. </if>
  16. </select>

where标签

  • where和if一般结合使用:
  • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
  • 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and/or去掉 。不去掉最后面的and/or。所以and/or要写在最前面。

    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select * from t_emp
    4. <where>
    5. <if test="empName != null and empName !=''">
    6. emp_name = #{empName}
    7. </if>
    8. <if test="age != null and age !=''">
    9. and age = #{age}
    10. </if>
    11. <if test="sex != null and sex !=''">
    12. and sex = #{sex}
    13. </if>
    14. <if test="email != null and email !=''">
    15. and email = #{email}
    16. </if>
    17. </where>
    18. </select>

    trim标签

  • trim用于去掉或添加标签中的内容

  • 常用属性:
    • prefix:在trim标签中的内容的前面添加某些内容
    • suffix:在trim标签中的内容的后面添加某些内容
    • prefixOverrides:在trim标签中的内容的前面去掉某些内容,可以用|表示或
    • suffixOverrides:在trim标签中的内容的后面去掉某些内容
  • 用了trim标签,if里面条件片段,and/or写在前后都可以,升级版的where标签
  • 若trim中的标签都不满足条件,则trim标签没有任何效果,也就是只剩下select * from t_emp

    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByCondition" resultType="Emp">
    3. select * from t_emp
    4. <trim prefix="where" suffixOverrides="and|or">
    5. <if test="empName != null and empName !=''">
    6. emp_name = #{empName} and
    7. </if>
    8. <if test="age != null and age !=''">
    9. age = #{age} and
    10. </if>
    11. <if test="sex != null and sex !=''">
    12. sex = #{sex} or
    13. </if>
    14. <if test="email != null and email !=''">
    15. email = #{email}
    16. </if>
    17. </trim>
    18. </select>

    choose、when、otherwise标签

    类似switchcase:break;,default
    when至少要有一个,otherwise至多只有一个。
    这里choose里面只能选择一个,所以不用加and/or关键字

    1. <!--List<Emp> getEmpByCondition(Emp emp);-->
    2. <select id="getEmpByChoose" resultType="Emp">
    3. select * from t_emp
    4. <where>
    5. <choose>
    6. <when test="empName != null and empName != ''">
    7. emp_name = #{empName}
    8. </when>
    9. <when test="age != null and age != ''">
    10. age = #{age}
    11. </when>
    12. <when test="sex != null and sex != ''">
    13. sex = #{sex}
    14. </when>
    15. <when test="email != null and email != ''">
    16. email = #{email}
    17. </when>
    18. <otherwise>
    19. did = 1
    20. </otherwise>
    21. </choose>
    22. </where>
    23. </select>

    foreach标签

  • 属性:

    • collection:设置要循环的数组或集合
    • item:表示集合或数组中的每一个数据
    • separator:设置循环体之间的分隔符,分隔符前后默认有一个空格,如, `` or
    • open:设置foreach标签中的内容的开始符
    • close:设置foreach标签中的内容的结束符
      1. <!--int deleteMoreByArray(@Param("eids") Integer[] eids);-->
      2. <delete id="deleteMoreByArray">
      3. delete from t_emp where eid in
      4. <foreach collection="eids" item="eid" separator="," open="(" close=")">
      5. #{eid}
      6. </foreach>
      7. </delete>
      1. <!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
      2. <insert id="insertMoreByList">
      3. insert into t_emp values
      4. <foreach collection="emps" item="emp" separator=",">
      5. (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
      6. </foreach>
      7. </insert>

      SQL片段

  • sql片段,可以记录一段公共sql片段,在使用的地方通过include标签进行引入

  • 声明sql片段:<sql>标签 ```xmleid,emp_name,age,sex,email

```