0
点赞
收藏
分享

微信扫一扫

mybatis-plus使用技巧

像小强一样活着 2022-05-04 阅读 110

mybatis-plus是mybatis的增强工具, 由苞米豆开发, 在mybatis的基础上自做增强,不做修改,所以兼容mybatis的所有的语法, 实际上若是复杂sql无法通过mybatis-plus的querywapper对象查询时,我们还是使用myatis的原生的标签执行的.总之,mp有以下特点:

  • 润物无声  
    • 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
  • 效率至上
    • 只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
  • 丰富功能
    • 热加载、代码生成、分页、性能分析等功能一应俱全。

mp的主键策略

mp自带的主键策略叫做assign_id,这是一种非常好用的主键测试, 其内部的原理就是使用了雪花算法.这个很有必要聊一下的.

普通的主键生成策略如uuid,或者自增等, 在数据量较多需要执行分库分表的时候就不是很适用了. 为了避免主键重复导致的冲突问题使用到了雪花算法

雪花算法具体使用和原理如下:

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。

  • 核心思想:​​​​​​​
    • 核心思想:
      • 长度共64bit(一个long型)。
      • 首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,id一般是正数,所以最高位是0。
      • 41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
      • 10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
      • 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
      • 代码中使用时一般使用10进制存储id,每个bit位可以保存0或者1,除去符号位还有63bit,生成id值最大也就是2的63次方,长度为19位。

       使用的话,我们就在需要使用的实体类的id字段上面啥意思@tableid注解标记使用assign_id即可 

@TableId(type = IdType.ASSIGN_ID)
private String id;

如果想要使用自增的uuid可以这样设置

@TableId(type = IdType.AUTO)
private Long id;

当然要是觉得一个个设置太过麻烦, 要想设置所有实体类的配置, 可以这样设置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

myatis_plus的自动填充:

在开发中可能遇到类似时间字段自动填充的需要,实现的方式有好几种,这个举例两种最为常见的:

1:使用数据库的语法实现

        

2:使用代码框架实现,在实体类上面添加 @TableField 注解实现


@Data

public class User {

    ......
    @TableField(fill = FieldFill.INSERT)

    private Date gmtCreate;

    //@TableField(fill = FieldFill.UPDATE)

    @TableField(fill = FieldFill.INSERT_UPDATE)

    private Date gmtModified;

}

这样就在新增记录和更新的时候自动记录时间

下面聊聊mp自带的分页插件

mybatis-plus的分页功能是通过一个叫 PaginationInterceptor(页数拦截器)来实现的,配置起来也是比较简单的, 

配置类中添加@Bean配置

/**
 * 分页插件
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}

测试selectPage分页

@Test

public void testSelectPage() {

​
        //分页对象:指定查询的页码和每页显示的记录条数

        int pageNum = 1;

        int pageSize = 3;

        Page<User> page = new Page<>(pageNum,pageSize);

        //分页查询的条件对象

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        queryWrapper.gt("age",18);//年龄大于18

        //执行查询

        userMapper.selectPage(page , queryWrapper);

        //查询到的分页数据集合

        page.getRecords().forEach(System.out::println);

        //查询到的其他分页信息

        System.out.println(page.getCurrent());

        System.out.println(page.getPages());

        System.out.println(page.getSize());

        System.out.println(page.getTotal());

        System.out.println(page.hasNext());

        System.out.println(page.hasPrevious());

}

我们想要的信息都可以通过page对象获取

下面是一些常用方法:

注意这里面的xxxmapper.xx方法都是因为xx.mapper方法继承了BaseMapper, 这里面提过大约16个常用的方法.

 也可以嵌套使用

 

举报

相关推荐

0 条评论