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个常用的方法.
也可以嵌套使用