• Mybatis系列---动态SQL


    问题: 什么是动态SQL? 动态SQL有什么作用?

      传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是为了解决这种问题,

      其通过 if, choose, when, otherwise, trim, where, set, foreach,可组合成非常灵活的SQL语句,从而提高开发人员的效率。

      下述可知道select、insert、update、delete四个操作节点中的标签都是差不多是一样的,insert和update中多了一个selectKey节点(后面会详细的说到),下面介绍一下这些节点的用法:(下述4个标签是<mapper/>节点的子节点)

     

     

    1. if:   判断

    在mybatis中也能用 if :(if标签没有属性)

    if节点的test属性是取的参数对象中的成员变量名

    1、编写数据访问接口(要创建实体类的哟,这里就不截图了)

    2、映射文件中编写:

    3、编写测试类:

    上面例子: 如果传入的managerAccount 不为空, 那么SQL才拼接managerAccount = #{managerAccount}

    下面的代码是要么提供managerAccount 要么提供managerName查询

      <if test="managerAccount != null">
      managerAccount=#{managerAccount}
      </if>
      <if test="managerName != null">
      managerName=#{managerName}
      </if>

    那如果我要两个条件都提供才能查询呢?这个时候就可以用and符号来进行拼接:

      <if test="managerAccount ! =null">
       managerAccount=#{managerAccount}
      </if>
      <if test="managerName ! =null">
      and managerName=#{managerName}
      </if>

    如果managerAccount不等于空的时候才会执行managerName,如果managerAccount等于空就不会执行managerName,就不能实现需要两个条件才能查询同样单个给定条件也不能查询了。

    这个时候就有问题,那传过去的参数为空怎么办?

    这时候,mybatis的 where 标签的作用就来了

    2、where(where标签没有属性)

    这个<where/>标签就告诉我们说看我们的连接运算符,当然你也可以用or'连接,如果查询条件managerAccount是第一个那就会把managerName前面的and符号去掉(去掉之后语句为:select managerAccount,password,managerName from tb_Manager  where managerAccount=字段值 and managerName=字段值,因为where后面是不能跟and或者or的),如果查询managerName为第一个那么就会把managerAccount前面的and符号就会去掉。那就可以实现我给两个条件也可以查询,给一个条件也可以查询。如果一个条件都不给,那sql语句中条件关键字where就没有,就会直接执行“ select managerAccount,password,managerName from tb_Manager ” 这条语句。从表面上来看,就是多了个where标签而已, 不过实质上, mybatis是对它做了处理,当它遇到AND或者OR这些,它知道怎么处理。

     <where/>标签的作用

    1、在使用where标签时,如果没有给条件,SQL语句中的条件关键字where就没有。
    2、如果该节点中有条件,则在SQL语句后加上where关键字,以组装条件sql语句
    3、在编写条件时,如果有多个的话,多个之间的逻辑运算符一定写在条件的前面,这个标签在执行时,会去掉第一个条件前面的逻辑运算符。

     3、 foreach: 

    java中有for, 可通过for循环, 同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。

     大家应该I都知道查询主键的sql语句是:select * from 表名 where 字段名 in (字段名的值);

     

     foreach标签有6个属性:

      collection:表示集合
      close:表示结束符
      index:表示次序
      item:表示集合中的一项
      open:表示开始符
      separator:表示各项的分隔符

    1、在映射文件中编写:我写的语句是通过账号查询,你也可以换成其它字段名验证。

    上述 collection=“list” 里面的list,是需要到你写的实体中去添加list这个实体,如下图:

    tem="it"  表示你这个集合中的某一项,就是命名。

    open="(" :表示你开始的符号为“(”。

    separator="," 表示各项的分隔符为“,”。

    close=")":表示你结束的符号为“)”

    就是拼接sql语句,执行拼接出来的语句是select * from tb_manager where managerAccount in (字段名/主键值,字段名/主键值,.........);

    将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。

    2、编写测试类:

    4、bind标签

    bind标签属性
    name属性:表示绑定之后要使用的名称。相当于创建了一个变量,变量名由name属性给出。
    value属性:表示绑定时的值
    bind标签可以看成是定义一个变量,变量的名称由name属性指定,变量的值由value属性指定
    该标签没有子标签
    应用场景:使用用户名进行模糊查询
    模糊查询,在SQL中的通配符:
    %:表示匹配任意多个字符
    ?:表示匹配0个或1个字符
    查询用户名中包涵“o”字母的用户: %o%
    select * from tb_user where managerAccount like ‘%o%’;

    1、映射文件中编写:

    <bind/>标签中的value属性中通过_parameter来获取getManagerAccount,前后加上%以组装sql语句,其中的_parameter是固定的,来获取参数。

    2、编写测试接口:查询数据库表中ManagerAccout字段名中值带有“m”字母的数据。

     5、set

    set标签的作用其实就跟<where/>标签类似,但不代表where就是set哟

    1、mapper中编写:

    如果我提供通过id修改管理员姓名,拼接的sql语句将是 update to _manager set managerName where managerid=?

    2、测试:

    6、trim和include

    trim节点的属性:
    prefix:前缀
    prefixOverrides:前缀覆盖
    suffix:后缀
    suffixOverrides:后缀覆盖

    trim一般用在<select/>和<update/>标签中,可代替<where/>标签,但是该标签是比where节点更加复杂的SQL

    1、

    2、下面图中,同时用了<include/>标签,同时也用了<sql/>,

    sql标签的作用:

      就是拼接一个可重用的SQL语句。

      在<sql/>标签中定义了sql语句之后,后面用<include/>标签参考<sql/>标签中id属性的值,效果和你直接在select标签中写sql语句是一样的。

     

  • 相关阅读:
    350 Intersection of Two Arrays II 两个数组的交集 II
    349 Intersection of Two Arrays 两个数组的交集
    347 Top K Frequent Elements 前K个高频元素
    345 Reverse Vowels of a String 反转字符串中的元音字母
    344 Reverse String 反转字符串
    343 Integer Break 整数拆分
    342 Power of Four 4的幂
    338 Counting Bits Bit位计数
    Java常见面试题之Forward和Redirect的区别
    字节、字、bit、byte的关系
  • 原文地址:https://www.cnblogs.com/xss512/p/10847173.html
Copyright © 2020-2023  润新知