大家好,本章主要讲解mybatisPlus的日志配置和ID生成策略!
配置日志
配置日志是指,我们希望看到mybatisPlus执行sql的时候,把具体的sql语句打印出来。这样有助于我们观察具体的jdbc操作,方便排查错误。
我们来看一下MP如何配置日志的,很简单,加一个声明即可。
# 配置日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
再来一个新增数据的方法,可以看到日志会默认打出来
@Test public void testInsert(){ //1. 创建user实例对象 User user = new User(); //2.填充属性(注意:ID不用填充) user.setName("jack"); user.setAge(18); user.setEmail("jack@qq.com"); //3.直接调用MP框架的新增方法 int insert = userMapper.insert(user); log.info("成功插入" + insert + "条数据!"); }
MybatisPlus主键生成策略
MybatisPlus主键生成策略是指,在我们做新增操作的时候,对主键ID的默认值设定规则,常见的有UUID,自动递增,雪花算法等。
回顾一下表结构:
我们设置了自动递增。
我们做个测试,修改User类的id字段:
@Data @ToString public class User { @TableId private Long id; //省略... }
然后再来一次新增的操作:testInsert
报错了,原因是:
Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'id' at row 1
现在,我们把id字段的类型改为bigint
重新执行刚才的方法:
成功了,id是老长的一串数字。
为什么会这样呢?
那是因为MP框架默认的ID生成策略是雪花算法。
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为 毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味 着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯 一!
基础概念 snowflake中文的意思是雪花,所以常被称为雪花算法
它是twitter用scala语言编写的一个用于简单规则运算就能高效生成唯一ID的算法,下面是源码地址:
github源码地址
网上还有各种其他语言的版本,思路基本上都是参考上述源码
特性
生成的ID不重复
生成性能高
基于时间戳,可以基本保证有序递增
总之,这是一种比较高效的ID生成策略,也是MP框架默认的ID生成策略。在分布式架构中,用雪花算法也是不错的选择,能够应对大部分的场景。
其他ID生成策略:
/** * 生成ID类型枚举类 * * @author hubin * @since 2015-11-10 */ @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; } }
在新版本的MP中,有好几种方式已经废弃了,使用的时候要注意。