一 .思路
1.首先创建一个实体类(TestEntity),对应批量保存的一条数据
2.Controller获取前台传递的数据(是Map列表,即代码中的paramMapList)
3.Service对Map列表进行处理(set给实体类赋值),得到实体类列表
4.把实体类列表传给sql
总结一句话,就是把实体类列表传至mybatis,用sql语句保存。
二 .代码实现
1.实体类
public class TestEntity implements Serializable{
private String column1;
private String column2;
private String column3;
private String column4;
/**
set,get方法
**/
}
2.Service(因获取前台数据方法多样,此处省略Controller,参数是Controller传递来的Map列表)
Map列表转化为实体列表
public Object batchInsert (List<Map<String, Object>> paramMapList) throws Exception{
List<TestEntity> paramObjList=new ArrayList();
for(int i=0;i<paramList.size();i++) {
TestEntity obj=new TestEntity();
obj.setColumn1(paramMapList.get("column1").toString());
obj.setColumn2(paramMapList.get("column1").toString());
obj.setColumn3(paramMapList.get("column1").toString());
obj.setColumn4(paramMapList.get("column1").toString());
paramObjList.add(obj);
}
return service.save("testBatchSaveMapper.batchSave", paramObjList);
}
3.MyBatis的xml文件sql语句如下:
<!-- 批量保存sql -->
<select id="batchSave" parameterType="java.util.List" useCache="false">
INSERT INTO test_table( column1,
column2,
column3,
column4,
)
VALUES
<foreach collection="list" index="index" item="item" separator=",">
( #{item.column1},
#{item.column2},
#{item.column3},
#{item.column4},
)
</foreach>
</select>
注:
1)虽然是批量“插入”,但是用的标签是<select>!
2)VALUES后面利用<foreach>对传进来的List进行遍历:
①collection为“被循环或遍历的数组”,这个属性是必须且很容易出错的,一般批量保存都是“list”,除此之外还有可能是“array”,map的键名等情况
②index标志循环位置,简单地说就是这是第几次循环,注意它的值是从0开始的!
③item是当前循环的对象别名,里面出现的list中的值一定要用item.才可以,没有item则会报错,说字段不存在滴
④如果我想在插入时给插入的数据一个自增字段(当然,数据库中对该字段没有特殊要求),可以看下扩展~
三.扩展——批量插入加入固定格式的自增主键
<!-- 批量保存sql -->
<select id="batchSave" parameterType="java.util.List" useCache="false">
INSERT INTO test_table( id,
column1,
column2,
column3,
column4,
)
VALUES
<foreach collection="list" index="index" item="item" separator=",">
( (SELECT RIGHT(CONCAT('0000',(IFNULL(max(id),0)+1)),4) FROM test_table AS id),
#{item.column1},
#{item.column2},
#{item.column3},
#{item.column4},
)
</foreach>
</select>
较之前的代码,区别就是#{item.column1}前面加上一句
insert加了id,value多加了以下:
(SELECT RIGHT(CONCAT('0000',(IFNULL(max(id),0)+1)),4) FROM testTable AS id)
注意这里我们存到数据库的格式就是0001,0002,.....9999这样的。注意当前列在数据库中如果用int类型是0001会变成1,如果用varchar(4)类型但是仅靠max(id)而没有RIGHT(STR,4)这样的操作则超过10会出错,因为字符串比对从第一位开始,如果9和10比,第一位分别是9和1,则取出的值就是9了~