1. 程式人生 > 實用技巧 >MyBatisPlus配置日誌,CRUD的使用

MyBatisPlus配置日誌,CRUD的使用

配置日誌

我們所有的sqlmybatisplus是不可見的,所以在開發中需要配置日誌,開發完成後,就可以取消日誌了,因為日誌也是損耗資源的

#配置日誌
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #僅控制檯輸出的日誌


配置完日誌後,後面的學習就需要注意自動生成的SQL,相信你們會喜歡上MybatisPlus

CRUD使用

Insert插入

    //測試插入
    @Test
    public void testInsert(){
        Air air = new Air();
        air.setDistrictId(4);
        air.setLastModifyTime(new Date());
        air.setMonitoringStation("哈哈哈哈哈哈");
        air.setMonitorTime(new Date());
        air.setPm10(33);
        air.setPm25(65);
        airMapper.insert(air);
        System.out.println(air);
    }

這裡可以看出系統幫我們自動生成了一個id

因為我資料庫設定的自增的,我把自增取消

再看一下插入結果,發現標紅了,因為預設會插入0為主鍵的id,我之前有一個0所以插入失敗

有的人的id如果是Lang型別的可能會預設插入很長的一段數字作為id,這裡是雪花演算法所生成的隨機數,全球唯一(全域性唯一id)
對應資料庫中的主鍵(uuid,自增id,雪花演算法,redis,zookeeper)

主鍵生成策略

Twittersnowflake演算法(雪花演算法)

snowflakeTwitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。

要想設定主鍵的增加方式可以加入註解@TableId,因為是列舉類所以後面有很多方式

更新操作

 //測試更新
    @Test
    public void testUpdate(){
        Air air = new Air();
        air.setId(9L);
        air.setDistrictId(4);
        air.setLastModifyTime(new Date());
        air.setMonitoringStation("哈");
        air.setMonitorTime(new Date());
        air.setPm10(33);
        air.setPm25(65);
        airMapper.updateById(air);
    }

因為像new Date()這種在程式碼中出現,顯得很low而且消耗資源,我們可以使用註解的方式:

自動填充

建立時間,修改時間這些個操作一般都是自動化完成的不希望手動更新
阿里巴巴研發手冊: 所有的資料庫表:gmt_create,gmt_modified(格林尼治時間)

方式一:資料庫方式(工作中一般是不允許修改資料庫的,因為牽扯的問題很多很複雜特別容易出bug還找不出來)

  1. 在表中的這兩個表,就是建立和修改時間
  2. 打鉤自動更新當前時間

如果還有自己手寫日期的小夥伴,以後你就不用一個一個添加了

程式碼級別

  1. 刪除資料庫預設值
  2. 實體類的欄位屬性上需要增加註釋@TableField

原始碼如下,可以看到fill的方法就是填充方法

public class Air {
  @TableId(type = IdType.ASSIGN_ID)
  private Long id;
  private long districtId;
  @TableField(fill = FieldFill.INSERT) //插入的時候更新插入時間
  private Date monitorTime;
  private long pm10;
  private long pm25;
  private String monitoringStation;
  @TableField(fill = FieldFill.INSERT_UPDATE) //更新和插入的時候都更新時間
  private Date lastModifyTime;
}

當然填充策略可以重寫,進行自定義填充策略

首先建立一個MyMetaObjectHandler類(名字隨便)

@Slf4j  //抓取日誌
@Component  //SpringBoot的註解 ,一定不要忘了吧處理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill");
//原始碼: setFieldValByName(String fieldName(欄位名), Object fieldVal(欄位值), MetaObject metaObjec(物件))
        this.setFieldValByName("monitor_time",new Date(),metaObject);
        this.setFieldValByName("last_modify_time",new Date(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("Start update fill....");
        this.setFieldValByName("last_modify_time",new Date(),metaObject);
    }
}

測試

增加:

更新