解决MyBatis @param注解参数类型错误异常的问题
问题现象
今天使用mybatis遇到个很奇怪的问题,我使用一个参数@param("threshold"),类型是java的double,但是很奇怪,一直告诉我参数转换错误,int不能转double,我就奇怪了,哪里来的int。
解决办法
我感觉可能使用用到了mybatis的关键字,所以就把threshold换了个名字,果然好了。
问题原因
某些关键词,mybatis会认为是某种类型,下面列出来一些,后面发现再补充。
size, threshold, modCount是int类型
loadFactor是float类型
补充:mybatis使用@Param的坑
在mybatis中@Param注解的作用是为参数指定一个名称,在mapper文件中使用,而不是使用mybatis的arguments[0,1…]代替。但是在非动态的mapper――mybatis根据mapper接口创建实现类,@param注解是不起作用的。
阅读mybatis的源码得知,检查@param注解的方法:
private boolean hasNamedParams(Method method) {
boolean hasNamedParams = false;
final Object[][] paramAnnos = method.getParameterAnnotations();
for (Object[] paramAnno : paramAnnos) {
for (Object aParamAnno : paramAnno) {
if (aParamAnno instanceof Param) {
hasNamedParams = true;
break;
}
}
}
return hasNamedParams;
}
此方法位于 org.apache.ibatis.binding.MapperMethod 的内部类 MethodSignature 中。
根据源码一步一步的递归:
MethodSignature的构造方法――>MapperMethod的构造方法――>MapperProxy的cachedMapperMethod 和invoke方法 ――> MapperProxyFactory中的 newInstance 方法。
@SuppressWarnings("unchecked")
protected T newInstance(MapperProxy<T> mapperProxy) {
//jdk的动态代理生成mapper对象
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
//MapperProxy实现了Invocation接口
final MapperProxy<T> mapperProxy = new MapperProxy<T>(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
}
在整合spring与mybatis,使用spring提供的sqlSessionTemplate进行查询时,没有从MapperRegistry的mapper缓存集合中取mapper,而是直接使用配置的sqlSessionTemplate。
所以这种清况下,@param注解是无效的。
上一篇:Spring计划任务用法实例详解
栏 目:JAVA代码
本文标题:解决MyBatis @param注解参数类型错误异常的问题
本文地址:http://www.codeinn.net/misctech/174574.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




