mybatis {arg0} 与 {0}
解决方案:
MyBatis的XML的配置文件中声明设置属性的useActualParamName参数值为假
<setting name="useActualParamName" value="false" />
代码展示:
Dao层函数
User getUserBys(int id,String name);
对应的mapping.xml
1 2 3 4 5 | <select id= "getUserBys" resultType= "model.User" > select * from user where id = #{ 0 } and name=#{ 1 } </select> |
这种方法应该是对的,但是如果你使用的是mybatis3.4.2或者之后的版本,就会产生绑定异常:
org.apache.ibatis.binding.BindingException: Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2]
从异常可以看出在没有使用@参数注解的情况下,传递参数需要使用
#{}为arg0 - #{} ARGN#或者{}参数1 - #{} paramn
- 更换下mapping.xml中的代码
1 2 3 4 5 | <select id= "getUserBys" resultType= "model.User" > select * from user where id = #{arg0} and name=#{arg1} </select> |
此时代码就会正常运行
下面贴上3.4.1以及之前版本的绑定异常信息:
org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [0, 1, param1, param2]
可以发现3.4.1版本中传递参数可以使用#{0} - #{N}
问题原因
MyBatis的通过XMLConfigBuilder类来加载配置文件中的各项参数
- 3.4.2版本之前设置属性中useActualParamName参数的默认值为flase
XMLConfigBuilder.class的settingsElement方法中的源代码
configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), true));
- 3.4.2版本之后设置属性中useActualParamName参数的默认值为true
XMLConfigBuilder.class的settingsElement方法中的源代码
configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), false));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2016-11-07 CURL常用命令(转)
2016-11-07 Centos7管理selinux及使用firewalld管理防火墙