美文网首页码农的世界
MyBatis 构造动态 SQL 语句

MyBatis 构造动态 SQL 语句

作者: 码农UP2U | 来源:发表于2019-10-11 22:49 被阅读0次

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

这是我当时在使用 Java 进行开发时的一篇记录,写 Java 之前有一些写 ASM、C、C++ 和 PHP 的经历,这些经历可能经验都算不上,而当时对于 Java 是完全不懂的,基本就是靠着以前写代码的感觉在写 Java。

无法使用 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 语句

    以前看过一个本书叫《深入浅出 MFC 》,台湾 C++ 大师写的一本书。在该书中写到这样一句话,“勿在浮沙筑高台”...

  • MyBatis 动态SQL(*.xml)

    原文参考MyBatis 动态SQL MyBatis的动态SQL大大减少了拼接SQL语句时候的各种格式问题,这里摘录...

  • 02.MyBatis映射文件深入

    1.1 动态sql语句 1. 动态sql语句概述 Mybatis 的映射文件中,前面我们的 SQL 都是比较简单的...

  • MyBatis学习:动态sql

    1.动态sql 动态sql是mybatis中的一个核心,什么是动态sql?动态sql即对sql语句进行灵活操作,通...

  • 第八章 动态SQL

    动态SQL中的元素介绍 动态SQL有什么作用 MyBatis提供了对SQL语句动态组装的功能 动态SQL中的元素 ...

  • IT 每日一结

    mybatis动态sql 动态sql绝对是mybatis排列前几的闪光点之一。传统代码中的sql语句需要经过多个字...

  • Mybatis入门(三)之动态sql

    Mybatis入门之动态sql 动态拼接sql语句,在我的理解就是相当于Java中的逻辑控制语句(if,,swit...

  • Java数据持久化之mybatis(12)

    mybatis 动态SQL以及和spring的集成 3.6 动态SQL 有时候,静态的 SQL 语句并不能满足应用...

  • MyBatis动态sql

    动态sql就是可以对sql语句进行灵活的封装,拼接。通过mybatis语法的判断可以实现动态sql。 1 if标签...

  • mybatis动态sql

    一 动态sql 1.1 什么是动态sql? mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对...

网友评论

    本文标题:MyBatis 构造动态 SQL 语句

    本文链接:https://www.haomeiwen.com/subject/sicfmctx.html