方式一:基于xml配置形式
<insert id="batchInsert">
INSERT INTO device
(IMEI,deviceDetail)
VALUES
<foreach collection ="list" item="device" separator =",">
(#{device.IMEI}, #{device.deviceDetail)
</foreach >
</insert>
方式二:基于注解方式
Mapper类
@InsertProvider(type=BatchInsertDevice.class,method="batchInsertDevice")
void batchInsertDevice(@Param("list")List<Device> devList);
由于void batchInsertDevice(@Param("list")List<Device> devList)中的参数是List并指定名称为list故type参数中BatchInsertDevice类中batchInsertDevice方法的参数必须是Map<String,List<Device>>类型(可能是mybatis自动做了转换,若参数不为Map<String,List<Device>>会出现Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4cdac0de]
Parameter 'arg0' not found. Available parameters are [collection,list]异常)
public String batchInsertDevice(Map<String,List<Device>> map) {
System.out.println("batchInsertDevice");
// 获取真正的参数
List<Device> devList = map.get("list");
StringBuilder sql = new StringBuilder();
sql.append("insert into device ");
sql.append("(IMEI,deviceDetail) values");
for (int i = 0; i < devList.size(); i++) {
//这里的list为在map中的key值
sql.append("(#{list[+"+i+"].IMEI},#{list["+i+"].deviceDetail}");
if(i!=devList.size()-1){
sql.append(",");
}else
sql.append(";");
}
System.out.println(sql.toString());
return sql.toString();
}
还需要在service类上添加@Transactional注解