先复习一下单条/批量插入数据的sql语句怎么写:
insert into table ([列名],[列名]) values ([列值],[列值])); 或: insert into table values ([列值],[列值]));
MyBatis批量插入数据到数据库有两种方式:xml文件,注解。
使用批量插入执行的SQL语句应该等价于:
insert into table (id, name,sex,address) values (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)
最基础的是用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。
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接口中的使用:
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。