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>

Mybatis动态语句的更多相关文章

  1. myBatis动态语句详解

    SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ...

  2. Mybatis动态语句部分收集

    where: <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BL ...

  3. MyBatis动态语句if与choose的区别

    if(通过“title”和“author”两个参数进行可选搜索): <select id="findActiveBlogLike" resultType="Blog ...

  4. 注解版mybatis动态语句将空字符串转换为null

    Convert.java import java.util.Map; import java.util.Objects; /** * * @ClassName: Convert * @Descript ...

  5. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  6. 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...

  7. Mybatis动态查询语句

    MyBatis中动态SQL语句完成多条件查询 标签: mybatis动态SQL多条件查询java.sql.SQLSyntaxEr 2015-06-29 19:00 22380人阅读 评论(0) 收藏  ...

  8. 7. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:http://www.kyjszj.com/htzq/79.html 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 sw ...

  9. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

随机推荐

  1. Spring学习之Spring与Mybatis的两种整合方式

    本机使用IDEA 2020.1.MySql 8.0.19,通过Maven进行构建 环境准备 导入maven依赖包 <dependencies> <dependency> < ...

  2. Day13_商品详情及静态化

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  3. Day03_SpringCloud2

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  4. Django学习路3

    1.打开 Data Source alt insert 打开 Data Source 找到 db.sqlite3 确定 Download 下载后 TestConnection 测试是否成功 2.项目下 ...

  5. PHP EOF(heredoc) 使用说明

    PHP EOF(heredoc) 使用说明 PHP EOF(heredoc)是一种在命令行shell(如sh.csh.ksh.bash.PowerShell和zsh)和程序语言(像Perl.PHP.P ...

  6. Python List cmp()方法

    描述 cmp() 方法用于比较两个列表的元素.高佣联盟 www.cgewang.com 语法 cmp()方法语法: cmp(list1, list2) 参数 list1 -- 比较的列表. list2 ...

  7. PHP preg_replace_callback_array() 函数

    preg_replace_callback_array 函数执行一个正则表达式搜索并且使用一个回调进行替换.高佣联盟 www.cgewang.com 该函数在 PHP7+ 版本支持. 语法 mixed ...

  8. luogu P3761 [TJOI2017]城市 树的直径 bfs

    LINK:城市 谢邀,学弟说的一道毒瘤题. 没有真正的省选题目毒瘤 或者说 写O(n)的做法确实毒瘤. 这里给一个花20min就写完的非常好写的暴力. 容易想到枚举哪条边删掉 删掉之后考虑在哪两个点上 ...

  9. day7.关于字符串的相关操作

    一.字符串的相关操作 """ (1)字符串的拼接 (2)字符串的重复 (3)字符串跨行拼接 (4)字符串的索引 (5)字符串的切片: 语法 => 字符串[::] 完 ...

  10. 【leetcode每日两题】-Day1-简单题

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素 ...