设计实例网站,交互式网站开发技术,动漫制作技术专业介绍,自己建的网站有乱码目录 #x1f378;前言
#x1f37b;一、背景
#x1f379;二、问题处理
#x1f49e;️三、处理方法 #x1f378;前言 小伙伴们大家好#xff0c;很久没有水..不是#xff0c;写文章了#xff0c;都收到系统的消息了#xff1b;我算下时间#xff0c;上周是单休…
目录 前言
一、背景
二、问题处理
️三、处理方法 前言 小伙伴们大家好很久没有水..不是写文章了都收到系统的消息了我算下时间上周是单休没时间在上周还在放假没家伙什再上周... 复工已经有一段时间了这篇文章就记录下前不久遇到的一个开发问题吧bushi 又水) 一、背景 看标题可以得知这个异常的情景在于 mapper 接口中使用重载方法场景如下 注本地项目使用的 mybatis 版本不是很高不清楚高版本中是否存在该问题 在本地调试新改动的部分时遇到一个奇怪的问题就是在 Mapper 接口中有一个方法是按照条件查询指定数据数量的有一定的概率会出现异常打印执行的 sql 日志后发现导致异常的 sql 并不是改动的那部分不清楚哪里来的 另外此异常不是百分百出现的有几次重启后是正常的这就很离谱埋头研究了半天放弃了 开始寻找同事帮助,对话基本如下 I:遇到个问题很奇怪帮忙瞅瞅出现的场景是... I:玄学我不信发我来瞅瞅 6 还真是清下缓存呢wtf会不会是自动优化查询导致的...不应该吧 ”这怎么还有个一样命名的方法(警惕)“ I: 破案了 一顿操作下来总算是定位到了异常 sql 的来源了是该 mapper 接口下的另一个同样名称的重载方法参数不同数量也不同但调用的的确是这个冒牌货
二、问题处理 通过网上查询此类型异常发现有很多帖子看了一两个之后可以确定出现的场景基本都一致就是程序运行中遇到这种 mapper 中重载方法时定位到错误的方法导致数据异常或者说程序报错类似于这种代码场景代码中指定的是第二个 方法但是实际运行时程序执行的是第一个方法导致异常
public interface UserMapper {Select(SELECT * FROM user WHERE id #{id})User selectUser(int id);Select(SELECT * FROM user WHERE name #{name} AND age #{age})User selectUser(String name, int age);
} 具体为什么会遇到这种原因看到了些参考 MyBatis通过动态代理实现Mapper接口生成代理类时可能无法正确处理重载方法因为代理类需要根据类型和方法名来确定调用哪个方法忽略掉了参数差异 可以看下这位博主的分析很详细定位到了关键代码
Mybatis和方法重载只能二选一_mybatis 方法重载-CSDN博客 这也验证了该异常不是百分百复现而是概率性闪现因为启动项目的时候这两个重载的方法谁会覆盖谁不确定
️三、处理方法 既然重载有一定概率导致异常那么不使用重载便是可以根据此次业务的需求来命名方法或者根据该方法的参数来命名方法尽量减少重复命名 文章到这里就结束了~