MyBatis学习笔记(二)——批量添加以及自增主键

  • Post author:
  • Post category:其他


今天要修改一个方法

   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值是无法返回的。

难道在这样的需求下只能对数据进行一条一条的插入么,这效率确实是太低了。



版权声明:本文为qq_28885149原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。