解决mapper.xml中resultType映射类型的问题

 更新时间:2023年06月26日 14:21:12   作者:内涵无处不在  
这篇文章主要介绍了解决mapper.xml中resultType映射类型的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mapper.xml中resultType映射类型问题

记录一下在公司开发中遇到的问题

在使用 mapper.xml 进行编写时 resultMap=“String” String竟然引用不进去,在程序中标红,别的mapper中也映射过但是别的就好使,然后重新启动的时候代码执行报错

<select id="queryAreaBy" parameterType="String" resultType="String">
       select SUM(area) as area from tb_forward_area where
                    server_time = #{serverTime}  and
                    region_code like concat('%',#{regionCode},'%')
                    and del_flag='0'
    </select>

这时需要 在resultType 中引入绝对路径

<select id="queryAreaBy" parameterType="String" resultType="java.lang.String" >
        select SUM(area) as area from tb_forward_area where
                    server_time = #{serverTime}  and
                    region_code like concat('%',#{regionCode},'%')
                    and del_flag='0'
    </select>

代码也不报错了也可以正常使用了,第二天继续编写项目时,试了下把 java.lang. 这个路径删了他也好使了,但是在同一个mapper中别的SQL想使用String或者Long类型的还需要引入绝对路径

mybatis Mapper接口映射Mapper.xml代码分析

我们在使用mybatis时,会用到Mapper接口映射Mapper.xml,具体怎么映射的我们不知道。只知道要这么用,下面我们开始分析mybatis代码。

在分析具体代码时,我们有必要先看一下jdk动态代理。

简单点说:jdk动态代理,可以让我们在不实现接口的情况下,去动态生成接口的实现。

传统上我们要去实现接口,都会创建具体的实现类.java,  而jdk动态代理,可以让我们不用创建具体的实现类.java,就可以生成接口实现。

代码如下:

/**
 * 代理工具方法,可以为任意接口生成任意实例代理,该方式使用在了mybatis的Mapper接口映射Mapper.xml中,具体在     MapperProxyFactory
 * @param tClass
 * @param invocationHandler
 * @param <T>
 * @return
 */
public <T> T test4(Class<T> tClass, InvocationHandler invocationHandler) {
   T t = (T) Proxy.newProxyInstance(tClass.getClassLoader(), new Class[] {tClass},invocationHandler);
   return t;
}
@Test
public void test6() {
   UserMapper userMapper = test4(UserMapper.class, new InvocationHandler() {
      @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         System.out.println("查询所有");
         return null;
      }
   });
   userMapper.getAll();
}

UserMapper为接口,上面的代码就直接生成了UserMapper的实现。

执行结果:

可以看到我们已经成功生成了UserMapper的实现,方法也正常执行了。

mybatis正是使用了该特性进行Mapper接口与Mapper.xml进行映射。

mybatis代码如下:

具体方法映射在mapperProxy的invoke方法中完成。 如下

进而到MapperMethod中,如下:

然后是SqlCommand,如下:

继续往下:

statementId就是我们的接口完全限定名加方法名。获取对应的MappedStatement后,进行下一步处理。这里我们肯定会想,这个MappedStatement是怎么生成的,生成就是在解析Mapper.xml时生成的,代码如下:

上面的id就是namespace+ select,update,delete,insert的id。

从这里也可以看到我们Mapper.xml的namespace必须的是Mapper接口的完全限定名,select,update,delete,insert的id也必须是接口的方法名。否则使用接口去映射时就会报错。

xml解析完毕后,就调用如下方法,生成接口的代理类,并将接口中方法上的mybatis注解,生成MappedStatement,代码如下

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中SpringCloud的五大组件详解

    Java中SpringCloud的五大组件详解

    这篇文章主要介绍了Java中SpringCloud的五大组件详解,Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务,需要的朋友可以参考下
    2023-07-07
  • Linux配置jdk1.8与jdk17兼容并存并启动jar包指定jdk版本

    Linux配置jdk1.8与jdk17兼容并存并启动jar包指定jdk版本

    JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序,这篇文章主要给大家介绍了关于Linux配置jdk1.8与jdk17兼容并存并启动jar包指定jdk版本的相关资料,需要的朋友可以参考下
    2024-08-08
  • 有关于整体刷新和局部刷新frameset窗口

    有关于整体刷新和局部刷新frameset窗口

    本篇小编为大家介绍有关于整体刷新和局部刷新frameset窗口的方法,希望对有需要的朋友有所帮助。
    2013-04-04
  • springboot jackson配置教程

    springboot jackson配置教程

    这篇文章主要介绍了springboot jackson配置教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 基于微信签名signature获取(实例讲解)

    基于微信签名signature获取(实例讲解)

    下面就为大家带来一篇基于微信签名signature获取(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • spring整合redis以及使用RedisTemplate的方法

    spring整合redis以及使用RedisTemplate的方法

    本篇文章主要介绍了spring整合redis以及使用RedisTemplate的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaWeb实现简单文件上传功能

    JavaWeb实现简单文件上传功能

    这篇文章主要为大家详细介绍了JavaWeb实现简单文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java基于ServletContextListener实现UDP监听

    Java基于ServletContextListener实现UDP监听

    这篇文章主要介绍了Java基于ServletContextListener实现UDP监听,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Gitlab CI-CD自动化部署SpringBoot项目的方法步骤

    Gitlab CI-CD自动化部署SpringBoot项目的方法步骤

    本文主要记录如何通过Gitlab CI/CD自动部署SpringBoot项目jar包。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • jvm双亲委派 vs 破坏双亲委派理解加载器的权责分配

    jvm双亲委派 vs 破坏双亲委派理解加载器的权责分配

    这篇文章主要为大家介绍了jvm双亲委派 vs 破坏双亲委派对比来理解加载器的权责分配,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论