解决MyBatis @param注解参数类型错误异常的问题

网友投稿 938 2023-02-13

解决MyBatis @param注解参数类型错误异常的问题

解决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 methocvswgjuzLd) {

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 mapperProxy) {

//jdk的动态代理生成mapper对象

return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface }, mapperProxy);

}

public T newInstance(SqlSession sqlSession) {

//MapperProxy实现了Invocation接口

final MapperProxy mapperPrhttp://oxy = new MapperProxy(sqlSession, mapperInterface, methodCache);

return newInstance(mapperProxy);

}

在整合spring与mybatis,使用spring提供的sqlSessionTemplate进行查询时,没有从MapperRegistry的mapper缓存集合中取mapper,而是直接使用配置的sqlSessionTemplate。

所以这种清况下,@param注解是无效的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于ssm中dao接口@Param注解的用法
下一篇:APP运营模式案例(app运营模式和盈利模式)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~