MyBatis中使用foreach循环的坑及解决
目录
- 使用foreach循环的坑
- 正确写法为
- 忽现的Mybatis foreach失效记录
- 解决方案
使用foreach循环的坑
我们首先看一段MyBatis中使用foreach循环的sql:
SELECT * FROM table where id in <foreach item="item" collection="ids1" open="(" close=")" index="0" separator=","> #{item} </foreach>
这段sql执行会添加几个占位符,正确写法foreach写到一行:
正确写法为
SELECT * FROM table where id in <foreach item="item" collection="ids1" open="(" close=")" index="0" separator=",">#{item}</foreach>
忽现的Mybatis foreach失效记录
传进来的 list 肯定有值得,本身代码没有问题。 线上也算跑了大半年了。 而且出现的问题时也只在本机上.
mybatis.version=3.2.8
代码:
AND ( <foreach collection="list" open=" id IN (" separator="," close=")" item="id" index="index"> #{id} </foreach> OR (GRADE In ('0','1') AND user_type = '5' ) )
正确结果应该是:
AND ( id IN ('1','2','3') OR (GRADE In ('0', '1') AND user_type = '5') )
实际结果:
AND ( OR (GRADE In ('0', '1') AND user_type = '5') )
造成SQL 执行语法错误.
复现方式:暂无复现方法
解决方案
随便改了一下Dao.java的一个文件内容(没做实际性的内容改动,ide 重新加载了下Dao). bug就好了. 好了 . 了...
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
深入浅析MyBatis foreach标签
前面我们学习了如何使用 Mybatis if.where.trim 等动态语句来处理一些简单的查询操作.对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代. Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List.set 接口的集合,并对此提供遍历的功能.语法格式如下. SELECT * FROM product_ WHERE ID in <foreach item="item"
-
MyBatis foreach 批量更新实例
在做配置选项(设备类型,所属楼层等)的时候,当删除某配置的时候,我需要检验该配置是否已被删除. @Override public BaseVO deleteOptionDetail(Integer id) { // 合法性验证 if (null == id) { return ParamErrorVO.getInstance(); } ConfigOptionDetail configOptionDetail = configOptionDetailMapper.selectById(id);
-
mybatis foreach 属性及其三种使用情况详解
目录 foreach 属性介绍 单参数是 array 类型 单参数是 List 类型 单参数是 Map 类型 多参数 foreach 属性介绍 foreach 用于迭代传入过来的参数. 它的属性介绍分别是 collection:表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代替作为键,数组对象有 array 代替作为键,Map 对象没有默认的键.当然在作为入参时可以使用 @Param(“keyName”) 来设置键,设置 k
-
mybatis 遍历foreach中or拼接的操作
我就废话不多说了,大家还是直接看看关键代码吧: select id, name from t_keys where 1 = 1 <if test="keys != null"> <foreach collection="keys" item="key" open="AND (" close=")" separator="or" > name = #{key} &l
-
基于mybatis注解动态sql中foreach工具的方法
目录 实现目标 工具类 测试 集成进spring后的使用方法 Mapper层 Provider层 Ognl问题 解决方案 创建一个DefaultMemberAccess.java文件 改造ForeachMybatisUtils.java类 实现目标 由于在注解版mybatis中手动循环拼接动态sql容易出错 请看mybatis注解动态sql注入map和list(防sql注入攻击),所以封装了这个类似于foreach标签的工具方法. 由于mybatis(3.5.6.3.5.7 or earlier
-
mybatis错误之in查询 <foreach>循环问题
目录 in查询 <foreach>循环问题 1.我就随便用了一种传list,再foreach循环 2.findByCaseNos(Long[] caseNos) 3.findByCaseNos(String name, Long[] caseNos) in查询和foreach标签使用 1.单参数List的类型 2.单参数Array的类型 3.多参数封装成Map的类型 4.嵌套foreach的使用 in查询 <foreach>循环问题 当我在做in查询的时候,发现在网上有很多种写法:
-
MyBatis中使用foreach循环的坑及解决
目录 使用foreach循环的坑 正确写法为 忽现的Mybatis foreach失效记录 解决方案 使用foreach循环的坑 我们首先看一段MyBatis中使用foreach循环的sql: SELECT * FROM table where id in <foreach item="item" collection="ids1" open="(" close=")" index="0" separ
-
mybatis中 if-test 数字判断的坑及解决
目录 if-test数字判断的坑 mybatis的test判断注意事项 if-test数字判断的坑 在项目中偶然发现一个判断数字的if没有起任何作用,代码如下 <if test="timeType !=null and timeType!='' and timeType == '3'"> AND ... </if> 经过查询资料发现,mybatis是用OGNL表达式来解析的,在OGNL的表达式中,数字’3’会被解析成字符,java是强类型的,ch
-
详解JAVA中的for-each循环与迭代
在学习java中的collection时注意到,collection层次的根接口Collection实现了Iterable<T>接口(位于java.lang包中),实现这个接口允许对象成为 "foreach" 语句的目标,而此接口中的唯一方法,实现的就是返回一个在一组 T 类型的元素上进行迭代的迭代器. 一.迭代器Iterator 接口:Iterator<T> public interface Iterator<E>{ boolean hasNext
-
Mybatis中and和循环or混用操作(or转换成in)
Mybatis and和循环or混用 这次项目用到一个and和or混用的场景 , 因为用到多个or(循环), 没想到好的办法 最终转换成用 IN实现: 场景 用left join链接多个表, 多个条件and筛选, 其中状态(state)条件筛选出多个可选状态的条目, 本来想用and 和 or 但是 or的条件是个数组参数, 需要遍历states , 可能0个可能多个, 拼了半天没有成功 , 最后发现用 IN 和FOREACH就可以了 DAO层接口 List<OrderInfoForm> sel
-
vue-cli项目中遇到的eslint的坑及解决
目录 vue-cli遇到的eslint的坑 报错 关于eslint规则说明 vue-cli遇到的eslint的坑 报错 Do not access Object.prototype method 'hasOwnProperty' from target object no-prototype-builtins 原因:大概的意思是不要使用对象原型上的方法,因为原型上的方法可能被重写了. // bad if (obj.hasOwnProperty('name')) { } // good if (O
-
SpringBoot2.x版本中,使用SpringSession踩的坑及解决
SpringBoot2.x SpringSession踩坑 Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.Ses
-
mybatis多个区间处理方式(双foreach循环)
目录 mybatis多个区间处理 思路 多个foreach同时使用问题 应用场景 注意事项 解决方案 mybatis多个区间处理 如图:要实现车辆数不同区间查询条件 思路 a.前端传数组,数组里面放"1-5"String类型值 b.后端mybatis用双foreach循环解析 后端代码如下: <!--图例车辆数区间--> <if test="countCargoList != null and countCargoList.s
-
解决Mybatis中foreach嵌套使用if标签对象取值的问题
目录 foreach嵌套使用if标签对象取值问题 大体格式 解决办法 代码如下 Mybatis if 语句嵌套 要求 foreach嵌套使用if标签对象取值问题 最近做项目过程中,涉及到需要在 Mybatis 中 使用 foreach 进行循环读取传入的查询条件,动态拼接SQL语句,接口传入的查询条件格式:{"advanceSearchList":[{"searchType":10,"searchText":"12"}]} ,
-
Java for-each循环使用难题2例(高级使用方法)
Java中,for-each循环简化了任何Collection或array的遍历过程,但并不是每个Java程序员都了解本文将要描述的for-each 循环的一些细节.与 Java5 发布的其他术语:释放别名泛型,自动封装和可变参数不同,Java开发者对for-each循环的使用比任何其他特性更加频繁,但当问及高级的for-each循环怎样工作,或什么是在for-each循环中使用Collection时的基本需求时,就不是每个人都能够回答的了. 本篇教程和例子旨在通过深入研究for-each 循环
随机推荐
- AngularJS 执行流程详细介绍
- 基于AngularJS实现页面滚动到底自动加载数据的功能
- JavaScript设计模式之单例模式详解
- asp.net生成HTML
- laravel 5.4中实现无限级分类的方法示例
- Python 基础知识之字符串处理
- 详解C++设计模式编程中建造者模式的实现
- 一篇文章搞定JavaScript类型转换(面试常见)
- Javascript进制转换实例分析
- 开源SNS系统-ThinkSNS
- python网页请求urllib2模块简单封装代码
- SQL Server安装完成后3个需要立即修改的配置选项
- 让MySQL支持中文排序的实现方法
- jquery入门—访问DOM对象方法
- 解决Android手机屏幕横竖屏切换
- JS 终止执行的实现方法
- 访问php时提示内存位置访问无效的解决办法和思路分析
- Android开发自学笔记(一):Hello,world!
- java 实现输出随机图片实例代码
- c++常量详解