以前看过一个本书叫《深入浅出 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 语句的更多相关文章

  1. mybatis 的动态sql语句是基于OGNL表达式的。

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

  2. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  3. Mybatis中动态SQL语句中的parameterType不同数据类型的用法

    Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型,    此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...

  4. Mybatis 的动态 SQL 语句

    <if>标签 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 比如在 id 如果不为空时可以根据 id 查询, 如果 username 不同空时还要加入用户名作为条件.这种 ...

  5. 阶段3 1.Mybatis_08.动态SQL_03.mybatis中动态sql语句-foreach和sql标签

    foreach标签 in的查询 sql语句好写,但是传参在映射文件里面改怎么传呢 定义一个List<Integer>成员变量,然后生成get和set 定义一个新的查询方法 open:开始符 ...

  6. 阶段3 1.Mybatis_08.动态SQL_02.mybatis中动态sql语句-where标签的使用

    这里的userSex是实体类里面的属性名,而不是数据库内的字段名称 一个老王改成性别女,为了区分一下 增加sex字段的查询 where标签 用上where和刚才的执行效果是一样的 where标签使我们 ...

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

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

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

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

  9. Mybatis学习笔记(四) 之动态SQL语句

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

随机推荐

  1. 【shell脚本】对100以内的所有正整数相加求和(1+2+3+4...+100)===sum.sh

    对100以内的所有正整数相加求和(1+2+3+4...+100) [root@VM_0_10_centos shellScript]# cat sum.sh #!/bin/bash # 对100以内的 ...

  2. app自动化测试初体验

    一.appium环境开启 1.开启MUMU模拟器/真机(真机需要开启“USB开发调试模式”),使用命令行adb devices检查设备是否正常连接 2.开启appium 双击运行appium应用 正常 ...

  3. JBoss+eclipes之HelloWorld

    网上罕有教程,文档看不太懂.鄙人摸索成功以记之. 创建新的EJB项目:[File]--[New]--[Other]-- [EJB]--[EJB project] 此处可见我的JBoss服务器使用的是W ...

  4. Oracle数据 查询操作日志

    SELECT t.SQL_TEXT, t.FIRST_LOAD_TIME,t.PARSING_SCHEMA_NAME FROM v$sqlarea t WHERE t.SQL_TEXT LIKE 'D ...

  5. 多线程通信的两种方式? (可重入锁ReentrantLock和Object)

    (一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...

  6. 基础面试,为什么面试官总喜欢问String?

    关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String 在 Java 中,我们有两种方式创建一个字符串 String x ...

  7. MongoDB for OPS 03:分片 shard 集群

    写在前面的话 上一节的复制集也就是主从能够解决我们高可用和数据安全性问题,但是无法解决我们的性能瓶颈问题.所以针对性能瓶颈,我们需要采用分布式架构,也就是分片集群,sharding cluster! ...

  8. 基于 EntityFramework 生成 Repository 模式代码

    借助 WeihanLi.EntityFramework 实现简单的 Repository Intro 很多时候一些简单的业务都是简单的增删改查,动态生成一些代码完成基本的增删改查,而这些增删改查代码大 ...

  9. python字典的常用方法

    1.clear()方法: clear() 用于清空字典中所有的 key-value 对,对一个字典执行 clear() 方法之后,该字典就会变成一个空字典. s = {'a': 1, 'b': 2, ...

  10. jxl解析excel时,处理中文乱码问题

    jxl解析excel时,处理中文乱码问题 一般出现较多的问题是,当exce中包含了中文或特殊字符时,在解析时候就会出现乱码现象. 解决方法为: InputStream in = new FileInp ...