mybatis配置,注解方式批量插入数据

方式一:基于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注解

猜你喜欢

转载自blog.csdn.net/xssl_CSDN/article/details/83147898