這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在mybatis-plus中生成主鍵id,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)桐城,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108數(shù)據(jù)庫(kù)表里通常都會(huì)有一個(gè)主鍵id,來作為這條數(shù)據(jù)的標(biāo)識(shí)。
常見的方式
1.數(shù)據(jù)庫(kù)自動(dòng)增長(zhǎng)
這種很常見了,可以做到全庫(kù)。因?yàn)閕d是天然排序的,對(duì)于涉及到排序的操作會(huì)很方便。
2.UUID
上面的自動(dòng)增長(zhǎng),雖然簡(jiǎn)單,但是對(duì)于分表這樣的操作來說就比較麻煩。因?yàn)槟阍诘诙埐迦霐?shù)據(jù)的時(shí)候,需要拿到上一張表最后一個(gè)數(shù)據(jù)的id。
UUID則不同,每次都一個(gè)隨機(jī)的值,不過因?yàn)槭请S機(jī),所以也就沒有排序了。
3.redis
redis也可以用來生成id,利用redis的原子操作。好處是可以不依賴數(shù)據(jù)庫(kù),性能好,但是隨之因?yàn)閞edis的引入,帶來了一定的復(fù)雜度。
其實(shí)在之前使用mp進(jìn)行新增數(shù)據(jù)的時(shí)候,我并沒有進(jìn)行對(duì)應(yīng)的配置,默認(rèn)就會(huì)帶有主鍵id。
對(duì)其配置也很簡(jiǎn)單,在主鍵上加注解,@TableId(type = IdType.ID_WORKER)
@Data public class User { @TableId(type = IdType.ID_WORKER) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) // 新增的時(shí)候update也有值 private Date updateTime; }
在idea編輯器里,可以按住ctrl+鼠標(biāo)左擊,看到IdType
的幾個(gè)枚舉值。
AUTO
:就是利用數(shù)據(jù)庫(kù)自增了
NONE
:未設(shè)置,需要手動(dòng)設(shè)置值
INPUT
: 需要手動(dòng)設(shè)置值
UUID
:生成UUID類型的主鍵id
ID_WORKER
:生成19位的值,數(shù)字類型
ID_WORKer_STR
:生成19位的值,字符串類型
關(guān)于mp的這個(gè)19位值的生成,可以做個(gè)了解,利用了snowflake算法。
snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個(gè)long型的ID。
其核心思想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個(gè)bit是數(shù)據(jù)中心,5個(gè)bit的機(jī)器ID),
12bit作為毫秒內(nèi)的流水號(hào)(意味著每個(gè)節(jié)點(diǎn)在每毫秒可以產(chǎn)生 4096 個(gè) ID),最后還有一個(gè)符號(hào)位,永遠(yuǎn)是0。
在操作數(shù)據(jù)庫(kù)的時(shí)候還有一種常見操作,就是一些字段的填充,比如常見的create_time、update_time等,填充方式都是相同的。
那么除了每次的手動(dòng)填充,還可以自動(dòng)填充。而在MP里設(shè)置自動(dòng)填充只要2步即可:
1.添加注解
@TableField(fill = FieldFill.INSERT)
、@TableField(fill = FieldFill.INSERT_UPDATE)
。
@Data public class User { @TableId(type = IdType.ID_WORKER) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) // 新增的時(shí)候填充數(shù)據(jù) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) // 新增或修改的時(shí)候填充數(shù)據(jù) private Date updateTime; }
2.自定義實(shí)現(xiàn)類 MyMetaObjectHandler
這里需要我們自己寫一個(gè)實(shí)現(xiàn)類
@Component //此注解表示 將其交給spring去管理 public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime", new Date(), metaObject); this.setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime", new Date(), metaObject); } }
對(duì)了,要在數(shù)據(jù)庫(kù)表里增加對(duì)應(yīng)的字段create_time
、update_time
。添加后可以試一下了,先來新增一條測(cè)試數(shù)據(jù):
// 新增 @Test void addUser() { User user = new User(); user.setName("老王"); user.setAge(66); user.setEmail("laowang@123.com"); userMapper.insert(user); }
執(zhí)行成功后查看數(shù)據(jù)庫(kù)表:
新增的時(shí)候,2個(gè)字段都填充了時(shí)間。
那現(xiàn)在只做更新操作的時(shí)候,只會(huì)去更新update_time。
// 修改 @Test void updateUser() { User user = new User(); user.setId(1342322873243996161L); user.setName("老王修改后"); userMapper.updateById(user); }
上述就是小編為大家分享的怎么在mybatis-plus中生成主鍵id了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。