解决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注解的方法:
privatebooleanhasNamedParams(Methodmethod){ booleanhasNamedParams=false; finalObject[][]paramAnnos=method.getParameterAnnotations(); for(Object[]paramAnno:paramAnnos){ for(ObjectaParamAnno:paramAnno){ if(aParamAnnoinstanceofParam){ hasNamedParams=true; break; } } } returnhasNamedParams; }
此方法位于org.apache.ibatis.binding.MapperMethod的内部类MethodSignature中。
根据源码一步一步的递归:
MethodSignature的构造方法——>MapperMethod的构造方法——>MapperProxy的cachedMapperMethod和invoke方法——>MapperProxyFactory中的newInstance方法。
@SuppressWarnings("unchecked") protectedTnewInstance(MapperProxymapperProxy){ //jdk的动态代理生成mapper对象 return(T)Proxy.newProxyInstance(mapperInterface.getClassLoader(),newClass[]{mapperInterface},mapperProxy); } publicTnewInstance(SqlSessionsqlSession){ //MapperProxy实现了Invocation接口 finalMapperProxy mapperProxy=newMapperProxy (sqlSession,mapperInterface,methodCache); returnnewInstance(mapperProxy); }
在整合spring与mybatis,使用spring提供的sqlSessionTemplate进行查询时,没有从MapperRegistry的mapper缓存集合中取mapper,而是直接使用配置的sqlSessionTemplate。
所以这种清况下,@param注解是无效的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。