MyBatis批量插入数据实现(MySQL)
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
假如需要搬一万块砖到楼顶,有一部电梯,电梯一次可以放适量的砖(最多放 500)。可以选择一次运送一块砖,也可以一次运送 500 块砖,哪个时间消耗大?
insert into table ([列名],[列名]) values ([列值],[列值]));
或:
insert into table values ([列值],[列值]));
insert into table ([列名],[列名])
VALUES
([列值],[列值])),
([列值],[列值])),
([列值],[列值]));
批量的好处:可以避免程序和数据库建立多次连接,增加服务器负荷。
两种方式:xml文件和注解。使用批量插入执行的SQL语句应该等价于:
insert into table (id, name,sex,address)
values
(?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)
1️⃣xml配置
最基础的是用mapping.xml配置的方式,包括以下两种具体方式:
<!-- 在外部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>
<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。
mapper接口中的使用:
public interface TabMapper {
public List<Tab> getTabsByConditionLike(@Param("list")List<Integer> ids);
}
2️⃣注解
MyBatis提供用于插入数据的注解有两个:@insert,@InsertProvider。类似还有:@DeleteProvider、@UpdateProvider和@SelectProvider。
作用:
用来在实体类的Mapper类里注解保存方法的SQL语句。
区别:
@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工厂类及对应的方法生产SQL语句,这种方法的好处在于,可以根据不同的需求生产出不同的SQL,适用性更好。
使用:
@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。
1️⃣foreach相当语句逐条insert语句执行,将出现如下问题:
①mapper接口的insert方法返回值将是最后一条insert语句的操作成功的记录数目(就是0或1),而不是所有insert语句的操作成功的总记录数目;
②当其中一条不成功时,不会进行整体回滚。
2️⃣注解方式:当有一条插入不成功时,会整体回滚。
作者:bootaiRocketQ
链接:https://www.jianshu.com/p/97e484b55d04
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。