文档章节

Mybatyis foreache 中的BUG

ahpome
 ahpome
发布于 2018/10/26 20:56
字数 908
阅读 104
收藏 2

Mybatyis foreache

标签在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句。 foreach的参数: foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合中每一个元素进行迭代时的别名. index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置(不知道具体的用处). open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符. close表示以什么结束

问题:

在使用mybatis中使用 foreach 出现如下问题

org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity' 

foreach 代码如下:

<foreach collection="companys" index="index" item="item" open=" (" close=") " separator=",">
#{item}
</foreach>

问题产生原因: 使用了一个第三方分页插件 PageBounds

 com.github.miemiedev.mybatis.paginator.domain.PageBounds;
 查询一:this.getSqlSession().selectList(toMybatisStatement("selectByConditions"), params, bounds);
 查询二:this.getSqlSession().selectList(toMybatisStatement("selectByConditions"), params);

使用第一种带第三方分页插件查询 报错:

org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity' 

使用第二种方式查询 能够正常使用。

解决方案

如果想要使用第一种查询方式时 可以使用一下两种解决方法:

解决方案1:parameterType 参数类型将 TestEntity 修改成 map 
解决方案2:将 #{item} 修改成 ${item} 如果是字符串则修改成 '${item}' 

mybatis 中 #{}与${}的区别

默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义。 示例1:

执行SQL:Select * from company where id = #{id}
参数:id =>10
解析后执行的SQL:Select * from emp where id= ?
执行SQL:Select * from company  where id= ${id }
参数:id 传入值为:10
解析后执行的SQL:Select * from company where id=10
使用foreach循环的时候  companys 这边传入的是string 数组 
使用foreach循环时 默认会 将item 转成 __frch_item_0 ... 
1.我们使用#{} 获取参数 则变成 __frch_item_0=>10...  Select * from emp where id in(?,?,?)
2.我们使用${} 获取参数 则变成 10 传入数据中 ..  Select * from emp where id in(10,20,30) 则可以直接使用

所以在使用分页查询的时候使用第二种解决方案是可行的。那是什么原因导致了使用#{}这种获取参数数据的方式会错,而当使用map作为参数时#{}又是可用的。 分析数据:在使用#{}获取参数时,mybatis会将获取到的数据存入一个map中, 例如:

{id="10",param1 = "test",_fors_item_0=591,_fors_item_1=592 } 

其中 低于param1为正常获取 数据,forsitem0,forsitem1为循环时获取的数据, 同时在map还会有其他的参数,其中包括 传入类型 parameterType所带入的对象(TestEntity)。

原因分析:

使用PageBounds 的时候会将mybaits 的数据嵌入在PageBounds里面, 个人分析在PageBounds 回填参数的时候做了类型的判断, 判断传入的parameterType是否是map类型,如果是则从map中获取数据,如果不是则将map映射成TestEntity实体,然而在实体中不存在forsitem_0属性,所以就提示错误:

`org.apache.ibatis.reflection.ReflectionException:There is no getter for property named '__frch_item_0' in 'TestEntity'`

总结

使用${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}的情况下就不要使用${},

© 著作权归作者所有

ahpome
粉丝 1
博文 4
码字总数 2903
作品 0
福州
私信 提问
数组的key什么情况下为空?

$email=$_POST['email']; $username=$_POST['username']; foreache($_POST as $key => $value){ if((!isset($key)) || ($value ==' ')) return false;} 请问$key在email和username都不填写的......

乌鸦低语
2016/10/08
140
1
IEnumerable 使用foreach 详解

我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正文。 自己实现迭代器 .net...

唐僧他大叔
2016/09/22
0
0
批量测试Mybatis项目中Sql是否正确

去Oracle行动 最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的变为。公司的数据库交互层面使用的是,而与也有一些语法上的不同。所以在项目中的Sql要改动,...

不学无数的程序员
2018/12/05
107
0
学界 | 用DL实现Bug自动归类:微软研究院提出DBRNN-A

  选自arXiv   机器之心编译   参与:黄小天、刘晓坤      自动 bug 归类算法可以被形式化为分类任务,其中主要挑战在于 bug 描述通常包含噪声。在这项研究中,作者提出了一种新型...

机器之心
2018/01/10
0
0
iView 2.14.1 发布,基于 Vue.js 的企业级 UI 组件库

iView 2.14.1 发布了,iView 是一套基于 Vue.js 的企业级 UI 组件库,主要服务于 PC 界面的中后台产品。 更新内容如下: 修复 2.14.0 版本中,在 SSR 中无法使用的 bug。#3740 修复 2.14.0 版...

aresn
2018/06/01
1K
13

没有更多内容

加载失败,请刷新页面

加载更多

移动深度学习:人工智能的深水区

人工智能技术经历6年的快速发展,重新定义了很多行业的用户体验,而这仅是开始。 随着5G商用大规模落地,以及智能手机硬件性能越来越强、AIoT设备的快速普及,基于云-边缘-端算法和算力结构的...

博文视点Bv
24分钟前
2
0
vim 分屏 操作

$vim -On file file2 #大写O垂直分屏打开文件 $vim -on file file2 #小写水平打开 # n 表示分屏数,直接n等于文件个数 如果n小于文件,按顺序打开前面的n个,如果大于,打开空编辑页面 分屏快...

突突突酱
27分钟前
3
0
MySQL/Mariadb设置中文字符集(linux)

编辑/etc/my.cnf,添加以下设置 [mysql]default-character-set=utf8[mysqld]character_set_server=utf8[mysqld.safe]default-character-set=utf8[client]default-chara...

编程老陆
29分钟前
3
0
关于linux常用的挂载命令

挂载:就把一块磁盘(可以是光盘,U盘)绑定到一个空目录下面 一般情况下会挂载到mnt目录下面 挂载光盘(把光盘挂载到/mnt/cdrom这个目录中) mount -t iso9660 /dev/cdrom /mnt/cdrom 退出当前目录...

chenhongjiang
30分钟前
3
0
如何分享brain内容外部共享?几个需要知道的TheBrain问答

TheBrain(点击下载)是一款与众不同的思维导图软件,其所有信息通过一个又一个的节点进行联系,最终形成一个杂而不乱的网状结构。从头开始设计,让您捕获您的想法和信息在一个网络的联想,匹...

mnrssj
31分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部