java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatis mapper.xml注释带参数

mybatis mapper.xml 注释带参数的坑及解决

作者:R先森

这篇文章主要介绍了mybatis mapper.xml 注释带参数的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis mapper.xml 注释带参数的坑

最近做一个很简单的统计项目,统计的逻辑产品一直改版,为了便于之后产品返回的时候快速的切换回老版本的逻辑,就给之前的sql注释了直接在下面写了新的sql,注释的时候一般我都习惯性的选中之后Ctrl+/利用编辑器自带的自动注释功能,这个时候编辑器是分两种情况的:情况一是你之前老的sql没有类似<where>这样带特殊尖括号的语句,这个时候如果用Ctrl+/的话编辑器会用'--'也就是sql语句的注释去注释你之前的老sql,注释完之后编辑器并不会报错如果比较幸运你之前的语句里没有参数的话执行也是没有问题的,但是,注意这个但是,如果你之前的sql语句带#{xxxx}或者${xxx}这样的参数,

形如下面这样:

-- #{month,jdbcType=VARCHAR}

那么恭喜你,这个时候执行的话就会报很诡异的异常,类似于下面这样:

org.springframework.dao.TransientDataAccessResourceException: 
### Error querying database.  Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

这个时候你可能会和我一样丈二和尚摸不着头脑,特别是如果之前么有遇见过这个问题的话,很有可能会在这里搞很久;情况二是你的老sql有<where>这样的带尖括号的语句,这个时候你用Ctrl+/的话,会自动是<!-- xxx-->也就是标准的xml注释,这个时候即使你注释的xxx包括外部参数占位,执行的时候也不会报错,形如下面这样也不会有问题:

<!--  #{month,jdbcType=VARCHAR}-->

这个问题由于之前自己没有遇见过所以这次在这里卡了挺久才试出问题原因,至于两种方式为何会有所区别回头还得好好看看mybatis的源码,之后再补充到这篇文章里,占用上班时间做个记录

mybatis的xml中注释需谨慎

报错内容

java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2)

调试半天,网上查了半天都是# 、$ 用法出错,一次次的对比,一个个字找,发现,用法根本没问题,突然。。。看到了注释中的

#{executorId},想想,也许是这个的原因呢?然后就给注释删了,结果发现就是注释的锅:

这样,mybatis仍旧会把#{}算成一个带注入的参数,二SQL认出了这个-- 的注释

-- AND (dept.id = #{executorId} OR dept.parentId = #{executorId} OR parentId in ( SELECT id from user_department
-- WHERE user_department.id = #{executorId} OR user_department.parentId = #{executorId} ))

小结一下

在mybatis的sql里不是不能写注释,而是注释不能有#{},mybatis仍旧会把#{}算成一个带注入的参数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文