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;
    }
View Code

此方法位于 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注解是无效的。

 

posted @ 2018-08-22 18:36  风之神  阅读(7942)  评论(0编辑  收藏  举报