mybatis实现批量插入并返回主键(xml和注解两种方法)

目录
  • mybatis批量插入并返回主键(xml和注解两种方法)
    • mybatis批量插入
      • xml形式
      • 注解形式
  • mybatis批量插入并返回主键笔记
    • mapper中的代码
    • xml中的代码,collection必须填list类型

mybatis批量插入并返回主键(xml和注解两种方法)

mybatis批量插入

在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了。

比如有个表camera,里面有cameraNo,chanIndex,cameraName这三个字段,其中cameraNo是自增主键。

下面是批量插入的Dao层接口:

void batchInsertCameras(@Param("list") List<Camera> cameras);

xml形式

<insert id="batchInsertCameras" useGeneratedKeys="true" keyProperty="cameraNo">
    insert into camera (chanIndex,cameraName)
    values
    <foreach collection="list" item="c" separator=",">
        (#{c.chanIndex},#{c.cameraName})
    </foreach>
</insert>

注解形式

@Insert("<script>insert into camera (chanIndex,cameraName) values " +
        "<foreach collection='list' item='c' separator=','>(#{c.chanIndex},#{c.cameraName})</foreach></script>")
@Options(useGeneratedKeys = true, keyProperty = "cameraNo")
void batchInsertCameras(@Param("list") List<Camera> cameras);

注意:@Param里必须写成list, foreach的collection也必须写成list,否则批量插入后会报错说找不到"cameraNo"字段,而无法返回主键。

通过上面的xml形式或者注解形式的配置(我这是spring boot的项目,引入的mybatis-spring-boot-starter,采用的是注解形式),就可以批量插入并返回主键了,主键会被设置到Camera对象的cameraNo字段中。

cameraMapper.batchInsertCameras(cameras);
for(Camera camera : cameras){
    System.out.println(camera.getCameraNo());
}

执行批量插入时,需确保至少有一条待插入的记录,否则会导致sql有误而报错。

mybatis批量插入并返回主键笔记

mapper中的代码

int insertBatchUserReturnId(List<User> users);

也可以在形参前面加上@Param("xxxx")

xml中的代码,collection必须填list类型

<insert id="insertBatchUserReturnId" keyProperty="userId" useGeneratedKeys="true">
 insert into message (user_id, user_name, user_type, user_passwd, user_phone,user_pic,user_address)
 values
 <foreach collection="list" item="item" open="(" close=")" separator=",">
  #{item.userId,jdbcType=INTEGER}, #{item.userName,jdbcType=VARCHAR}, #{item.userType,jdbcType=TINYINT},
  #{item.userPasswd,jdbcType=VARCHAR}, #{item.userPhone,jdbcType=VARCHAR},
  #{item.userPic,jdbcType=VARCHAR},#{item.userAddress,jdbcType=VARCHAR}
 </foreach>
</insert>

执行完这条语句之后,原来的users就会自动带上主键userId。

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

(0)

相关推荐

  • Mybatis批量插入返回插入成功后的主键id操作

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性. 2.不支持生成自增主键的数据库:使用<selectKey>. 但是怎么对批量插入数据返回自增主键的解决方式网上看到的还是比较少,至少百度的结果比较少. Mybatis官网资料提供如下: First, if your database supports auto-generated key

  • mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

  • mybatis插入与批量插入返回ID的原理详解

    背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次打算用JsqlParser重写一遍,一来底层不会存在太多的文本拼接,二来基于其他开源包维护难度会小一些,最后还可以整理一下原有的冗余方法. 这两天整理insert相关的方法,在将对象插入数据库后,期望是要返回完整对象,并且包含实际的数据库id. 基础相关框架为:spring.mybatis.hikari. 底层调用方法 最底层的做法实际上很直白,就是利用my

  • Mybatis批量插入更新xml方式和注解方式的方法实例

    前言 最近工作上遇到很多批量插入的场景,但是百度很难得到我想要的结果,而且查出来的效果不是很好- 所以就自己来写一份给大家参考,希望对大家有用 Mybatis 批量插入注解形式 @Insert("<script> INSERT INTO t_device_policy " + "(id,device_id,type,policy,create_time,update_time) " + "VALUES " + "<fo

  • mybatis实现批量插入并返回主键(xml和注解两种方法)

    目录 mybatis批量插入并返回主键(xml和注解两种方法) mybatis批量插入 xml形式 注解形式 mybatis批量插入并返回主键笔记 mapper中的代码 xml中的代码,collection必须填list类型 mybatis批量插入并返回主键(xml和注解两种方法) mybatis批量插入 在mysql数据库中支持批量插入,所以只要配置useGeneratedKeys和keyProperty就可以批量插入并返回主键了. 比如有个表camera,里面有cameraNo,chanIn

  • Mybatis批量插入并返回主键id的方法

    目录 场景 错误 分析原因 排查问题 场景 在做商城的时候,sku表进行了拆分,sku的基本信息以及sku的库存表.因为库存会经常的变动,会导致行锁. 这里就是新增的时候,因为在新增商品的时候,会有多条sku的数据进行批量的插入,那么有批量插入sku基本信息以及批量插入sku的库存信息. 其中,就需要批量插入sku的基本信息的时候,返回主键id,这就能够在sku批量插入库存信息的时候能够插入skuId: 错误 nested exception is org.apache.ibatis.execu

  • Mybatis批量插入数据返回主键的实现

    响应效果(id为主键): { "data": [ {"studentName": "张三","classNo": "一班","id": 111}, {"studentName": "李四","classNo": "二班","id": 112}, {"studentName&quo

  • 详解Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User(); user.setUserName("chenzhou"); user.setPassword("xxxx"); user.setComment("测试插入数据返回主键功能"); System.out.println("插入前主键为:

  • 详解mybatis plus使用insert没有返回主键的处理

    项目使用springboot搭建.最初的时候是使用mybatis,后来升级到mybatis plus.按照mp的官网介绍,使用mp的insert方法,对于自增的数据库表,mp会把主键写入回实例的对应属性.但实际操作起来,却没有主键. entity 类设置如下: @TableName(value = "USERINFO") public class UserInfo { /** * 指定自增策略 */ @TableId(value = "user_id",type =

  • C# web api返回类型设置为json的两种方法

    web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Application_Start()方法中添加一句: 复制代码 代码如下: GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 修改后: 复制代码 代码如下: protected void

  • 使用Python获取字典键对应值的两种方法

    目录 当知道字典的键时: 当不知道字典的键时: 附:字典dic最大值对应的键 总结 有两种方法 当知道字典的键时: unit_rooms={ 3:{301:[1,80],302:[1,80],303:[2,90],304:[2,90]}, 4:{401:[1,80],402:[1,80],403:[2,90],404:[2,90]}, 5:{501:[1,80],502:[1,80],503:[2,90],504:[2,90]} } for i in range(3,6): rooms=unit

  • MyBatis插入数据返回主键的介绍

    Service层: public int addUser(UserDomian user){ int i = userMapper.insert(user); } xml: <insert id="insert" parameterType="....UserDomain"> insert into t_user(user_name,password) values (#{userName},#{password}) </insert> 这样

  • MyBatis实现批量插入方法实例

    目录 一.SQL实现示例 二.Mybatis通过Mapper.xml文件实现 三.在Mapper接口上使用注解 四.限制一次批量插入数据的数量 总结 一.SQL实现示例 假设我们只插入一条数据的时候,SQL如下 insert into table ([列名],[列名]) values ([列值],[列值])); # 或者 insert into table values ([列值],[列值])) 当插入多条数据的时候,也就是需要批量插入的时候,SQL如下 insert into table ([

  • Mybatis实现插入数据后返回主键过程解析

    添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值,MyBatis从3.3.1版本开始支持批量添加记录并返回各记录主键字段值. 一.获取新添加记录主键字段值 注意: 在MyBatis中添加操作返回的是记录数并非记录主键id. 如果需要获取新添加记录的主键值,需要在执行添加操作之后,直接读取Java对象的主键属性. Integer rows = sqlSession.getMapp

随机推荐