以前看过一个本书叫深入浅出 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 这两种集合类型.
通过不断的写代码, 遇到问题, 解决问题, 我感觉我越来越向着一个初级的 Java 程序员靠近了. 加油!!
来源: http://www.linuxidc.com/Linux/2018-06/153005.htm