Mapper类中存在名称相同的方法重载报错问题

 更新时间:2023年03月31日 17:01:41   作者:HCW_wei  
这篇文章主要介绍了Mapper类中存在名称相同的方法重载报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mapper类中存在名称相同的方法重载报错

项目场景

官网项目开发

问题描述

Mapper类中存在名称相同的方法重载报错

为了省事,直接在mapper层通过@select@update等注解形式写sql (此时大都是单表查询没有创建mapper.xml文件)代码如下:

    @Update("")
    void updateSortBySort(Integer newSort, Integer platform, Integer classification);
    @Update("")
    void updateSortBySort(Integer oldSort, Integer newSort, Integer platform, Integer classification);

此时可以正常使用

接下来因为业务原因,需要进行多表查询,仅使用mybatis自带的不行,需要使用mapper.xml文件写sql脚本,进行多表查询

    @Update("")
    void updateSortBySort(Integer newSort, Integer platform, Integer classification);
    @Update("")
    void updateSortBySort(Integer oldSort, Integer newSort, Integer platform, Integer classification);
    IPage<List<ProductVo>> getlistPage(IPage<ProductVo> page,
                                              @Param("Param1")Integer Param1,
                                              @Param("Param2")Integer Param2);

此时调用第一个updateSortBySort方法的接口,会报一个“Parameter ‘oldSort’ not found 就是参数不存在的错误”

原因分析

找到了原因:在使用@Select等注解的情况下,方法名即为mapper的id,id相同。重载的方法会报这个错

假如项目启动时候通过反射获取mapper方法数组顺序先是在第一个

此时调用方法,正常,不会有问题;

因为mybatis查找mapper内的方法是靠方法名,和参数无关。方法名就是mapper.xml里面的id一样

当不进行方法的重载时,即:每个方法都有唯一的命名时,在xml中进行映射后,就可以执行,不会出现异常。

所以mybatis中mapper.xml是不会准确映射到Java中的重载方法的。最好不要在mapper接口中使用方法重载。

方法重载和方法重写的区别

方法的重载的规则

  • 方法名必须相同
  • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)
  • 方法的返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为方法的重载

重载就是在一个类中,有相同的函数名称,但形参不同的函数

方法名相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错

方法的重写

  • 方法名必须相同
  • 参数列表必须相同
  • 修饰符:范围可以扩大但不能缩小 :public>protect>default>private

重写:子类的方法和父类必须一致,方法体可以不同。需要有继承关系,子类重写父类方法

总结

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

相关文章

  • java byte数组与16进制间相互转换的示例

    java byte数组与16进制间相互转换的示例

    这篇文章主要介绍了java byte数组与16进制间相互转换的示例,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10
  • 浅谈Java中的参数传递问题

    浅谈Java中的参数传递问题

    这篇文章主要介绍了Java中的参数传递问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java并发(Runnable+Thread)实现硬盘文件搜索功能

    Java并发(Runnable+Thread)实现硬盘文件搜索功能

    这篇文章主要介绍了Java并发(Runnable+Thread)实现硬盘文件搜索,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Jmeter如何基于命令行运行jmx脚本

    Jmeter如何基于命令行运行jmx脚本

    这篇文章主要介绍了Jmeter如何基于命令行运行jmx脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • springmvc处理模型数据ModelAndView过程详解

    springmvc处理模型数据ModelAndView过程详解

    这篇文章主要介绍了springmvc处理模型数据ModelAndView过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 基于SpringBoot + Redis实现密码暴力破解防护

    基于SpringBoot + Redis实现密码暴力破解防护

    在现代应用程序中,保护用户密码的安全性是至关重要的,密码暴力破解是指通过尝试多个密码组合来非法获取用户账户的密码,为了保护用户密码不被暴力破解,我们可以使用Spring Boot和Redis来实现一些防护措施,本文将介绍如何利用这些技术来防止密码暴力破解攻击
    2023-06-06
  • idea创建springboot项目(版本只能选择17和21)的解决方法

    idea创建springboot项目(版本只能选择17和21)的解决方法

    idea2023创建spring boot项目时,java版本无法选择11,本文主要介绍了idea创建springboot项目(版本只能选择17和21),下面就来介绍一下解决方法,感兴趣的可以了解一下
    2024-01-01
  • mybatis返回类型map时如何将key大写转为小写

    mybatis返回类型map时如何将key大写转为小写

    这篇文章主要介绍了mybatis返回类型map时实现将key大写转为小写操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Mybatis实体类对象入参查询的笔记

    Mybatis实体类对象入参查询的笔记

    这篇文章主要介绍了Mybatis实体类对象入参查询的笔记,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 详解Java Map中三个冷门容器的使用

    详解Java Map中三个冷门容器的使用

    本篇文章主要讲解下Map家族中3个相对冷门的容器,分别是WeakHashMap、EnumMap、IdentityHashMap, 想必大家在平时的工作中也很少用到,或者压根不知道他们的特性以及适用场景,本篇文章就带你一探究竟
    2022-12-12

最新评论