Mybatis动态SQL

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,还有臭名昭著苏的SQL拼接问题。利用动态 SQL,可以彻底摆脱这种痛苦。

动态SQL标签及属性列表:

  • where:
        where标签解决了我们在之前SQL拼接问题中当传参为空时会出现“WHERE AND”情况,我们在传统的jdbc写法中为了解决这个问题,将“WHERE”改为了“WHERE 1=1”.使用where标签我们就再也不用遇到这种情况,where标签会自动检测如果它包含的标签中有返回值的话,它会自动插入where,再也不用我们去手动添加. 此外如果它包含的标签中返回内容为 AND 或者 OR 开头,则它会自动替换掉,十分方便.

     <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
             select * from student
             <where>
                 <if test="no!=null&amp;no!=''">
                     no = #{no}
                 </if>
                 <if test="name!=null&amp;name!=''">
                     name = #{name}
                 </if>
             </where>
         </select>
  • if:
        if标签通常用于WHERE语句,UPDATE语句,INSERT语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段,判断是否插入某一个字段的值

  • foreach:
        foreach标签主要用于构建in条件,可在SQL中对集合进行迭代.也常用到批量删除,添加操作中.

     <select id="findStudentlist1" resultType="com.ffyc.mybatisdemo.model.Student">
             select * from student where no in
             <foreach collection="list" item="no" open="(" separator="," close=")">
                 #{no}
             </foreach>
         </select>
  • trim:
        格式化输出,也可用来设定或忽略前后缀

     <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
             select * from student
             <trim prefix="where" prefixOverrides="and|or">
                 <if test="no!=null&amp;no!=''">
                     no = #{no}
                 </if>
                 <if test="name!=null&amp;name!=''">
                     name = #{name}
                 </if>
             </trim>
         </select>
  • collection:
        collection属性的值有三个分别为: list,array,map 对应的参数类型分别为: LIst,数组,map集合

    • item: 表示在迭代过程中每一个元素的别名

    • open: 前缀

    • close: 后缀

    • separator: 分隔符,表示迭代时每个元素之间以什么分隔

    <select id="findStudentlist1" resultType="com.ffyc.mybatisdemo.model.Student">
             select * from student where no in
             <foreach collection="list" item="no" open="(" separator="," close=")">
                 #{no}
             </foreach>
         </select>
  • choose:
        从多个选项中选择一个.按照顺序判断when中的条件是否成立,有一个成立则choose结束.当choose中所有的when都不成立时,则执行otherwise中的SQL.类似于java中的switch case default.

     <select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
             select * from student
             <trim prefix="where" prefixOverrides="and|or">
                <choose>
                 <when test="no!=null&amp;no!=''">
                     no = #{no}
                 </when>
                 <otherwise>
                     name = #{name}
                 </otherwise>
                </choose>
             </trim>
         </select>
  • set:
        没有if标签时,如果有一个参数为null,都会导致错误.当在update语句中使用if标签时,如果最后面的if没有执行,则会导致逗号多余的错误.使用SET标签可以动态的配置set关键字,和剔除追加到条件末尾的任何不相关的逗号.

    <update id="updateStudent" parameterType="Student">
             update student
             <set>
                 <if test="name!=null">
                     name = #{name},
                 </if>
                 <if test="gender!=null">
                     gender = #{gender},
                 </if>
                 <if test="no!=null">
                     no = #{no}
                 </if>
             </set>
             where id = #{id}
         </update>

我们在上述标签介绍时在xml文件中示例了每个标签及属性的使用方法,因此在此处我们只示例一个简单查询列表的测试方法:

1.接口中的方法:

 //动态SQl
      List<Student> findStudentList2(Student student);

2.mapper.xml文件:

<select id="findStudentList2" resultType="com.ffyc.mybatisdemo.model.Student" parameterType="Student">
         select * from student
         <where>
             <if test="no!=null&amp;no!=''">
                 no = #{no}
             </if>
             <if test="name!=null&amp;name!=''">
                 name = #{name}
             </if>
         </where>
  </select>

3.测试类:

 
@Test
     //动态SQL
     public void findStudentlist2() {
         SqlSession sqlSession = MybatisUtil.getSqlSession();
         StudentDao2 studentDao2 = sqlSession.getMapper(StudentDao2.class);
         Student student = new Student();
         student.setNo(103);  //此处我们动态传入no值进行查询
         List<Student> students = studentDao2.findStudentList2(student);
         System.out.println(students);
         sqlSession.close();
     }

4.运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值