@TableName

  • 描述:表名注解,标识实体类对应的表,用来绑定实体类和表如果表名和类名一致可以省略
  • 使用位置:实体类
@TableName("tbl_product") //绑定表关系
public class Product {

如果每个表都是以固定前缀开头,可以全局配置表前缀

属性设置 > 全局设置: 如果使用了 @TableName 指定表名,则会忽略全局的表前缀

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_ #表前缀    #例如如果要找tbl_product表对应实体类,如果实体类并未指定表名但是类名为product,设置前缀为:tbl_ ,会自动匹配表tbl_product

@TableId

  • 描述:主键注解
  • 使用位置:实体类主键字段

如果大部分表主键都是自增,可以进行全局设置

属性上的优先级 > 全局设置

mybatis-plus:
  global-config:
    db-config:
      id-type: auto #主键策略
      table-prefix: tbl_ #表前缀

  关于主键策略 IdType


描述

AUTO

数据库 ID 自增,手动设置ID无效

NONE

默认值 无状态,和不添加@TableId注解效果一样,当手动设置主键id值,会按设置的值插入,若未手动设置值,会使用雪花算法成一个Long值作为主键。

INPUT

insert 前程序员自行 set 主键值,(如果没有手动设置ID值,则ID为null,使用数据库自增策略)

ASSIGN_ID

分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) 如果手动设置了id值,则使用手动设置的id,否则使用雪花算法生成一个Long类型值作为id

ASSIGN_UUID

分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法) 注意主键类型要是varchar类型,长度最少32位, id示例:b463ec84690de187e3f9ad9229327d15

@TableField

  • 描述:字段注解
  • 使用位置:实体类普通字段

属性

类型

默认值

描述

value

String

""

数据库字段名,如果同名可以省略

exist

boolean

true

是否为数据库表字段,如果表中没有该字段必须设置为false,CRUD都不会包含该字段

select

boolean

true

查询时是否查询该字段,如果设置为false,查询时不包含,但是insert、update、delete包含

fill

Enum

FieldFill.DEFAULT

字段自动填充策略,默认不会自动填充值

@TableField(value = "pname",select = false)//查询时不会查询该字段
private String name;

自动填充

当对应的属性没有值,执行 insert 或 update 操作自动给属性字段填充指定的值

应用场景:设置默认值,例如每次创建用户,后台程序中都需要设置创建时间、是否启用、用户等级...,这些字段就可以使用默认填充,不必每次都手动设置值

  • FieldFill 填充策略


描述

DEFAULT

默认不处理

INSERT

插入时填充字段

UPDATE

更新时填充字段

INSERT_UPDATE

插入和更新时填充字段

实现步骤:

第一步:指定填充策略

@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date lastUpdateTime;

第二步:设置填充值

package com.itheima.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
        this.strictInsertFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "lastUpdateTime", Date.class, new Date()); // 起始版本 3.3.0(推荐)

    }
}

第三步测试:

@Test
public void testFill(){
    Product product = new Product();
    product.setPname("华为P60");
    product.setPrice(9999D);
    //没有设置时间,让MyBatisPlus自动填充值
    productMapper.insert(product);
}