MyBatis 构造动态 SQL 语句
以前看过一个本书叫《深入浅出 MFC 》,台湾 C++ 大师写的一本书。在该书中写到这样一句话,“勿在浮沙筑高台”,这句话写的的确对啊。编程很多语言虽然相通,但是真正做还是需要认真的学习,如果只是想着按想像着来,真的是会走很多弯路,浪费很多时间。
无法使用 not in
在项目中需要使用到 not in ,想着不是很复杂,但是这个问题困扰了我个把小时,很是郁闷。自己拼接好了字符串,字符串的内容是 not in 中的各个 id 值。通过 not in 来进行 update 的操作,结果和我要的不相同。将 Console 窗口输出的 SQL 语句复制进入 SQL 的客户端执行,和我想的一样。在这个时候,想着不知道是哪里错了。
我拼接的字符串类似如下形式:
'aa', 'bb', 'cc', 'dd'
以这样的形式放入 not in () 中,刚好可以满足我的需求,但是为什么不行呢?我猜测原因是,MyBatis 将该字符串当参数带入后,会在首尾增加单引号将字符串引住,而我的字符串的首尾都有单引号的存在,因此导致查询时会有问题。因此在拼接字符串时是不需要首尾的单引号的。但是,我并没有再使用拼接字符串的方式来进行处理,因为 MyBatis 有它自己的处理方式。
MyBatis 的动态 SQL
MyBatis 可以根据不同的条件来拼接 SQL 语句。在 MyBatis 中有一个 foreach 标签,可以轻松的完成我要的动态拼接的效果。
直接贴出我的代码,代码如下:
<!-- 删除数据库中有的城市,而接口中已经没有的城市 -->
<update id="deleteOldCityList" parameterType="java.util.List">
UPDATE tls_city SET
del_flag = '1'
WHERE
del_flag = '0'
AND city_code NOT IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</update>
上面的代码是 MyBatis 中的定义,关键的部分就是 foreach 标签,其中:
item 表示集合中每一个元素进行迭代时的别名;
index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open 表示该语句以什么开始;
separator 表示在每次进行迭代之间以什么符号作为分隔符;
close 表示以什么结束。
在 update 标签的定义中有一个属性, parameterType 使用来指定参数类型的,这里使用的是 java.util.List 的集合类型。
这样,上面的 MyBatis 代码就可以根据我传入的 List 来进行动态拼接 SQL 语句了。
调用的代码如下:
for( int i = 0; i < size; i ++ ) {
// ...
String cityCode = list.get(i).get("city").toString();
String cityName = list.get(i).get("cityname").toString();
cityList.add(cityCode);
// ...
}
deleteOldCityList(cityList);
到这里,通过 MyBatis 的 foreach 标签就实现了我想要的功能。对于 collection 而言,除了可以使用 List 以外,还可以使用 Array 和 Map 这两种集合类型。
我的微信公众号:“码农UP2U”

MyBatis 构造动态 SQL 语句的更多相关文章
- mybatis 的动态sql语句是基于OGNL表达式的。
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- MyBatis中动态SQL语句完成多条件查询
一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...
- Mybatis中动态SQL语句中的parameterType不同数据类型的用法
Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型, 此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...
- Mybatis 的动态 SQL 语句
<if>标签 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 比如在 id 如果不为空时可以根据 id 查询, 如果 username 不同空时还要加入用户名作为条件.这种 ...
- 阶段3 1.Mybatis_08.动态SQL_03.mybatis中动态sql语句-foreach和sql标签
foreach标签 in的查询 sql语句好写,但是传参在映射文件里面改怎么传呢 定义一个List<Integer>成员变量,然后生成get和set 定义一个新的查询方法 open:开始符 ...
- 阶段3 1.Mybatis_08.动态SQL_02.mybatis中动态sql语句-where标签的使用
这里的userSex是实体类里面的属性名,而不是数据库内的字段名称 一个老王改成性别女,为了区分一下 增加sex字段的查询 where标签 用上where和刚才的执行效果是一样的 where标签使我们 ...
- 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学习笔记(四) 之动态SQL语句
动态SQL mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件 ...
随机推荐
- 《细说PHP》第四版 样章 第二章 PHP的应用与发展 2
2.2 PHP的应用 任何一种主流的编程语言,几乎都可以开发任何类型的软件.编程语言就是一种开发工具,而选择适合的工具去做适合的事儿,才能体现其应用价值.PHP最主要的应用,就是与数据库交互来开发W ...
- 洛谷 P2657 (数位DP)
### 洛谷 P2657 题目链接 ### 题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件: 1.两个相邻数位上的数的差值至少为 2 . 2.不包含前导零. 很简单的数 ...
- Ansible之roles角色
一.roles简介 ansible自1.2版本引入的新特性,用于层次性.结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用roles只 ...
- java高并发系列 - 第8天:线程组
线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图: 使用线程组可以方便管理线程,线程组提供了一些方法方便方便我们管理线程. ...
- MySQL 表和列的注释
像代码一样,可以为表以及表中的列添加注释,方便其他人知晓其功能.对于一些字段,在经过一定时间后,创建者未必也能想起其具体的含意,所以注释显得尤为重要. 注释的添加 注释的添加是通过在定义表或列的时候在 ...
- Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计
Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计 二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...
- XCode证书问题
1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...
- WC个人项目
一.Github项目地址: https://github.com/JakeYi/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- [b0028] python 归纳 (十三)_队列Queue在多线程中使用
# -*- coding: UTF-8 -*- """ 多线程同时读队列 总结: 1. 会阻塞 if self._jobq.qsize() > 0 进入逻辑,此时被 ...
- crawlscrapy简单使用方法
crawlscrapy简单使用方法 1.创建项目:scrapy startproject 项目名例如:scrapy startproject wxapp windows下,cmd进入项目路径例如d:\ ...