MyBatis 删除语句怎么都不成功,请教原因(第一次 MyBatis 失败,完全摸不着原因)

2023-04-19 10:18:05 +08:00
 nnegier

前置说明:那条语句我直接放在 MySQL 的命令行是可以执行成功的,但是用 MyBatis 就死活成功不了,也不报错,我怀疑是我字符串用=进行比较的问题,因为这是我第一次 where 等号比较字符串,但是我又排除掉了,因为 MySQL 命令行是正常的

@Delete("DELETE FROM nfc WHERE userId = #{userId} AND clientNFCID = #{clientNFCID}")
void delete(long userId,String clientNFCID);
@Data
public class NFC {
    private long id;
    private int clientPID;
    private String name;
    private String clientNFCID;
    private long userId;
    private long modifyTime;
}

反复测试过数次,代码中均无一次成功,下面是它的 DEBUG 信息,可以很清楚的看到有那行数据,但就是没能成功:

==>  Preparing: DELETE FROM nfc WHERE userId = ? AND clientNFCID = ?
==> Parameters: 100000(Long), "1680752050984"(String)
<==    Columns: id, clientPID, name, clientNFCID, userId, modifyTime
<==        Row: 1, 84, 已绑定(点击可设置 NFC 别名), 1680690088680, 100000, 1
<==        Row: 2, 39, 已绑定(点击可设置 NFC 别名), 1680752050984, 100000, 1
<==        Row: 3, 6, 已绑定(点击可设置 NFC 别名), 1681868857387, 100000, 1681868857560
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@55fee772]
<==    Updates: 0
1509 次点击
所在节点    Java
10 条回复
fangxisama
2023-04-19 10:20:23 +08:00
引号?
alteremliu
2023-04-19 10:22:44 +08:00
delete 的条件需要用 where 啊,delete 是实质上是一个 select 语句,and 是什么意思
zhongjun96
2023-04-19 10:22:53 +08:00
alteremliu
2023-04-19 10:23:38 +08:00
@alteremliu 抱歉,看错语句
Achieve7
2023-04-19 10:26:05 +08:00
你传递的是 "1680752050984" 不是 字符串 1680752050984 多了引号 所以查不到数据
wetalk
2023-04-19 11:11:16 +08:00
数字和字符串,数字类型字符串,MySQL 本身可以转换,不用特意框起来,MyBatis 可能有这个问题
ccw4wcc
2023-04-19 11:11:35 +08:00
@zhongjun96 请问一下,这个插件是叫啥?可以分享一下吗
ofblyt
2023-04-19 11:17:21 +08:00
从您提供的调试信息来看,SQL 语句已经准备好并执行,但是没有删除任何记录( Updates: 0 )。这意味着 SQL 语句在数据库中没有找到与给定参数相匹配的记录。这可能是由于以下原因导致的:

请检查您的 nfc 表中是否确实存在与给定参数匹配的记录。在此示例中,您需要确保有一个记录的 userId 为 100000 ,且 clientNFCID 为 "1680752050984"。您可以在 MySQL 客户端中执行以下 SQL 语句来检查:
sql
Copy code
SELECT * FROM nfc WHERE userId = 100000 AND clientNFCID = '1680752050984';
如果此查询没有返回任何记录,那么这就是为什么 MyBatis 删除操作没有影响任何记录的原因。

如果上述查询返回了记录,请检查您的数据库事务设置。如果您使用的是事务管理器,请确保在执行删除操作之后正确地提交了事务。如果您没有使用事务管理器,您可能需要手动提交事务,例如:
java
Copy code
SqlSession session = sqlSessionFactory.openSession();
try {
YourMapperInterface mapper = session.getMapper(YourMapperInterface.class);
mapper.delete(100000, "1680752050984");
session.commit(); // Manually commit the transaction
} finally {
session.close();
}
请尝试上述建议,并确保表中有与给定参数匹配的记录以及正确地提交了事务。如果问题仍然存在,请随时提供更多信息。
zhongjun96
2023-04-19 11:25:53 +08:00
ccw4wcc
2023-04-19 14:12:15 +08:00
@zhongjun96 好的感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933663

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX