MyBatis 构造动态 SQL 语句

2018-06-29 06:17:07来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

  以前看过一个本书叫《深入浅出 MFC 》,台湾 C++ 大师写的一本书。在该书中写道这样一句话,“勿在浮沙筑高台”,这句话写的的确对啊。编程很多语言虽然相同,但是真正做还是需要认真的学习,如果只是想着按想像着来,真的是会走很多弯路,浪费很多时间。

 

无法使用 not in

  在项目中需要使用到 not in ,想着不是很复杂,但是这个问题困扰了我个把小时,很是郁闷。自己拼接好了字符串,字符串的内容是 not in 中的各个 id 值。通过 not in 来进行 update 的操作,结果和我要的不相同。将 Console 窗口输出的 SQL 语句复制进入 SQL 的客户端执行,和我想的一样。在这个时候,想着不知道是哪里错了。

  我拼接的字符串类似如下形式:

1 'aa', 'bb', 'cc', 'dd'

  以这样的形式放入 not in () 中,刚好可以满足我的需求,但是为什么不行呢?我猜测原因是,MyBatis 将该字符串当参数带入后,会在首尾增加单引号将字符串引住,而我的字符串的首尾都有单引号的存在,因此导致查询时会有问题。因此在拼接字符串时是不需要首尾的单引号的。但是,我并没有再使用拼接字符串的方式来进行处理,因为 MyBatis 有它自己的处理方式。

 

MyBatis 的动态 SQL

  MyBatis 可以根据不同的条件来拼接 SQL 语句。在 MyBatis 中有一个 foreach 标签,可以轻松的完成我要的动态拼接的效果。

  直接贴出我的代码,代码如下:

 1 <!-- 删除数据库中有的城市,而接口中已经没有的城市 -->
 2 <update id="deleteOldCityList" parameterType="java.util.List">
 3     UPDATE tls_city SET
 4         del_flag = '1'
 5     WHERE
 6         del_flag = '0'
 7         AND city_code NOT IN
 8         <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
 9             #{item}
10         </foreach>
11 </update>

  上面的代码是 MyBatis 中的定义,关键的部分就是 foreach 标签,其中:

item           表示集合中每一个元素进行迭代时的别名;
index         指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open          表示该语句以什么开始;
separator  表示在每次进行迭代之间以什么符号作为分隔符;
close         表示以什么结束。

  在 update 标签的定义中有一个属性, parameterType 使用来指定参数类型的,这里使用的是 java.util.List 的集合类型。

  这样,上面的 MyBatis 代码就可以根据我传入的 List 来进行动态拼接 SQL 语句了。

  调用的代码如下:

 1 for( int i = 0; i < size; i ++ ) {  
 2     // ...
 3     
 4     String cityCode = list.get(i).get("city").toString();
 5     String cityName = list.get(i).get("cityname").toString();
 6 
 7     cityList.add(cityCode);
 8     
 9     // ...
10 } 
11 
12 deleteOldCityList(cityList);

 

  到这里,通过 MyBatis 的 foreach 标签就实现了我想要的功能。对于 collection 而言,除了可以使用 List 以外,还可以使用 Array 和 Map 这两种集合类型。

 

  通过不断的写代码,遇到问题,解决问题,我感觉我越来越向着一个初级的 Java 程序员靠近了。加油!!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:不改源代码,修改服务器配置,解决全局Get中文乱码问题

下一篇:spring整合redis(哨兵模式)