欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-14 10:09:59
问题现象今天使用mybatis遇到个很奇怪的问题,我使用一个参数@param("threshold"),类型是java的double,但是很奇怪,一直告诉我参数转换错误,int不能转double,我就...

问题现象

今天使用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注解是无效的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。