mybatis-mapper / mapper

MyBatis Mapper
https://mapper.mybatis.io
Apache License 2.0
326 stars 48 forks source link

insert没有回写自动编号 #12

Closed yongfa365 closed 2 years ago

yongfa365 commented 2 years ago

@GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "[ID]", insertable = false, updatable = false) private Integer ID;

当设置这个就可以了 @Options(useGeneratedKeys = true, keyProperty = "ID") 这个属于元数据,能不能从Entity里自动解析,不然可能每个Mapper都得改下这个

abel533 commented 2 years ago

默认是没有的。。需要你创建一个基类接口覆盖默认的方法配置。

yongfa365 commented 2 years ago

可以给写个demo吗,或者给个切入点的思路,何时从entity解析并最终insert后回写 or 初始化的时候改掉放入MappedStatement的keyProperty的设置

abel533 commented 2 years ago

参考文档这部分:https://mapper.mybatis.io/docs/2.mybatis-mapper.html#_2-2-%E9%87%8D%E5%86%99%E7%BB%A7%E6%89%BF%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%AE%9A%E4%B9%89

abel533 commented 2 years ago

建议完整看一遍第2节的内容

yongfa365 commented 2 years ago

这个我有细看过,方案是在各个Mapper接口里重写,加上自己的Options @Options(useGeneratedKeys = true, keyProperty = "{tablename}Id") 但这个就是在Mapper里处理了,如果能用Entity的注解实现那Mapper就干净了。不然几百个不好处理

当前的方案更通用,代价是特定场景使用会有点麻烦,因为我使用时只有SqlServer及Mysql

abel533 commented 2 years ago

不是在各个Mapper接口重写。。通用的情况下,建一个自己的 MyMapper 基类接口配置。。其他接口都继承这个接口。

yongfa365 commented 2 years ago

不通用,自动编号都是类似{tablename}Id这样的。这种能写个通用的处理的demo吗?如何从entity拿到这个id及赋值给keyProperty,不然无法下爪

yongfa365 commented 2 years ago

题外话:一个组件并不一定非要各个点都做到通用吧,如:80%人用MySQL,那是不是可以向他倾斜下,5%用Oracle是不是可以牺牲下或将就下。

abel533 commented 2 years ago

不通用的情况下建议通过代码生成器生成所有基础代码。

之所以通过注解配置,是为了不对 MyBatis 做太多侵入性的改动,让使用更可靠。

可以倾斜,不是在基础模块。。可以增加 mysql, oracle 等专用模块。

yongfa365 commented 2 years ago

这个想法好,模块化,可以逐个精进

abel533 commented 2 years ago

代码生成器可以看看这里demo: https://github.com/mybatis-mapper/mybatis-mapper-example-springboot

abel533 commented 2 years ago

sharding-jdbc 示例,有分片,主键各不相同: https://github.com/mybatis-mapper/mybatis-mapper-example-springboot/tree/shardingsphere