遇到一个很神奇的 mybatis 问题,各位大佬帮忙看看 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Geek4Ever
V2EX    Java

遇到一个很神奇的 mybatis 问题,各位大佬帮忙看看

  •  
  •   Geek4Ever 2024-04-15 00:29:03 +08:00 2766 次点击
    这是一个创建于 543 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到一个很神奇的 mybatis 问题,各位大佬帮忙看看
    在使用 mybatis 根据主键更新数据的时候,使用 updateByPrimaryKeySelective 方法。更新的实体上打了主键标签(@Id ),主键 id 也不是 null ,但是就更新不了数据。
    23 条回复    2024-04-16 15:29:02 +08:00
    waterlaw
        1
    waterlaw  
       2024-04-15 00:32:48 +08:00 via Android
    mybatis 什么版本不说一下
    Geek4Ever
        2
    Geek4Ever  
    OP
       2024-04-15 00:34:36 +08:00
    @waterlaw <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
    </dependency>

    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
    </dependency>

    <dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>4.1.5</version>
    </dependency>
    Geek4Ever
        3
    Geek4Ever  
    OP
       2024-04-15 00:39:14 +08:00
    SQL 日志打印出来居然不是根据主键 id 更新:
    Preparing: UPDATE admin SET name = ?,password = ?,age = ?,sex = ?,phOne= ? WHERE name = ? AND password = ? AND age = ? AND sex = ? AND phOne= ?
    waterlaw
        4
    waterlaw  
       2024-04-15 00:56:09 +08:00
    @NiceGeekJasonChu 实体类和 Mapper 看下,tkmybatis 没用过
    Geek4Ever
        5
    Geek4Ever  
    OP
       2024-04-15 00:58:39 +08:00
    @waterlaw #4
    @Table(name = "admin")
    public class Admin {

    /**
    * 主键 id
    */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
    * 用户名
    */
    @Column(name = "name")
    private String name;

    /**
    * 密码
    */
    @Column(name = "password")
    private String password;
    }
    waterlaw
        6
    waterlaw  
       2024-04-15 01:01:22 +08:00
    @NiceGeekJasonChu Mapper 直接使用这个实体类 Admin 吗?还需要配置 Admin 的扫描路径吗
    waterlaw
        7
    waterlaw  
       2024-04-15 01:09:33 +08:00
    我这边更新成功了 ,id 列加下注解 @Column
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    waterlaw
        8
    waterlaw  
       2024-04-15 01:11:27 +08:00
    不加 @Column 注解也是更新成功的,mybatis-spring-boot-starter 和 mapper 的版本和你一样
    waterlaw
        9
    waterlaw  
       2024-04-15 01:14:30 +08:00
    create table admin(id int(32) primary key, name varchar(20)); 必须声明主键,否则更新失败。
    waterlaw
        10
    waterlaw  
       2024-04-15 01:50:33 +08:00
    不是主键也更新成功了。create table admin(id int(32), name varchar(20));
    RedBeanIce
        11
    RedBeanIce  
       2024-04-15 06:33:02 +08:00 via iPhone
    你的注解不是 mybatis 的。
    RedBeanIce
        12
    RedBeanIce  
       2024-04-15 08:05:51 +08:00
    @RedBeanIce 我错了,,请使用 mybatisplus 吧,tk mapper 不行了。
    Geek4Ever
        13
    Geek4Ever  
    OP
       2024-04-15 08:09:13 +08:00 via iPhone
    @waterlaw 不加 @Column 注解应该也是可以的,但是我就不行,不知道哪里出了问题
    forest997
        14
    forest997  
       2024-04-15 10:24:29 +08:00
    是不是 @Id 用成了别的包的,正确的是 javax.persistence 包的,mapper.xml 的 resultMap 里面有没有配<id>
    forest997
        15
    forest997  
       2024-04-15 10:25:40 +08:00
    @forest997 #14 mapper.xml 的 resultMap 里面有没有配“<id>”
    forest997
        16
    forest997  
       2024-04-15 10:27:47 +08:00
    @forest997 #15 是 id 标签,怎么老被吞
    pangdundun996
        17
    pangdundun996  
       2024-04-15 10:29:42 +08:00
    debug 看看 sql 生成逻辑,这种估计是内部注解处理的问题
    Geek4Ever
        18
    Geek4Ever  
    OP
       2024-04-15 14:08:57 +08:00 via iPhone
    @forest997 这个我检查过了,是 javax. persistence
    Geek4Ever
        19
    Geek4Ever  
    OP
       2024-04-15 14:10:40 +08:00 via iPhone
    @pangdundun996 debug 过了,日志也打了,where 条件里面压根就没有 id ,打印日志我上面发过
    Geek4Ever
        20
    Geek4Ever  
    OP
       2024-04-15 21:32:54 +08:00
    问题找到了,我在主键上加上 @Column(name = "id")注解,就能更新成功。但是我看有的人没有加这个注解,也能更新成功。
    xuanbg
        21
    xuanbg  
       2024-04-16 04:23:01 +08:00
    你这是表没有主键吧
    pangdundun996
        22
    pangdundun996  
       2024-04-16 09:50:23 +08:00
    @NiceGeekJasonChu 我意思是你看看生成 sql 的逻辑,看框架是怎么处理注解的
    Geek4Ever
        23
    Geek4Ever  
    OP
       2024-04-16 15:29:02 +08:00 via iPhone
    @xuanbg 表是建了主键的,就是实体上主键 id 没有加 @Column 注解。实体上加了就正常了,但是我看有的人没加也能成功,我不加就不行
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3016 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 12:06 PVG 20:06 LAX 05:06 JFK 08:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86