今天要修改一个方法
public int add(MemberInsertDto insertDto) {
Member member = newMemberInstance(dto);
//获得自增生成的会员id
long mid = member.getId();
insertDto.setMemberId(mid);
return memberDao.insertContractInfo(newContractInfoInstance(insertDto)) &
memberDao.insertOrgAttribute(newOrgAttributeInstance(insertDto));
}
这个方法的作用是添加一条新的Member记录及与其相关的各表记录(contract_info && org_attribute),@param MemberInsertDto 是这三个表的包装类。 现在修改了需求,我需要对这些记录进行批量插入,而不仅仅只是插入一条。
原自增主键的获得方法是这样的:
<insert id="insertMember" parameterType="java.util.List" userGeneratedKeys="true" keyProperty="id">
INSERT INTO bs_member(name, age, payer, birthday, email, create_time)
VALUES (#{name}, #{age}, #{payer}, #{birthday}, #{email}, now())
</insert>
首先添加批量插入功能
<foreach>中的属性:
item:迭代时当前指向的对象
collection:传入的参数类型
separator:每个foreach间的sql间隔
index:在list和数组中,index是元素的序号,在map中,index是元素的key
int add(List<MemberInsertDto> insertDtoList);
<insert id="insertMember" parameterType="java.util.List"<span style="font-family: Arial, Helvetica, sans-serif;"> userGeneratedKeys="true" keyProperty="id"</span>>
INSERT INTO bs_member(name, age, payer, birthday, email, create_time)
VALUES
<foreach collection="list" item="member" index="index" separator=",">
(#{member.name}, #{member.age}, #{member.payer}, #{member.birthday}, #{member.email}, now())
</foreach>
</insert>
测试发现报错
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found. Available parameters are [list]
即自增主键无法添加,修改成另一种自增主键方式就成功了,具体两种方法的区别是什么没有查到,希望能够得到解答
<insert id="insertMember" parameterType="java.util.List">
<selectKey resultType ="java.lang.Long" keyProperty= "id" order= "AFTER">
SELECT LAST_INSERT_ID()
</selectKey >
INSERT INTO bs_member(name, age, payer, birthday, email, create_time)
VALUES
<foreach collection="list" item="member" index="index" separator=",">
(#{member.name}, #{member.age}, #{member.payer}, #{member.birthday}, #{member.email}, now())
</foreach>
</insert>
该方法能够成功添加数据,然而有个问题,因为我想要做的是多表联合的批量插入,需要的是插入之后自动返回主键给Member的id值,暂时在我这里是无法解决的,因为我发现在批量插入时自增长的id值是无法返回的。
难道在这样的需求下只能对数据进行一条一条的插入么,这效率确实是太低了。