1.背景
主要是要實現一個id字段的自增長,不依賴數據庫的能力(已避免后續換庫的問題)。姑且使用redis作為表的id分配器,因此使用MyBatis-Plus MetaObjectHandler對每個insert的id進行分配。
2.實施過程
以下是實現過程
1.實現MetaObjectHandler,重寫insertFill,設置id
2.Configuration中實例化MetaObjectHandler
public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {Long id = getIdFromRedis(); //redis取idthis.setFieldValByName("id", id, metaObject); //給id字段設置取得的主鍵值}@Overridepublic void updateFill(MetaObject metaObject) {//其他操作}
}
//Configuration中獲取MetaObjectHandler
@Configuration(proxyBeanMethods = false)
public class MybatisAutoConfiguration implements WebMvcConfigurer {@Beanpublic MybatisPlusMetaObjectHandler mybatisPlusMetaObjectHandler() {return new MybatisPlusMetaObjectHandler();}
}
3.使用mybatis-plus的mapper內的save或者saveBatch方法
*4.需要注意的是對應實體類需要加上insert fill注解
@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;private String fieldTest;
}
3.出現的問題
按上述方式實現后出現沒有進入
insertFill的情況,
后來發現實體類只在id字段上加@TableField(fill= FieldFill.INSERT)是不會進insertFill的
因此嘗試
@Data
@TableName("TEST")
public class Test {@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}
在另一個字段上加上@TableField(fill= FieldFill.INSERT)
然后成功進入了insertFill,也對id進行了賦值,但是最后生成的sql
居然沒有id字段
居然沒有id字段
居然沒有id字段
是的,明明都已經走了對id的賦值,但生產的sql就是沒有id字段賦值
4.最終解決
@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;@TableField(fill= FieldFill.INSERT) private String fieldTest;
}
最后是在id上加上@TableId(type = IdType.INPUT)使id字段的type是input,才成功實現了id從redis取這個功能
5.反思
然后我又嘗試了以下代碼
@Data
@TableName("TEST")
public class Test {@TableId(type = IdType.INPUT)@TableField(fill= FieldFill.INSERT)private Long id;//@TableField(fill= FieldFill.INSERT) private String fieldTest;
}
把其他字段上的@TableField(fill= FieldFill.INSERT) 去了 。。。然后又不會進入insertFill了
目測mybatis-plus源碼的判斷是,先判斷是否存在非id字段需要走@TableField(fill= FieldFill.INSERT),才會進入insertFill,
然后判斷設置填充的字段是否是id,且id有沒有配置自定義Input
6.結論
本質上是id字段是mybatis-plus中的保留字段,一般需要配置@TableId,然后@TableId和@TableField(fill= FieldFill.INSERT)存在沖突。沒有去看源碼,但大概現象如此。