映射数据库的表名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,这都是框架自动实现的