MyBatis新增数据时自增id的两种写法

2023-10-29

MyBatis新增数据时自增id的两种写法

  • 一、单个插入
  1. 方式一
  2. 方式二
  • 二、批量插入
  • 三、注意

一、单个插入

接口方法:

 public interface PlayerDao {
        int insertOnePlayer(Player player);
        int insertOnePlayer2(Player player);
    }

1.1 方式一

public void testInsertGenerateId1() throws IOException {
           // 2.获取sqlSession
           SqlSession sqlSession = sqlSessionFactory.openSession();
           // 3.获取对应mapper
           PlayerDao mapper = sqlSession.getMapper(PlayerDao.class);
           // 4.执行查询语句并返回结果
           Player player = new Player();
           player.setPlayName("Allen Iverson");
           player.setPlayNo(3);
           player.setTeam("76ers");
           player.setHeight(1.83F);
           mapper.insertOnePlayer(player);
           sqlSession.commit();
           System.out.println(player.getId());
       }

Mapper文件:

<insert id="insertOnePlayer" parameterType="Player" useGeneratedKeys="true" keyProperty="id">
 		insert into tb_player (id, playName, playNo,team, height)
 		values (
             #{id,jdbcType=INTEGER},
             #{playName,jdbcType=VARCHAR},
             #{playNo,jdbcType=INTEGER},
             #{team,jdbcType=VARCHAR},
             #{height,jdbcType=DECIMAL}
 		)
</insert>

方式一配置:useGeneratedKeys=“true” keyProperty=“id” 即可

1.2 方式二

 public void testInsertGenerateId2() throws IOException {
            // 2.获取sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 3.获取对应mapper
            PlayerDao mapper = sqlSession.getMapper(PlayerDao.class);
            // 4.执行查询语句并返回结果
            Player player = new Player();
            player.setPlayName("Tony Parker");
            player.setPlayNo(9);
            player.setTeam("spurs");
            player.setHeight(1.88F);
            mapper.insertOnePlayer2(player);
            sqlSession.commit();
            System.out.println(player.getId());
        }

Mapper文件:

   <insert id="insertOnePlayer2" parameterType="Player">
           <selectKey  keyProperty="id" order="AFTER" resultType="int">
               select LAST_INSERT_ID()
           </selectKey>
           insert into tb_player (id, playName, playNo,team, height)
           values (
           #{id,jdbcType=INTEGER},
           #{playName,jdbcType=VARCHAR},
           #{playNo,jdbcType=INTEGER},
           #{team,jdbcType=VARCHAR},
           #{height,jdbcType=DECIMAL}
           )
       </insert>

方式二通过 selectKey 标签完成 ,selectKey 更加灵活,支持一定程度的自定义

二、批量插入

Java文件省略了,这里直接给出Mapper文件, Mapper 文件如下,其实就是:useGeneratedKeys=“true” keyProperty=“id”,其中id是JavaBean的主键id

<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
   INSERT INTO partition_info (id, node_ip_id, init_schema_info_id,
   prefix_table_index, partition_num, start_time,
   end_time, create_time, is_delete
   )
   values
   <foreach collection="list" item="item" index="index" separator=",">
     (#{item.id,jdbcType=INTEGER}, #{item.nodeIpId,jdbcType=INTEGER}, #{item.initSchemaInfoId,jdbcType=INTEGER},
     #{item.prefixTableIndex,jdbcType=VARCHAR}, #{item.partitionNum,jdbcType=VARCHAR}, #{item.startTime,jdbcType=TIMESTAMP},
     #{item.endTime,jdbcType=TIMESTAMP}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.isDelete,jdbcType=TINYINT}
     )
   </foreach>
 </insert>

Java代码

System.out.println("before insert ...");
    for (PartitionInfo p: list) {
        System.out.println(p);
    }

    PartitionInfoMapper mapper = sqlSession.getMapper(PartitionInfoMapper.class);
    int i = mapper.insertBatch(list);
    System.out.println("The rows be affected :" + i);

    System.out.println("after insert ...");
    for (PartitionInfo p: list) {
        System.out.println(p);
    }

输出

before insert ...
PartitionInfo(id=null, nodeIpId=1, initSchemaInfoId=1, prefixTableIndex=1, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)
PartitionInfo(id=null, nodeIpId=2, initSchemaInfoId=2, prefixTableIndex=2, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)
PartitionInfo(id=null, nodeIpId=3, initSchemaInfoId=3, prefixTableIndex=3, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)
The rows be affected :3
after insert ...
PartitionInfo(id=701, nodeIpId=1, initSchemaInfoId=1, prefixTableIndex=1, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)
PartitionInfo(id=702, nodeIpId=2, initSchemaInfoId=2, prefixTableIndex=2, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)
PartitionInfo(id=703, nodeIpId=3, initSchemaInfoId=3, prefixTableIndex=3, partitionNum=null, startTime=null, endTime=null, createTime=Fri Dec 13 18:26:46 CST 2019, isDelete=null)

这里其他的代码都省略了,基本上就是: useGeneratedKeys=“true” keyProperty=“id” 这两个标签起作用
另外我用的mybatis版本是 3.4.1

三、注意

注意Mapper文件中的 insert into tb_player (id, playName, playNo,team, height),这里不要多了一个逗号,之前height后面还有一个逗号导致一直空指针的错误。
————————————————
版权声明:本文为CSDN博主「惑边」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/my_momo_csdn/article/details/88535993

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis新增数据时自增id的两种写法 的相关文章

随机推荐

  • python错误与异常、调试

    错误 语法错误 逻辑错误 系统错误 异常 程序执行过程中出现的未知错误 语法和逻辑都是正常的 程序业务逻辑不完善引起的程序漏洞 错误 与 异常的区别 异常可以被捕获和处理 错误一般是编码错误 逻辑错误 系统错误 常见的异常类型 除零类型 名
  • vue环境配置文件

    配置文件 在vue项目目录下 我们可以看到诸如package json gitignore package lock json等等能配置项目的结构 引用的库 运行的方式 版本控制等等的都称为配置文件 2 环境配置文件就是能根据项目运行的环境
  • MATLAB数字图像处理(三)——图像轮廓提取与边缘检测

    文章目录 二值图像轮廓提取 灰度图像边缘检测 含噪图像边缘检测 均值滤波函数 二值图像轮廓提取 根据掏空内部点算法 运用Matlab编程实现二值图像的轮廓提取 以二值图像circles为例 I imread circles png subp
  • 几何变换详解

    几何变换详解 在三维图形学中 几何变换大致分为三种 平移变换 Translation 缩放变换 Scaling 旋转变换 Rotation 以下讨论皆针对DirectX 所以使用左手坐标系 平移变换 将三维空间中的一个点 x y z 1 移
  • Centos7更新glibc2.18

    Centos7更新glibc2 18 查看glibc版本 下载解压glibc2 18 编译安装 结果验证 查看glibc版本 查看glibc版本 ldd version 下载解压glibc2 18 参考 https blog csdn ne
  • 记录使用ESP32做WiFi模块使用的学习

    这里使用ESP32作为WiFi模块 使用STA模式或者AP模式 目录 前言 二 配置WiFi模式 1 STA模式 2 AP模式 3 AP STA模式 三 实现ESP32与电脑端通信 ESP32的数据接收与传输 ESP32的完整代码 前言 因
  • cephadm快速部署指定版本ceph集群

    官方文档 https docs ceph com en pacific 1 虚拟机规划 主机名 IP 角色 ceph1 192 168 150 120 cephadm mon mgr osd ceph2 192 168 150 121 mo
  • 四大主流芯片架构(X86、ARM、RISC-V和MIPS)

    目前市场上主流的芯片架构有 X86 ARM RISC V和MIPS四种 序号 架构 特点 代表性的厂商 运营机构 发明时间 1 X86 性能高 速度快 兼容性好 英特尔 AMD 英特尔 1978年 2 ARM 成本低 低功耗 苹果 谷歌 I
  • STM32-WWDG窗口看门狗-库函数版本

    参考资料 1 正点原子探索者STM32f407开发板 STM32f407开发指南 库函数版本 第12章 2 STM32F4xx 官方参考资料 STM32F4xx中文参考手册 第19章 目录 WWDG时钟 产生RESET的原理 超时值计算公式
  • unity与android交互独立jar不依附于主activity和manifest

    我们一般android与unity交互是android建立一个主activity继承unityplayactivity然后出jar 然后出一个manifest 那么问题来了 这样一个jar只能适应一个项目 现在plugins下面已经有三方的
  • 【计算机视觉

    文章目录 一 分割 语义相关 5篇 1 1 SAMUS Adapting Segment Anything Model for Clinically Friendly and Generalizable Ultrasound Image S
  • 如何激活conda的环境呢

    要激活 conda 环境 需要在命令行或终端中输入以下命令 condaactivate lt 环境名称 gt 其中 lt 环境名称 gt 是你要激活的 conda 环境的名称 例如 如果要激活名为 myenv 的 conda 环境 则需要输
  • CMD常用的DOS命令

    一 CMD的打开方式 1 开始 系统 命令提示符 2 win R 输入cmd 3 在任意文件夹下按住shift键 鼠标右击 在此处打开命令行 4 资源管理器前面打上cmd 空格 二 管理员方式运行 1 开始 系统 命令提示符 右击管理员权限
  • 如何无代码快速制作AR特效和滤镜?Lens Studio官方案例详解之Paper Head

    我首先在这个网页看了一下Lens Studio的总体介绍 然后想跟着Templates提供的模板快速上手 其中第一个模板就是Paper Head 但是我发现 模板看着简单 但是其背后的很多概念 逻辑还是搞不太清的 所以可能还是要去看文档 但
  • 协方差矩阵的matlab计算

    在统计学与概率论中 协方差矩阵是一个矩阵 其每个元素是各个向量元素之间的协方差 Wiki 协方差矩阵的计算以列向量为单位 是列向量各元素之间的关系的表达 定义为 一个列向量也叫做一个样本向量 列向量中的元素代表样本 列向量中的元素的个数的和
  • 六大软件开发模型详解

    软件测试工作与软件开发模型息息相关 在不同的软件开发模型中 测试的任务和作用也不相同 因此测试人员要充分了解软件开发模型 以便找准自己在其中的定位与任务 软件开发模型规定了软件开发应遵循的步骤 是软件开发的导航图 它能够清晰 直观地表达软件
  • 手把手教你实现AVL树、平衡二叉树

    今天 小编带大家一起来学习平衡二叉树 AVL树 吧 以下就简称AVL树了 想必能点开这篇博客的朋友都是极度深爱计算机的 那今天就让我们一起揭开AVL树的神秘面纱吧 目录 一 基本概念 二 实现原理 一 右旋转 二 左旋转 三 整体思路 四
  • Orcad17.4原理图导出PDF

    1 选取需要导出PDF的工程文件 2 修改页面顺序 更改的顺序即PDF输出页面顺序 此步骤需使用Shift或Ctrl选中 Ctrl A无法全选 左右拖动找到Schematic Page Number和Page Number 两项都需修改 点
  • Linux ssh升级后无法登陆

    无法3个不支持的选项 我们在 ssh config和sshd config中注视掉就好了 GSSAPIAuthentication GSSAPICleanupCredentials Unsupported option UsePAM 5 在
  • MyBatis新增数据时自增id的两种写法

    MyBatis新增数据时自增id的两种写法 一 单个插入 方式一 方式二 二 批量插入 三 注意 一 单个插入 接口方法 public interface PlayerDao int insertOnePlayer Player playe