打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MyBatis批量插入数据实现

  一、SQL层面实现数据插入

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

  单条插入数据的写法:

  批量插入

  一种可以在代码中循环着执行上面的语句,但是这种效率太差。

  另一种,可以用mysql支持的批量插入语句,这种方式相比起来,更高效。

  insert into table ([列名],[列名])

  VALUES

  ([列值],[列值])),

  ([列值],[列值])),

  ([列值],[列值]));

  批量的好处:可以避免程序和数据库建立多次连接,从而增加服务器负荷。

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

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

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

  方法一:xml配置。

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

  mapping.xml中insert语句可以写成单条插入,在调用方循环1000次

  2.mapping.xml中insert语句写成一次性插入一个1000的list

  mapping.xml

  参数解释:

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

  collection:指定要遍历的集合。表示传入过来的参数的数据类型。该属性是必须指定的,要做 foreach 的对象。在使用foreach的时候最关键的也是最容易出错的就是collection属性。在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  a. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

  b. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

  c. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map。Map 对象没有默认的键

  item:表示集合中每一个元素进行迭代时的别名。将当前遍历出的元素赋值给指定的变量,然后用#{变量名},就能取出变量的值,也就是当前遍历出的元素。

  separator:表示在每次进行迭代之间以什么符号作为分隔符。select * from tab where id in(1,2,3)相当于1,2,3之间的,

  index:索引。index指定一个名字,用于表示在迭代过程中,每次迭代到的位置。遍历list的时候index就是索引,遍历map的时候index表示的就是map的key,item就是map的值。

  open表示该语句以什么开始,close表示以什么结束。

  mapper接口中的使用:

  方法二:注解

  注解说明:

  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、注解两种方式的区别:

  foreach相当语句逐条INSERT语句执行,将出现如下问题:

  (1)mapper接口的insert方法返回值将是最后一条INSERT语句的操作成功的记录数目(就是0或1),而不是所有INSERT语句的操作成功的总记录数目;

  (2)当其中一条不成功时,不会进行整体回滚。

  注解方式:当有一条插入不成功时,会整体回滚。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
小师妹问我:Mybatis常见注解有哪些?
MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略!
MyBatis ResultMap
『互联网架构』软件架构
自己手写一个Mybatis框架(简化)
Mybatis批量更新
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服