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>
Mybatis动态语句的更多相关文章
- myBatis动态语句详解
SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ...
- Mybatis动态语句部分收集
where: <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BL ...
- MyBatis动态语句if与choose的区别
if(通过“title”和“author”两个参数进行可选搜索): <select id="findActiveBlogLike" resultType="Blog ...
- 注解版mybatis动态语句将空字符串转换为null
Convert.java import java.util.Map; import java.util.Objects; /** * * @ClassName: Convert * @Descript ...
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...
- Mybatis动态查询语句
MyBatis中动态SQL语句完成多条件查询 标签: mybatis动态SQL多条件查询java.sql.SQLSyntaxEr 2015-06-29 19:00 22380人阅读 评论(0) 收藏 ...
- 7. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
转自:http://www.kyjszj.com/htzq/79.html 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 sw ...
- Mybatis 动态Sql语句《常用》
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
随机推荐
- API返回延迟,FPM重启后恢复之后又重现 问题解决方案
背景 最近在提供后台API时,提供了一个简单逻辑的接口 部署在测试环境,自测没问题,提交测试 突然有一天,接口响应延迟严重,几乎每次都是3-4秒返回 这对于一个接口来说,肯定是有问题的 于是便有了以下 ...
- PHP mysqli_sqlstate() 函数
返回最后一个 MySQL 操作的 SQLSTATE 错误代码: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB ...
- C++模板沉思录(上)
花下猫语: 在我们读者群里,最近出现了比较多关于 C++ 的讨论,还兴起了一股学习 C++ 的风气.樱雨楼小姐姐对 C++ 的模板深有研究,系统地梳理成了一篇近 4 万字的文章!本文是上篇,分享给大家 ...
- 一本通 高手训练 1788 爬山 dp 斜率 凸包
LINK:爬山 很早以前看的题目 发现自己想的完全不对 这道题还是比较有价值的. 先不考虑走的路线问题 考虑某个点能看到的最高的山. 分左边和右边来考虑 考虑左边 利用单调栈存长度单调递减的山 不能直 ...
- ubuntu16.04下chrome安装flash插件
最近自己的ubuntu安装了最新的chrome54版本,发现视频无法播放,提示flash版本过期,原来最新的chrome已经不内置flash插件了,需要自己安装. 方法/步骤 1.安装chrome打开 ...
- 自定制格式化方式format
自定制格式化方式format # x='{0}{0}{0}'.format('dog') # # print(x) # class Date: # def __init__(self,year,mon ...
- JavaScript动画实例:炸开的小球
1.炸开的小球 定义一个小球对象类Ball,它有6个属性:圆心坐标(x,y).小球半径radius.填充颜色color.圆心坐标水平方向的变化量speedX.圆心坐标垂直方向的变化量speedY. B ...
- C语言输出颜色
命令后界面输出颜色 嵌入式终端界面输出日志时,为了区分输出的有用信息.错误信息,可以给不同级别的输出加上不同的颜色,以方便查看. 下面是颜色的定义: //颜色宏定义 #define NONE &quo ...
- 【av68676164(p51-p53)】虚拟内存管理(2)
虚拟内存管理(2) 7.3.4 缺页终端 分级存储体系 cache+内存+辅存 页表扩充-带中断位的页表 页号 页框号 中断位I 辅存地址 访问位 修改位 1 1 0 0 0 1 中断位I-标志该页是 ...
- http接口封装mqtt协议
前言 .Net Core 3.1 WebApi 列出了mqtt客户端的封装目的是为了了解运作机制 1.封装mqtt客户端 mqtt底层协议基于MQTTnet 版本2.8.5 github地址 实例化[ ...