MyBatis批量保存数据

本文介绍了如何使用MyBatis进行批量数据保存,通过创建实体类,接收并处理Map列表,转换为实体类列表,然后在MyBatis的XML文件中编写SQL语句进行批量插入。特别地,详细讲解了<foreach>标签的使用,并给出了如何在批量插入时自动生成固定格式的自增主键的扩展方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 .思路

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了~

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值