首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyBatis批量插入数据实现(MySQL)

MyBatis批量插入数据实现(MySQL)

作者头像
Java架构师必看
发布2021-09-30 11:06:46
发布2021-09-30 11:06:46
2.4K00
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

MyBatis批量插入数据实现(MySQL)

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

一、SQL层面实现数据插入

先复习一下单条/批量插入数据的sql语句怎么写:

  1. 单条插入数据的写法:
代码语言:javascript
代码运行次数:0
运行
复制
insert into table ([列名],[列名])  values ([列值],[列值]));
或:
insert into table values ([列值],[列值]));
  1. 批量插入 一种可以在代码中循环着执行上面的语句,但是这种效率太差。 另一种,可以用mysql支持的批量插入语句,这种方式相比起来,更高效。 insert into table (列名,列名) VALUES (列值,列值)), (列值,列值)), (列值,列值)); 批量的好处:可以避免程序和数据库建立多次连接,从而增加服务器负荷。

二、MyBatis层面如何完成批量插入

MyBatis批量插入数据到数据库有两种方式:xml文件,注解。

使用批量插入执行的SQL语句应该等价于:

代码语言:javascript
代码运行次数:0
运行
复制
 insert into table (id, name,sex,address)
 values
 (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)

方法一:xml配置。

最基础的是用mapping.xml配置的方式,包括以下两种具体方式:

  1. mapping.xml中insert语句可以写成单条插入,在调用方循环1000次
代码语言:javascript
代码运行次数:0
运行
复制
<!-- 在外部for循环调用1000次 -->
<insert id="insert" parameterType="com.xxp.mybatis.Person">
    insert into person (id, name,sex,address)
    values 
    (#{id,jdbcType=INTEGER},#{name,jdbcType=VARCHAR},
    #{sex,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR})
</insert>
  1. mapping.xml中insert语句写成一次性插入一个1000的list mapping.xml
代码语言:javascript
代码运行次数:0
运行
复制
<insert id="insertBatch" >
    insert into person ( <include refid="Base_Column_List" /> ) 
    values 
    <foreach collection="list" item="item" index="index" separator=",">
        (null,#{item.name},#{item.sex},#{item.address})
    </foreach>
</insert>

参数解释

foreach的主要作用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 collection,item,separator,index,open,close。

  1. collection:指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须指定的,要做 foreach 的对象。在使用foreach的时候最关键的也是最容易出错的就是collection属性。在不同情况 下,该属性的值是不一样的,主要有一下3种情况: a. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list b. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array c. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map。Map 对象没有默认的键
  2. item:表示集合中每一个元素进行迭代时的别名。将当前遍历出的元素赋值给指定的变量,然后用#{变量名},就能取出变量的值,也就是当前遍历出的元素。
  3. separator:表示在每次进行迭代之间以什么符号作为分隔符。select * from tab where id in(1,2,3)相当于1,2,3之间的","
  4. index:索引。index指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历list的时候index就是索引,遍历map的时候index表示的就是map的key,item就是map的值。
  5. open表示该语句以什么开始,close表示以什么结束。

mapper接口中的使用:

代码语言:javascript
代码运行次数:0
运行
复制
public interface TabMapper {
    public List<Tab> getTabsByConditionLike(@Param("list")List<Integer> ids);
}

方法二:注解

注解说明:

MyBatis提供用于插入数据的注解有两个:@insert,@InsertProvider,类似还有:@DeleteProvider@UpdateProvider,和@SelectProvider,

作用:

用来在实体类的Mapper类里注解保存方法的SQL语句

区别:

@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工厂类及对应的方法生产SQL语句,这种方法的好处在于,我们可以根据不同的需求生产出不同的SQL,适用性更好。

使用:

@Insert

@Insert(“insert into blog(blogId,title,author) values(#blogId,#title,#author)”)

public boolean saveBlog(Blog blog);

@InsertProvider

在mapper接口中的方法上使用@InsertProvider注解:

参数解释:

type为工厂类的类对象,

method为对应的工厂类中的方法,方法中的@Param(“list”)是因为批量插入传入的是一个list,但是Mybatis会将其包装成一个map。其中map的key为“list”,value为传入的list。

三、xml、注解两种方式的区别:

  1. foreach相当语句逐条INSERT语句执行,将出现如下问题: (1)mapper接口的insert方法返回值将是最后一条INSERT语句的操作成功的记录数目(就是0或1),而不是所有INSERT语句的操作成功的总记录数目; (2)当其中一条不成功时,不会进行整体回滚。
  2. 注解方式:当有一条插入不成功时,会整体回滚。
猜您喜欢:
  1. MyBatis批量插入数据实现(MySQL)
  2. mysql 字段值比较_php+mysql 取字段值比较 相同则比较另一字段值
  3. mysql text字段导出_Python 之 MySql“未解之谜”03–悲剧!一道面试题丢失了offer
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、SQL层面实现数据插入
  • 二、MyBatis层面如何完成批量插入
    • 方法一:xml配置。
    • 方法二:注解
  • 三、xml、注解两种方式的区别:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档