Hello! 欢迎来到小浪资源网!


Mybatis报错“Invalid bound statement”,如何快速定位到调用delete语句的代码?


Mybatis报错“Invalid bound statement”,如何快速定位到调用delete语句的代码?

如何通过提示定位到调用 delete 的代码?

在本例中,控制台输出指出了一个 invalid bound statement (not found) 异常,它表明 mybatis 找不到名为 delete 的绑定语句。

定位调用 delete 的代码:

异常信息中最有用的部分是:

at com.mooc.house.biz.service.mailservice$1.onremoval(mailservice.Java:34)

这表明 delete 正在由 mailservice.java 中的 onremoval 方法调用。

分析代码:

mailservice.java 中的 enable 方法使用了 guava 的缓存,并指定了在移除缓存项时调用 onremoval 的移除侦听器。

private final Cache<String, String> registerCache = CacheBuilder.newBuilder()     .maximumSize(100)     .expireAfteraccess(15, TimeUnit.MINUTES)     .removalListener(new RemovalListener<String, String>() {         @Override         public void onRemoval(RemovalNotification<String, String> notification) {             userMapper.delete(notification.getValue());         }     })     .build();

当缓存项被移除时,移除侦听器回调 usermapper.delete(notification.getvalue()),这会删除与该缓存项关联的记录。

因此,在你的情况下,似乎是 registercache.invalidate(key) 使缓存无效并导致 onremoval 被调用,最终触发了对 usermapper.delete 的调用,从而删除了用户记录。

相关阅读