• 测试类
  1. @SpringBootTest
  2. class DemompApplicationTests {
  3. @Autowired
  4. private UserMapper userMapper;
  5. //查询操作,查询所有
  6. @Test
  7. public void findAll() {
  8. List<User> users = userMapper.selectList(null);
  9. System.out.println(users);
  10. }
  11. @Test
  12. void contextLoads() {
  13. }
  14. }
  • 查看sql输出日志
  1. #mybatis 日志输出sql
  2. mybatis-plus:
  3. configuration:
  4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志

运行测试类,查看测试结果,并查看输出日志。

主键策略 - 图1

  • 插入操作
     // 插入操作
     @Test
     public void add() {
         User user = new User();
         //id在插入时,Mybatis会默认帮我们生成 
         user.setName("李剑桥就是铁憨憨");
         user.setAge(20);
         user.setEmail("lijianqiao@ccit.edu");
         //  返回影响行数,插入1个数据,就影响一行
         int insert = userMapper.insert(user);
         System.out.println("影响行数"+insert);
     }
    

    主键策略 - 图2

主键策略 - 图3

由上述Springboot会自动帮助我们生成主键(也就是User.id)说起,那么又引发了一个问题,主键的生成该如何把握呢?或者该如何设计呢?

这里就不得不讨论一下主键生成策略

主键策略

  • 在实体类User添加注解@TableId(type = IdType.ASSIGN_ID),可以使用@TableId确定主键,使用type属性规定主键策略:
@Data
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    //
    private Long id;

    private String name;
    private Integer age;
    private String email;

}
  • 这里的添加策略共有8种,但是后面的3种已经弃用(没有学习得必要了),这里只学习使用前面的5种,比较常用的是AUTOASSIGN_UUIDASSIGN_IDINPUTNONE
    主键策略 - 图4 | 值 | 描述 | | —- | —- | | AUTO | 数据库ID自增 | | NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) | | INPUT | insert前自行set主键值 | | ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator
    的方法nextId
    (默认实现类为DefaultIdentifierGenerator
    雪花算法) | | ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator
    的方法nextUUID
    (默认default方法) | | ID_WORKER | 分布式全局唯一ID 长整型类型(please use ~~`ASSIGN_ID`
    )~~ | | UUID | 32位UUID字符串(please use ~~`ASSIGN_UUID`
    )~~ | | ID_WORKER_STR | 分布式全局唯一ID 字符串类型(please use ~~`ASSIGN_ID`
    )~~ |

在这里我们可以查看一下IdType的源码,就能简单知道主键的生成策略。

/**
 * 生成ID类型枚举类
 *
 */
@Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),

    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 分配ID (主键类型为number或string),
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
     *
     * @since 3.3.0
     */
    ASSIGN_ID(3),
    /**
     * 分配UUID (主键类型为 string)
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
     */
    ASSIGN_UUID(4),
    /**  
     *
     * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
     */
    @Deprecated
    ID_WORKER(3),
    /**
     * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
     */
    @Deprecated
    ID_WORKER_STR(3),
    /**
     * @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
     */

    @Deprecated
    UUID(4);

    private final int key;

    IdType(int key) {
        this.key = key;
    }
}

PS:如果您有兴趣,可以了解一下的雪花策略。

来看看使用主键策略后,插入的数据有什么不同?准确说是ID值的不同。再来执行一遍插入操作,看看有什么不同?

这里的Id长度为19位Long型值。

配置主键策略的方式

1.全局配置

#这里的全局配置在application.yaml文件中修改
mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO

2.局部配置

// 直接在实体类中添加注解 
@TableId(type = IdType.AUTO) //指定主键
    private Long id;