數據庫表裏一般都會有一個主鍵id,來做爲這條數據的惟一標識。redis
數據庫自動增加
這種很常見了,能夠作到全庫惟一。由於id是自然排序的,對於涉及到排序的操做會很方便。算法
UUID
上面的自動增加,雖然簡單,可是對於分表這樣的操做來講就比較麻煩。由於你在第二張插入數據的時候,須要拿到上一張表最後一個數據的id。
UUID則不一樣,每次都一個隨機惟一的值,不過由於是隨機,因此也就沒有排序了。spring
redis
redis也能夠用來生成id,利用redis的原子操做。好處是能夠不依賴數據庫,性能好,可是隨之由於redis的引入,帶來了必定的複雜度。數據庫
其實在以前使用mp進行新增數據的時候,我並無進行對應的配置,默認就會帶有主鍵id。mybatis
對其配置也很簡單,在主鍵上加註解,@TableId(type = IdType.ID_WORKER)
app
@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) // 新增的時候update也有值 private Date updateTime; }
在idea編輯器裏,能夠按住ctrl+鼠標左擊,看到IdType
的幾個枚舉值。編輯器
AUTO
:就是利用數據庫自增了NONE
:未設置,須要手動設置值INPUT
: 須要手動設置值UUID
:生成UUID類型的主鍵idID_WORKER
:生成19位的值,數字類型ID_WORKer_STR
:生成19位的值,字符串類型關於mp的這個19位值的生成,能夠作個瞭解,利用了snowflake算法。
snowflake是Twitter開源的分佈式ID生成算法,結果是一個long型的ID。
其核心思想是:使用41bit做爲毫秒數,10bit做爲機器的ID(5個bit是數據中心,5個bit的機器ID),
12bit做爲毫秒內的流水號(意味着每一個節點在每毫秒能夠產生 4096 個 ID),最後還有一個符號位,永遠是0。分佈式
在操做數據庫的時候還有一種常見操做,就是一些字段的填充,好比常見的create_time、update_time等,填充方式都是相同的。
那麼除了每次的手動填充,還能夠自動填充。而在MP裏設置自動填充只要2步便可:ide
@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) // 新增的時候填充數據 private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) // 新增或修改的時候填充數據 private Date updateTime; }
這裏須要咱們本身寫一個實現類
@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); } }
對了,要在數據庫表裏增長對應的字段create_time
、update_time
。添加後能夠試一下了,先來新增一條測試數據:
// 新增 @Test void addUser() { User user = new User(); user.setName("老王"); user.setAge(66); user.setEmail("laowang@123.com"); userMapper.insert(user); }
執行成功後查看數據庫表:
新增的時候,2個字段都填充了時間。
那如今只作更新操做的時候,只會去更新update_time。
// 修改 @Test void updateUser() { User user = new User(); user.setId(1342322873243996161L); user.setName("老王修改後"); userMapper.updateById(user); }
結果正確。