V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Java

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

  •  
  •   nnegier · 2023-04-19 10:18:05 +08:00 · 1495 次点击
    这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前置说明:那条语句我直接放在 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
    
    第 1 条附言  ·  2023-04-19 11:14:15 +08:00
    各位是对的,确实目标参数多了双引号,查出原因是客户端使用 Retrofit 有误,需要添加 ScalarsConverterFactory ,且它的顺序应该在 GsonConverterFactory 前面才行:
    ```
    .addConverterFactory(ScalarsConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    ```
    fangxisama
        1
    fangxisama  
       2023-04-19 10:20:23 +08:00   ❤️ 2
    引号?
    alteremliu
        2
    alteremliu  
       2023-04-19 10:22:44 +08:00
    delete 的条件需要用 where 啊,delete 是实质上是一个 select 语句,and 是什么意思
    zhongjun96
        3
    zhongjun96  
       2023-04-19 10:22:53 +08:00   ❤️ 1
    alteremliu
        4
    alteremliu  
       2023-04-19 10:23:38 +08:00
    @alteremliu 抱歉,看错语句
    Achieve7
        5
    Achieve7  
       2023-04-19 10:26:05 +08:00   ❤️ 1
    你传递的是 "1680752050984" 不是 字符串 1680752050984 多了引号 所以查不到数据
    wetalk
        6
    wetalk  
       2023-04-19 11:11:16 +08:00
    数字和字符串,数字类型字符串,MySQL 本身可以转换,不用特意框起来,MyBatis 可能有这个问题
    ccw4wcc
        7
    ccw4wcc  
       2023-04-19 11:11:35 +08:00
    @zhongjun96 请问一下,这个插件是叫啥?可以分享一下吗
    ofblyt
        8
    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
        9
    zhongjun96  
       2023-04-19 11:25:53 +08:00
    ccw4wcc
        10
    ccw4wcc  
       2023-04-19 14:12:15 +08:00
    @zhongjun96 好的感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4679 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.