• [兔子私房课] Mybatis开发详解与项目实战02


    大家好,本章主要讲解mybatisPlus的日志配置和ID生成策略!

    配置日志

    配置日志是指,我们希望看到mybatisPlus执行sql的时候,把具体的sql语句打印出来。这样有助于我们观察具体的jdbc操作,方便排查错误。

    我们来看一下MP如何配置日志的,很简单,加一个声明即可。

    1. # 配置日志
    2. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    再来一个新增数据的方法,可以看到日志会默认打出来

    1. @Test
    2. public void testInsert(){
    3.     //1. 创建user实例对象
    4.     User user = new User();
    5.     //2.填充属性(注意:ID不用填充)
    6.     user.setName("jack");
    7.     user.setAge(18);
    8.     user.setEmail("jack@qq.com");
    9.     //3.直接调用MP框架的新增方法
    10.     int insert = userMapper.insert(user);
    11.     log.info("成功插入" + insert + "条数据!");
    12. }

    MybatisPlus主键生成策略

    MybatisPlus主键生成策略是指,在我们做新增操作的时候,对主键ID的默认值设定规则,常见的有UUID,自动递增,雪花算法等。

    回顾一下表结构:

    我们设置了自动递增。

    我们做个测试,修改User类的id字段:

    1. @Data
    2. @ToString
    3. public class User {
    4.     @TableId
    5.     private Long id;
    6.     //省略...
    7. }

    然后再来一次新增的操作: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生成策略:

    1. /**
    2.  * 生成ID类型枚举类
    3.  *
    4.  * @author hubin
    5.  * @since 2015-11-10
    6.  */
    7. @Getter
    8. public enum IdType {
    9.     /**
    10.      * 数据库ID自增
    11.      */
    12.     AUTO(0),
    13.     /**
    14.      * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
    15.      */
    16.     NONE(1),
    17.     /**
    18.      * 用户输入ID
    19.      * <p>该类型可以通过自己注册自动填充插件进行填充</p>
    20.      */
    21.     INPUT(2),
    22.     /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
    23.     /**
    24.      * 分配ID (主键类型为numberstring),
    25.      * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
    26.      *
    27.      * @since 3.3.0
    28.      */
    29.     ASSIGN_ID(3),
    30.     /**
    31.      * 分配UUID (主键类型为 string)
    32.      * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
    33.      */
    34.     ASSIGN_UUID(4),
    35.     /**
    36.      * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
    37.      */
    38.     @Deprecated
    39.     ID_WORKER(3),
    40.     /**
    41.      * @deprecated 3.3.0 please use {@link #ASSIGN_ID}
    42.      */
    43.     @Deprecated
    44.     ID_WORKER_STR(3),
    45.     /**
    46.      * @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
    47.      */
    48.     @Deprecated
    49.     UUID(4);
    50.     private final int key;
    51.     IdType(int key) {
    52.         this.key = key;
    53.     }
    54. }

    在新版本的MP中,有好几种方式已经废弃了,使用的时候要注意。

  • 相关阅读:
    【Qt】窗口和对话框区别、主窗口和二级窗口区别、QMainWindow和QDialog区别
    【Flink入门修炼】1-2 Mac 搭建 Flink 源码阅读环境
    js实现数组去重方式(12种方法)
    Java学习总结(答案版)
    java基于Springboot+vue 的在线药品销售商城购药管理系统 elementui
    maven右侧窗口里显示null 解决办法:关闭idea,删除文件夹.idea,然后重新打开
    std::map和std::unordered_map区别
    HTML练习元宵节案例
    【Elasticsearch专栏 16】深入探索:Elasticsearch的Master选举机制及其影响因素分析
    前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读小程序系统设计与实现
  • 原文地址:https://blog.csdn.net/weixin_39570751/article/details/127640797