<!--
        4.1.1 在WHERE条件中使用if

            需求:
                实现一个用户管理高级查询功能,根据输入的条件去检索用户信息。这个功能
                还需要支持以下三种情况:当只有输入用户名时,需要根据用户名进行模糊查
                询;当只有输入邮箱时,根据邮箱进行完全匹配;当同时输入用户名与邮箱时
                用这两个条件去查询匹配的用户。

            <if>便签有一个必填的属性test,test的属性值是一个符合OGNL要求的判断表达式,
            表达式的结果可以是true或者false,初次之外所有的的非0值都为true,只有0为false。
            且有如下规则:
                1.判断条件property!=null或者property==null:适用于任何类型的字段,用于判断属性值是否为空
                2.判断条件property!=''或者property=='':仅适用于String类型的字段,用于判断是否为空字符串
                3.and和or:当有多个判断条件时,适用and或or进行连接,嵌套的判断可以适用小括号分组。
    -->

    <!--不能满足需求的代码,标记下模糊匹配的写法-->
    <select id="selectByUser" resultType="tk.mybatis.simple.model.SysUser">
      select
        id,
        use_name userName,
        user_password userPassword,
        user_email userEmail,
        user_info userInfo,
        head_img headImg,
        create_time createTime
      from sys_user
      where
        user_name like concat('%',#{userName},'%') and
        uer_email=#{userEmail}
    </select>

    <!--改进后的代码-->
    <select id="selectByUser" resultType="tk.mybatis.simple.model.SysUser">
      select
        id,
        use_name userName,
        user_password userPassword,
        user_email userEmail,
        user_info userInfo,
        head_img headImg,
        create_time createTime
      from sys_user
      where
        1=1
        <if test="userName!=null and userName!=''">
                and user_name like concat('%',#{userName},'%')
        </if>
        <if test="userEmail!=null and userEmail!=''">
                and user_email = #{userEmail}
        </if>
    </select>

    <!--
        4.1.3 在UPDATE更新列中使用if

            需求:
                只更新有变化的字段,需要注意,更新的时候不能将原来的值
                但没有发生变化的字段更新为空或null。
    -->

    <!--需求实现的代码-->
    <update id="updateByIdSelective">
        update sys_user
        set
          <if test="userName!=null and userName!=''">
                  user_name=#{userName},
          </if>
          <if test="userEmail!=null and userEmail!=''">
                  user_email=#{userEmail},
          </if>
          <if test="userInfo!=null and userInfo!=''">
                  user_info=#{userInfo},
          </if>
          <if test="headImg!=null">
                  head_img=#{headImg},
          </if>
          <if test="createTime!=null">
                  create_time=#{createTime},
          </if>
          id=#{id}
        where id=#{id}
    </update>

    <!--
        4.1.3 在INSERT动态插入列中使用if

            需求:
                在数据库中插入数据的时候,如果某一列的参数值不为空,就使用传入的值,如果传入
                的参数为空,就使用数据库中的默认值(通常是空),而不使用传入的空值。
    -->

    <insert id="insert2" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO sys_user
          (id,user_name,user_password,
          <if test="userEmail!=null and uerEmail!=''">
              user_email,
          </if>
          user_info,head_img,create_time)
        VALUES
          (#{id},#{userName},#{userPassword},
          <if test="userEmail!=null and uerEmail!=''">
              #{userEmail},
          </if>
          #{userInfo},#{headImg,jdbcType=BLOB},#{createTime,jdbcType=TIMESTAMP})
    </insert>

From《MyBatis从入门到精通》

MyBatis if标签的用法的更多相关文章

  1. MyBatis bind标签的用法

    From<MyBatis从入门到精通> <!-- 4.5 bind用法 bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中. 需求: concat函数连接字符串,在M ...

  2. MyBatis foreach标签的用法

    From<MyBatis从入门到精通> 一.foreach实现in集合 1.映射文件中添加的代码: <!-- 4.4 foreach用法 SQL语句有时会使用IN关键字,例如id i ...

  3. MyBatis select标签的用法

    From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...

  4. mybatis001-动态标签Trim用法

    Mybatis动态标签Trim用法 一.<trim></trim>标签用法 示例一: select * from user <trim prefix="WHER ...

  5. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  6. SpringMVC +mybatis+spring 结合easyui用法及常见问题总结

    SpringMVC +mybatis+spring 结合easyui用法及常见问题总结 1.FormatString的用法. 2.用postAjaxFillGrid实现dataGrid 把form表单 ...

  7. Mybatis foreach标签含义

    背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...

  8. Java-MyBatis-杂项: MyBatis 中 in 的用法2

    ylbtech-Java-MyBatis-杂项: MyBatis 中 in 的用法2 1.返回顶部 1. 一.简介 在SQL语法中如果我们想使用in的话直接可以像如下一样使用: select * fr ...

  9. Java-MyBatis:MyBatis 中 in 的用法

    ylbtech-Java-MyBatis-杂项:MyBatis  中  in 的用法 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元 ...

随机推荐

  1. AFN小结(简单的封装)

    AFN小结 1,AFN概念.原理 2,AFN的封装使用 3,AFN与其它框架对比 ————————————————————————————————— 1 , AFN的概念原理: AFN的基础是NSUR ...

  2. System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

    今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0 ...

  3. Windows 10 UWP 部署

      原文  http://youthlin.com/20151105.html 我们知道VS连接手机可以直接部署到手机里,但平板貌似无法这样干,平板与电脑连接没有丝毫反应……那么想看VS里写的uwp应 ...

  4. 社会不是承认有学历的人, 而是承认努力过得人, 而且是真正努力过不是穷忙的人(没有学历就要多付出一倍的努力)good

    送你一句 这就是你水平差的理由? 楼主你工资低是因为你技术不行, 不想努力然后怪罪学历, 为什么学历高的混得好, 因为学历高的人努力过, 你没学历技术还不行, 凭什么证明你努力过, 社会不是承认有学历 ...

  5. 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式

    冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更高效的排序方法. 这里的实现的冒泡排序,需实现功能: 不仅数字排序,还要对任意对象排序 示例: 对People对象的 ...

  6. 项目集成dubbo

    dubbo 用户指南: http://dubbo.io/User+Guide-zh.htm 开发指南:http://dubbo.io/Developer+Guide-zh.htm#DeveloperG ...

  7. Ural_1169_Pairs

    此题略坑... 思路:把N个点分成m若干个联通子图,然后用m-1个桥把这m个联通子图连接起来即可. 若每个联通子图内部都是完全图也符合题意,但答案却是Wrong Answer,只有把每个联通子图内部当 ...

  8. C语言实现常用数据结构——二叉树

    #include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...

  9. java多线程之管道流

    java语言中提供了各种各样的流供我们操纵数据,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据. 一个线程发送数据到输出管道,另一个线程从输入管道读取数据,通过使用管道 ...

  10. 智能小程序关于Filter过滤器的简单使用

    <filter module="swan"> export default { imgurl: (imgUrl) => { var imgurlprefix = ...