关键词: mybatis、foreach、foreach context scope、MyBatis3.4.5、BindingException
背景:
随着团队开发人数越来越多,项目迭代越来越久,加上一些半吊子开发的盲目自信,项目如果不够健壮,就会出现莫名其妙的问题,甚至让测试团队对某些开发一瞬间丧失全部信任。
起因是团队有150多个服务的分布式微服务项目,服务之间有RPC调用关系,也有公共组件库,基础类库的交叉引用关系,甚至部分服务提供门面接口,通过maven jar将接口抽象给其他服务提供者使用,自身只实现接口,作为RPC提供者,提供数据。
随着项目迭代,开发引入jar的时候直接去maven 中央仓库搜索坐标,也不关心跟项目中其他依赖的版本对照关系,直接将坐标引入pom.xml
中, 由于服务之间有公共jar的相互依赖,公共jar会将一些依赖传递过去,携带到服务依赖中,久而久之,就会造成依赖冲突,甚至出现幻影依赖,知道某个成员用到了介于两个版本之间的API时,问题爆发。
项目中有这么一段远古 mybatis xml代码
在这段代码中,list
的每一批数据,每批数据的plan_id
属性都是相同的,plan_id
与id
是一对多的关系
在mybatis 3.4.5之前,这段代码的写法“恰好”没有问题,因为foreach
标签中的item
作用域是全局,#{item.plan_id, jdbcType=BIGINT}
刚好取到了循环id
时的最后一个item
由于项目依赖冲突,纠正mybatis
依赖
- 按照
Spring boot
版本找mybatis-spring-boot-starter
- 找到
mybatis-spring-boot-starter
中依赖的spring-boot-starter
的版本>=当前项目的spring-boot-starter
的版本,注意不能跨大版本,例如spring-boot-starter 2.1.x
都可以,小版本无影响 - 此时
mybatis-spring-boot-starter
中传递的mybatis
版本就是最佳的
由于正好最合适的mybatis
版本是3.4.6
,之前的版本一直是3.4.2
,遇到了这个问题,报错:BindingException: Parameter: 'xxx' not found. Available parameters are [list, param1]
由于我本人非常熟悉MyBatis的源码,这个问题一下就猜到,直接将根本原因找出来
最后,告诫各位写代码时遵循以下几点
- 写代码一定要写健壮性强的代码,不给自己留坑,也不给别人挖坑
- 每写一行代码,一个函数,一个类,做到无IDE警告,必要时使用
@SuppressWarnings
压制 - 调用三方库、三方组件时多思考,多看源码,不写有歧义的代码
- 自己封装函数前,先考虑有没有可靠库可以使用,例如
guava
、commons-lang
等
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。