映射數據庫的表名java
package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import com.md.enums.StatusEnum; import lombok.Data; import java.util.Date; /** * @author md * @Desc * @date 2020/10/26 15:38 */ @Data @TableName(value = "student") public class Student { private Integer id; private String name; private Integer age; }
設置主鍵映射,value 映射主鍵字段名算法
type 設置主鍵類型,主鍵的生成策略spring
AUTO(0), NONE(1), INPUT(2), ASSIGN_ID(3), ASSIGN_UUID(4), /** @deprecated */ @Deprecated ID_WORKER(3), /** @deprecated */ @Deprecated ID_WORKER_STR(3), /** @deprecated */ @Deprecated UUID(4);
值 | 描述 |
---|---|
AUTO | 數據庫自增 |
NONE | MP set 主鍵,雪花算法實現 |
INPUT | 須要開發者手動賦值 |
ASSIGN_ID | MP 分配 ID,Long、Integer、String |
ASSIGN_UUID | 分配 UUID,Strinig |
INPUT 若是開發者沒有手動賦值,則數據庫經過自增的方式給主鍵賦值,若是開發者手動賦值,則存入該值。sql
AUTO 默認就是數據庫自增,開發者無需賦值。數據庫
ASSIGN_ID MP 自動賦值,雪花算法。apache
ASSIGN_UUID 主鍵的數據類型必須是 String,自動生成 UUID 進行賦值安全
// 本身賦值 //@TableId(type = IdType.INPUT) // 默認使用的雪花算法,長度比較長,因此使用Long類型,不用本身賦值 @TableId private Long id;
測試mybatis
@Test void save(){ // 因爲id加的有註解,這裏就不用賦值了 Student student = new Student(); student.setName("天明"); student.setAge(18); mapper.insert(student); }
映射非主鍵字段,value 映射字段名app
exist 表示是否爲數據庫字段 false,若是實體類中的成員變量在數據庫中沒有對應的字段,則可使用 exist,VO、DTO框架
select 表示是否查詢該字段
fill 表示是否自動填充,將對象存入數據庫的時候,由 MyBatis Plus 自動給某些字段賦值,create_time、update_time
一、給表添加 create_time、update_time 字段
二、實體類中添加成員變量
package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import com.md.enums.StatusEnum; import lombok.Data; import java.util.Date; @Data @TableName(value = "student") public class Student { @TableId private Long id; // 當該字段名稱與數據庫名字不一致 @TableField(value = "name") private String name; // 不查詢該字段 @TableField(select = false) private Integer age; // 當數據庫中沒有該字段,就忽略 @TableField(exist = false) private String gender; // 第一次添加填充 @TableField(fill = FieldFill.INSERT) private Date createTime; // 第一次添加的時候填充,但以後每次更新也會進行填充 @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
三、建立自動填充處理器
注意:不要忘記添加 @Component 註解
package com.md.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; /** * @author md * @Desc 對實體類中使用的自動填充註解進行編寫 * @date 2020/10/26 17:29 */ // 加入註解才能生效 @Component 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); } }
四、測試
@Test void save(){ // 因爲id加的有註解,這裏就不用賦值了 Student student = new Student(); student.setName("韓立"); student.setAge(11); // 時間自動填充 mapper.insert(student); }
五、更新
當該字段發生變化的時候時間會自動更新
@Test void update(){ Student student = mapper.selectById(1001); student.setName("韓信"); mapper.updateById(student); }
標記樂觀鎖,經過 version 字段來保證數據的安全性,當修改數據的時候,會以 version 做爲條件,當條件成立的時候纔會修改爲功。
version = 2
線程 1:update ... set version = 2 where version = 1
線程2 :update ... set version = 2 where version = 1
一、數據庫表添加 version 字段,默認值爲 1
二、實體類添加 version 成員變量,而且添加 @Version
package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import com.md.enums.StatusEnum; import lombok.Data; import java.util.Date; @Data @TableName(value = "student") public class Student { @TableId private Long id; @TableField(value = "name") private String name; @TableField(select = false) private Integer age; @TableField(exist = false) private String gender; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; @Version private Integer version; //版本號 }
三、註冊配置類
在 MybatisPlusConfig 中註冊 Bean
package com.md.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author md * @Desc * @date 2020/10/26 20:42 */ @Configuration public class MyBatisPlusConfig { /** * 樂觀鎖 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } }
一、通用枚舉類註解,將數據庫字段映射成實體類的枚舉類型成員變量
package com.southwind.mybatisplus.enums; import com.baomidou.mybatisplus.annotation.EnumValue; public enum StatusEnum { WORK(1,"上班"), REST(0,"休息"); StatusEnum(Integer code, String msg) { this.code = code; this.msg = msg; } @EnumValue private Integer code; private String msg; }
package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import com.md.enums.StatusEnum; import lombok.Data; import java.util.Date; @Data @TableName(value = "student") public class Student { @TableId private Long id; @TableField(value = "name") private String name; @TableField(select = false) private Integer age; @TableField(exist = false) private String gender; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; @Version private Integer version; private StatusEnum status; }
數據庫中新增一個status字段,
二、在主配置文件中
# 枚舉包掃描 mybatis-plus.type-enums-package=com.md.enums
映射邏輯刪除,並非真正的刪除
一、數據表添加 deleted 字段,默認是0
二、實體類添加註解
package com.md.entity; import com.baomidou.mybatisplus.annotation.*; import com.md.enums.StatusEnum; import lombok.Data; import java.util.Date; @Data @TableName(value = "student") public class Student { @TableId private Long id; @TableField(value = "name") private String name; @TableField(select = false) private Integer age; @TableField(exist = false) private String gender; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; @Version private Integer version; private StatusEnum status; @TableLogic private Integer deleted; }
三、主配置文件中添加配置
# 沒有刪除爲0,刪除了爲1 mybatis-plus.global-config.db-config.logic-not-delete-value=0 mybatis-plus.global-config.db-config.logic-delete-value=1
四、在 MybatisPlusConfig 中註冊 Bean
配置類
@Configuration public class MyBatisPlusConfig { /** * 樂觀鎖 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } /** * 邏輯刪除 */ @Bean public ISqlInjector sqlInjector() { return new LogicSqlInjector(); } }
刪除的時候不是真正的刪除數據庫表中的數據,而是改變delete字段的值,固然了查詢的時候也是查詢delete=0,這都是框架自動實現的