mybatis-plus 高级用法一

1、主键生成策略

        MybatisPlus中提供了一个注解,是@TableId,该注解提供了各种的主键生成策略,我们可以通过使用该注解来对于新增的数据指定主键生成策略。那么在以后新增数据的时候,数据就会按照我们指定的主键生成策略来生成对应的主键。

1.1、自动生成策略(AUTO策略)

        该策略为跟随数据库表的主键递增策略前提是数据库表的主键要设置为自增

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {  // 实体类添加主键注解,指定主键生成策略
    @TableId(value="id",type = IdType.AUTO) // value:指定的是表中主键名称
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
 1.2、INPUT策略

         该策略必须由我们手动的插入id,否则无法添加数据。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {  // 实体类添加主键注解,指定主键生成策略
    @TableId(type = IdType.INPUT) // 在插入数据的时候,指定主键值
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
 1.3、ASSIGN_ID策略(使用雪花算法生成)

        在表进行水平拆分和垂直拆分的时候,为了实现需求,采用雪花算法,可以实现有序、唯一、且不直接暴露排序的数字。雪花算法是由一个64位的二进制组成的,最终就是一个 Long 类型的数值,主要分为四部分存储:

1)、1位的符号位,固定值为0;

2)、41位的时间戳;

3)、10位的机器码,包含5位机器id和5位服务id;

4)、12位的序列号。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
 1.4、NONE策略(不指定主键生成策略)

         NONE策略表示不指定主键生成策略,当没有指定主键生成策略或者主键策略为NONE的时候,跟随的是全局策略,全局策略默认是全局配置中 id-type是用于配置主键生成策略的,id-type的默认值就是雪花算法(ASSIGN_ID)。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.NONE) // 与不加注解效果一致
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
mybatis-plus:
  global-config:
    banner: off
    db-config:
      id-type: auto|input|assign_id|assign_uuid|none    # 指定主键全局生成策略,默认为 assign_id
      table-prefix: tb_ # 指定表名前缀,用于和实体类对应
 1.5、ASSIGN_UUID策略(使用uuid生成主键)

        UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全唯一的系统信息。

UUID的编码规则:

1)、1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性;

2)、9~16位采用底层的IP地址,在服务器集群中的唯一性;

3)、17~24位采用当前对象的HashCode值,在一个内部对象上的唯一性;

4)、25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.ASSIGN_UUID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
2、分页

分页有两种方式实现:

1)、通过MybatisPlus提供的方法来实现条件查询;

2)、通过自定义SQL语句的方式来实现查询。

2.1、通过分页插件实现

        在SQL没有那么复杂,可以直接通过 Mybatis-Plus 提供的方法来实现查询的,可以通过配置分页插件来实现分页效果,分页的本质就是需要设置一个拦截器,通过拦截器拦截了SQL,通过在SQL语句的结尾添加 limit 关键字。

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 指定分页方言
         interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防止全表更新拦截器
        return interceptor;
    }
}
// 创建分页查询对象
IPage<User> page = new Page<>(pageNo,pageSize);
//执行分页查询
userMapper.selectPage(page, lambdaQueryWrapper);
2.2、自定义分页查询api
public interface UserMapper extends BaseMapper<User> {
    IPage<User> selectByName(IPage<User> page, String name);
}
// =======================================================
IPage<User> page = new Page<>(pageNo,pageSize);
//执行分页查询
userMapper.selectByName(page,"Mary");
3、逻辑删除
3.1、 通过实体类字段指定逻辑删除字段
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User extends Model<User> {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    // 增加逻辑删除字段,正常为1,删除后为0,只在删除操作时候生效,在添加、更新需要手动指定值(使用默认值除外)
    @TableLogic(value = "1",delval = "0") 
    private Integer status;
}
3.2、通过全局配置来实现逻辑删除
mybatis-plus:
  global-config:
    banner: off
    db-config:
      table-prefix: tb_
      id-type: none
      logic-delete-field: is_deleted  # 指定数据库中逻辑删除字段
      logic-delete-value: 0           # 删除后字段值
      logic-not-delete-value: 1       # 删除前字段值
 4、枚举值

        下面使用一个示例展示用法:(假设数据中用0,1表示男女)

4.1、创建枚举类
public enum GenderEnum {
    MAN(0,"男"),
    WOMAN(1,"女");
    @EnumValue  // 注意此处需要添加@EnumValue注解
    private Integer gender;
    private String genderName;
    GenderEnum(Integer gender, String genderName) {
        this.gender = gender;
        this.genderName = genderName;
    }
}
4.2、实体类添加枚举类型字段
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private GenderEnum gender; // 添加枚举字段
    private Integer status;
}
4.3、设置枚举值
@Test
void enumTest(){
    User user = new User();
    user.setName("liu");
    user.setAge(29);
    user.setEmail("liu@powernode.com");
    user.setGenderEnum(GenderEnum.MAN); // 设置枚举值
    user.setStatus(1);
    userMapper.insert(user);
}

总结:本文介绍 mybatis-plus 主键生成策略,分页逻辑删除、分页、枚举等用法,还有一些高级用法后面介绍。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值