广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MybatisPlus中的insert操作详解
  • 603
分享到

MybatisPlus中的insert操作详解

2024-04-02 19:04:59 603人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatisPlus insert操作1、开启日志2、测试插入的代码3、MybatisPlus使用的是雪花算法4、MybatisPlus中的主键生成策略5、测试不同的主键生成策

MybatisPlus insert操作

在测试之前,我们思考一个问题,上个入门案例中,我们什么sql语句代码都没写,但也能查询出来数据。

是谁帮我们做了写基本代码的事情?肯定是MybatisPlus。

为了验证并继续向下学习,我们开启日志,打印在控制台上。

1、开启日志

只需在yml配置文件中,写上:

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、测试插入的代码

    @Test
    void testInsert() {
        UserEntity userEntity = new UserEntity();
        userEntity.setName("pipizhen");
        userEntity.setAge(10);
        userEntity.setEmail("ppz@qq.com");
        int count = userMapper.insert(userEntity);

        System.out.println(count);
        System.out.println(userEntity);
    }

控制台输出:

Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2373ad99] was not reGIStered for synchronization because synchronization is not active
2020-11-23 14:13:12.748  INFO 7392 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-11-23 14:13:13.028  INFO 7392 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@1977652583 wrapping com.Mysql.cj.jdbc.ConnectionImpl@2a334bac] will not be managed by spring
==>  Preparing: INSERT INTO tbl_user ( id, name, email, age ) VALUES ( ?, ?, ?, ? ) 
==> Parameters: 1330756266048045058(Long), pipizhen(String), ppz@qq.com(String), 10(Integer)
<==    Updates: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2373ad99]
1
UserEntity(id=1330756266048045058, name=pipizhen, age=10, email=ppz@qq.com)

说明我们插入数据成功了,细心的人会发现我们并没有指定id,但插入成功后,我们发现对象存在id。

肯定是主键自动生成的,没错,但是怎么生成一个这么大的数字呢?为什么不是在原有的记录条数id在自增1呢?

这里数据库插入的id的默认值为:全局唯一id。

全局唯一id可自行百度:分布式系统唯一id生成。

3、MybatisPlus使用的是雪花算法

原理:Twitter的雪花算法SnowFlake,使用Java语言实现。

可以了解一下:

SnowFlake算法产生的ID是一个64位的整型,结构如下(每一部分用“-”符号分隔):

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000

  • 1位标识部分,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以为0;
  • 41位时间戳部分,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L606024365) = 69年;
  • 10位节点部分,Twitter实现中使用前5位作为数据中心标识,后5位作为机器标识,可以部署1024个节点;
  • 12位序列号部分,支持同一毫秒内同一个节点可以生成4096个ID;

SnowFlake算法生成的ID大致上是按照时间递增的,用在分布式系统中时,需要注意数据中心标识和机器标识必须唯一,这样就能保证每个节点生成的ID都是唯一的。或许我们不一定都需要像上面那样使用5位作为数据中心标识,5位作为机器标识,可以根据我们业务的需要,灵活分配节点部分,如:若不需要数据中心,完全可以使用全部10位作为机器标识;若数据中心不多,也可以只使用3位作为数据中心,7位作为机器标识。

snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和workerId作区分),并且效率较高。据说:snowflake每秒能够产生26万个ID。

4、MybatisPlus中的主键生成策略

我们可以在@TableId注解中发现有个属性IdType,这是一个枚举类。

旧版本的枚举值有AUTO, NONE, INPUT, ID_WORKER, UUID, ID_WORKER_STR;

新版本又增加了两种,ASSIGN_ID,ASSIGN_UUID。

旧版本当我们不指定主键生成类型时,即值为null时,默认使用ID_WORKER类型。

新版本默认为NONE,注解里等于跟随全局,全局里约等于 INPUT。

(1)AUTO数据库ID自增。

(2)NONE:无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)。

(3)INPUT:insert前自行set主键值,即我们插入前,需要手动设置id。

(4)ASSIGN_ID:分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)。

(5)ASSIGN_UUID:分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)

(6)ID_WORKER:分布式全局唯一ID 长整型类型(please use ASSIGN_ID)。

(7)UUID:32位UUID字符串(please use ASSIGN_UUID)。

(8)ID_WORKER_STR 分布式全局唯一ID 字符串类型(please use ASSIGN_ID)

注意:最后三个在最新版本中,ID_WORKER,UUID,ID_WORKER_STR已经被遗弃了,不建议使用。

5、测试不同的主键生成策略

(1)AUTO策略

我们修改实体类中的id注解为:@TableId(value = “id”, type = IdType.AUTO)

并修改数据库中表tbl_user的id确定为自增。不然启动会报错:Field ‘id’ doesn’t have a default value.

测试之前,我们还需把表中那个id好长的记录删掉,并重启mysql软件,我的是Navicat。目的防止缓存的影响。

测试程序还是上面那几行代码:

@Test
    void testInsert() {
        UserEntity userEntity = new UserEntity();
        userEntity.setName("pipizhen");
        userEntity.setAge(10);
        userEntity.setEmail("ppz@qq.com");
        int count = userMapper.insert(userEntity);
        System.out.println(count);
        System.out.println(userEntity);
    }

控制台的部分打印为:

1
UserEntity(id=6, name=pipizhen, age=10, email=ppz@qq.com)

我们发现确实是我们熟悉的id自增1。

(2)INPUT策略

需要我们手动设置id的值,这样设置时,当数据库表的id设置了自增,插入时可设置id,也可不设置id。

当数据库表id没有设置自增,那我们插入数据时就必须设置id,不然谁来帮我们设置id的值,大家都知道id存在主键约束。

(3)ASSIGN_ID策略

也是自动生成一个很长的Long型数字。

可以自己尝试测试一下,只需改变实体类中注解中的IdType属性值。

MybatisPlus坑insert方法

有天早上我的一个同事,突然跑来告诉我。我们某张表的自增ID变得很大。类似1173776258468638722 这种。这个当然是不能接受的啊。

着手解决

然后就开始找问题的原因,一开始我想的是数据库上的问题,我删掉不合理的数据,

alter table *** AUTO_INCREMENT=20

修改自增ID从20开始。手动插入数据,居然OK。

那就说明,可能是我们代码insert数据的时候存在的问题。我找到数据库访问层的insert语句处,发现使用的是mybatis-plus,网上查了一下关于这块的东西,发现insert方法在配置的时候,可以指定自增ID的方式。

源码中定义有以下几种

public enum IdType {
    AUTO(0, "数据库ID自增"),
    INPUT(1, "用户输入ID"),
    ID_WORKER(2, "全局唯一ID"),
    UUID(3, "全局唯一ID"),
    NONE(4, "该类型为未设置主键类型"),
    ID_WORKER_STR(5, "字符串全局唯一ID");

然后我就果断手动配置了一下,

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

重启测试,OK。

也是很奇怪为什么之前的那部分数据的自增ID都是没问题的,突然出现这个,也是很困惑

总结,出现这个问题的原因,还是因为自己技术不熟练啦~~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MybatisPlus中的insert操作详解

本文链接: https://www.lsjlt.com/news/138499.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MybatisPlus中的insert操作详解
    目录MybatisPlus insert操作1、开启日志2、测试插入的代码3、MybatisPlus使用的是雪花算法4、MybatisPlus中的主键生成策略5、测试不同的主键生成策...
    99+
    2022-11-13
  • mybatisplus的坑 insert标签insert into select无参数问题的解决
    目录mybatisplus的坑 insert标签insert into select无参数insert into select语句的坑事故发生的经过事故还原出现的原因解决方...
    99+
    2022-11-12
  • 详解MyBatisPlus如何实现分页和查询操作
    目录1.定义查询字段2.修改分页函数接口3.修改分页实现方法4.修改控制层5.效果体验《SpringBoot整合MybatisPlus实现增删改查功能》在这篇文章中,我们详细介绍了分...
    99+
    2022-11-13
  • 详解MybatisPlus中@Version注解的使用
    目录1. 简单介绍2. 注解说明3. 什么是乐观锁3.1 乐观锁简介3.2 乐观锁实例4. 实例代码1. 简单介绍 嗨,大家好,今天给想给大家分享一下关于Mybatis-plus 的...
    99+
    2022-11-13
  • 详解MybatisPlus中@TableLogic注解的使用
    目录1. 简单介绍2. 注解说明3. @TableLogic 对于 CIUD 的限制3.1 插入(insert)3.2 查找(select)3.3 更新(update)3....
    99+
    2022-11-13
  • MySQL 中 INSERT INTO 的使用详解
    前言 MySQL 是一个非常流行的关系型数据库管理系统,具有高效和可扩展性等特点。在 MySQL 数据库中,INSERT INTO 是一种用于将新行插入表中的 SQL 命令。它是 MySQL 最基本、最常用的语句之一,也是许多应用程序的核心...
    99+
    2023-09-02
    数据库 mysql java
  • MyBatisPlus中CRUD使用方法详解
    目录一、insert1.插入操作2.主键策略二、update1.根据Id更新操作2.自动填充3.乐观锁三、select1.根据id查询记录2.通过多个id批量查询3.简单的...
    99+
    2023-01-31
    MyBatisPlus CRUD MyBatis CRUD
  • 详解MyBatisPlus中分页插件的使用
    目录MyBatis Plus分页插件使用自定义分页功能MyBatis Plus分页插件使用 MyBatis Plus中使用分页插件也很简单: 首先编写配置类: @Configurat...
    99+
    2023-02-09
    MyBatis Plus分页插件使用 MyBatis Plus分页插件 MyBatis Plus分页
  • springboot整合mybatisplus的方法详解
    目录POM:application.yaml:POJO:mapper接口:包扫描:测试:总结POM: <dependency> <groupId>com....
    99+
    2022-11-13
  • MyBatisPlus的简介及案例详解
    目录一、MyBatisPlus简介二、MyBatisPlus入门案例1、创建数据库及表2、创建SpringBoot工程3、勾选配置使用技术4、pom.xml补全依赖5、添加MP的相关...
    99+
    2022-11-13
  • 如何提高insert的操作速度
    本篇内容介绍了“如何提高insert的操作速度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!大家平时都会使...
    99+
    2022-10-18
  • 详解Python中的文件操作
    1.能调用方法的一定是对象,比如数值、字符串、列表、元组、字典,甚至文件也是对象,Python中一切皆为对象。 str1 = 'hello' str2 = 'world' str3 = ' '.j...
    99+
    2022-06-04
    详解 操作 文件
  • MyBatisPlus PaginationInterceptor分页插件的使用详解
    实现 配置插件 来到项目下的applicationContext.xml中配置sqlSessionFactoryBean的地方。 <!-- 配置SqlSessionFact...
    99+
    2022-11-11
  • Mybatis-plus的Insert操作,返回主键问题
    >关于Mybatis-plus的Insert操作,返回主键问题 Mybatis-plus默认存储完数据后,自动向传进来的实体类塞入主键ID.所以理论上无需做多余的配置. 如果是mybatis就需要在xml文件中做配置 使用selectkey...
    99+
    2023-09-15
    mybatis java mysql
  • 一文详解Golang中的位操作
    本篇文章带大家深入了解下Golang中的位操作,介绍一下详述每个操作符以及它们如何使用的案例,希望对大家有所帮助!php零基础到就业直播视频课:进入学习全程直播 + 实战授课 + 边学 + 边练 + 边辅导【推荐】《接口如何自动化测试?单流...
    99+
    2022-09-21
  • 详细解读Python中的json操作
    目录1.什么是Json2.python数据类型与json数据类型的映射关系3. json中常用的方法3-1   json.dumps()3-2 json.load...
    99+
    2022-11-11
  • C#中的Linq to JSON操作详解
    目录一、创建JObject and JArrary实例1、手动创建JSON1、创建JSON对象,JObject2、创建JSON数组,JArrary2、使用Linq创建JSON3、从对...
    99+
    2022-11-13
  • 详解python中的IO操作方法
    目录python文件I/Oraw_input函数input函数打开和关闭文件open 函数file对象的属性close()方法write()方法read()方法Python with...
    99+
    2022-11-13
  • mongodb的CURD操作详解
    基本操作增删改查增: insert介绍: mongodb存储的是文档,. 文档是json格式的对象. 语法: db.collectionName.isnert(document); 1: 增加单篇文档Db....
    99+
    2022-10-18
  • Git的branch操作详解
    在Git中,branch操作用于创建、查看、切换、合并和删除分支。1. 创建分支:使用`git branch `命令可以创建一个新的...
    99+
    2023-08-22
    Git
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作