• Mybatis动态语句


    If元素
    If元素是简单的条件判断逻辑,满足制定条件时追加if元素的SQL,不满足条件时不追加,使用格式如下:

    <select ….>
    SQL语句1
    <if test=“条件表达式”>
    SQL语句2
    </if>
    </select>

    If元素最常见的使用条件是在where子句部分,根据不同的情况追加不同的SQL条件,示例代码如下:

    <select id=“findEmp”parameterType=“map” resultType=“Emp”>
    SELECT * FROM EMP WHERE dept_no=#{deptNo}
    <if test=“salary!=null”>
    AND salary=#{salary}
    </if>
    </select>

    上述示例表示根据员工的部门编号查询员工,并且如果员工的工资有值的话,则也会将salary当做查询的条件。多个条件添加多个if元素即可。

    choose元素
    choose元素的作用就相当于Java中的switch语句,choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。 当 choose 中所有 when 的条件都不满则时,则执行otherwise 中的sql:

    <select ......>
    SELECT * FROM EMP WHERE dept_no=#{deptNo}
    <choose>
    <when test=“条件表达式1”>
    SQL 语句2
    </when>
    <when test=“条件表达式2”>
    SQL 语句2
    </when>
    <otherwise>
    SQL语句3
    </otherwise>
    </choose>
    </select>

    choose元素的使用示例代码如下:

    <select id=“findEmp”parameterType=“map” resultType=“Emp”>
    select * from EMP where
    <choose>
    <when test=“salary>2000”>
    salary>=#{sal}
    </when>
    <otherwise>
    salary=2000
    </ohterwise>
    </choose>
    </select>


    where元素(实现动态条件查询)
    Where元素主要是用于简化查询语句中where部分的条件判断。where 元素知道在至少有一个以上的if元素满足条件时才去插入“WHERE”子句。而且,如果最后得到的sql子句是以“AND”或“OR”开头的,where 元素也知道如何将他们去除。

    <select id="findEmp" parameterType="map" resultMap="entity.Emp">
    SELECT * FROM t_emp 
    <where>
    <if test="deptNo!=null"> dept_no=#{deptNo} </if>
    <if test="salary!=null"> AND salary=#{salary} </if>
    </where>
    </select>

    Where元素的使用示例代码如下:

    <select id=“findByCondition”resultType=“Emp”parameterType=“Emp”>
    select * from EMP 
    <where>
    <if test=“deptno!==null”>
    DEPTNO=#{deptno}
    </if>
    <choose>
    <when test=“!sal>2000”>
    and SAL>=#{sal}
    </when>
    <otherwise>
    and SAL>=2000
    </otherwise>
    </choose>
    </where>
    </select>

    set元素(实现动态修改)
    Set元素主要是用在更新操作的时候,它的主要功能和where元素相似,主要是在<set>元素所在位置输出一个set关键字,而且还可以去除内容结尾中无关的逗号。有个set元素我们就可以动态的更新那些修改了的字段
    Set使用格式如下:

    <update…>
    Update 表
    <set>
    动态追加更新字段
    </set>
    </update>

    set元素的使用示例代码如下:

    <update id=“updateEmp” parameterType=“Emp”>
    UPDATE EMP
    <set>
    <if test=“ename!=null”>
    ENAME=#{ename},
    </if>
    <if test=“sal!=null”>
    SAL=#{sal},
    </if>
    <if test=“comm!=null”>
    COMM=#{comm},
    </if>
    <if test=“deptno!=null”>
    DEPTNO=#{deptno},
    </if>
    </set>
    where EMPNO=#{empno}
    </update>

    trim元素
    Trim元素有点类似replace的效果,其使用也是围绕其四个属性来的:
    1、prefix:可以给Trim元素包裹内容之前加上指定前缀,
    2、suffix:可以给Trim元素包裹内容之后加上某些后缀,
    3、prefixOverrides:可以把Trim元素包含内容的首部某些内容过滤,
    4、suffixOverrides:可以把Trim元素包含内容的尾部的某些内容过滤。
    正因为trim有上述功能,所以我们也可以在非常简单的利用trim来代替where和set元素的功能。

    利用trim元素可以实现where元素相同的效果

    <select id="findEmp" parameterType="entity.Emp" resultType="entity.Emp">
    SELECT * FROM t_emp
    <!--prefix给包裹的元素添加where前缀
    prefixOverrides 将包裹内容第一个AND去除
    -->
    <trim prefix="WHERE" prefixOverrides="AND|OR">
    <if test="age!=null"> AND age>#{age} </if>
    <if test="salary!=null"> AND salary>#{salary} </if>
    </trim>
    </select> where age>#{age} ND salary>#{salary}

    即上述语句终于变成了:

    SELECT * FROM t_emp WHERE age=#{age} AND salary>#{salary}

    处于最前面的那个AND被trim元素去除了。
    此外,trim元素也还可以代替set元素。

    Foreach元素
    Foreach元素实现了循环逻辑,可以实现对一个集合的迭代,通常是在构建 IN 条件语句的时候。Foreach元素一般实现对三种类型数据的遍历:List, 数组array, Map三种。
    Foreach元素属性简介:
    1、item(必选):表示集合中每一个元素进行迭代时的别名。
    2、collection(必选):表示传入过来的参数的数据类型,如果传入参数为List,则其属性值为list;传入数组则属性值为array;如果传入参数为User对象,而这个User对象有属性 List xxlist,那么属性值为collection =“xxlist”。Map稍后讲。
    3、index:在 list 和数组中,index 是元素的序号;在 map 中,index 是元素的 key。
    4、open:表示该语句以什么开始
    5、close:表示该语句以什么结束
    6、separator:表示在每次进行迭代之间以什么符号作为分隔符

    Foreach用于查询语句时,通常用来构建 IN 条件语句,比如传入一个id数组,获取每个id对应的数据

    <select id="findEmpByIds" resultType="entity.Emp">
    SELECT * FROM t_emp WHERE id IN
    <!-- 传入参数类型为array,每个元素别名为ids,以(开始,以 )结尾,
    每个元素用逗号分隔开-->
    <foreach collection="array" item="ids" open="(" close=")" separator=",">
    #{ids}
    </foreach>
    </select>

    遍历map,当我们传入多个参数时可能会使用Map,此时可以通过添加注解@Param("params"),则map的所有的key集合可以写成params.keys,所有值集合可以写成params.values。
    如下所示: map.put("id1",1);map.put("id2",2); map.put("id3",2);

    <select id="findEmpByMap" resultType="entity.Emp" parameterType="map">
    SELECT * FROM t_emp WHERE id IN
    <foreach collection="idMap.values" item="ids" open="(" close=")" separator=",">
    #{ids}
    </foreach>
    </select>
  • 相关阅读:
    C++ 虚函数在基类与派生类对象间的表现及其分析
    借@阿里巴巴 耍了个帅——HTML5 JavaScript实现图片文字识别与提取
    Dede(织梦) CMS SQL Injection Vulnerability
    dedecms v5.5 final getwebshell exploit(datalistcp.class.php)
    DEDECMS网站管理系统Get Shell漏洞
    织梦(Dedecms)select_soft_post.php页面变量未初始漏洞
    织梦(Dedecms) 5.1 feedback_js.php 注入漏洞
    织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞
    dedecms织梦 v5.5 两处跨站漏洞
    dedecms织梦 v5.6 两处跨站漏洞
  • 原文地址:https://www.cnblogs.com/ericz2j/p/11109120.html
Copyright © 2020-2023  润新知