Mybaits批量插入
MyBatis从3.3.1版本开始支持批量添加记录并返回各记录主键字段值。只需配置useGeneratedKeys,keyProperty。
useGeneratedKeys
设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。keyProperty
指定主键名
使用说明
Mapper.xml
<!-- 新增并且返回自增长ID user.getId() --><insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">insert into user (name,age,create_time)values<foreach collection="list" item="item" separator=",">(#{item.name, jdbcType=VARCHAR},#{item.age, jdbcType=INTEGER},sysdate())</foreach></insert>
Mapper
@Mapperpublic interface UserMapper {Integer batchInsert(List<User> list);}
Junit测试类
@SpringBootTest@Slf4jclass UserMapperTest {@AutowiredUserMapper userMapper;@Testvoid batchInsert() {User userA = User.builder().name("双十一").age(2).build();User userB = User.builder().name("双十二").age(1).id(1).build();List<User> params = Lists.newArrayList(userA, userB);// rows 添加操作返回记录数int rows = userMapper.batchInsert(params);log.info(" rows = {}, params = {} ", rows, params);//user.getId() 获取生成主键IDUser u = params.get(0);log.info("id = {}, name = {} ", u.getId(), u.getName());}}
执行结果
rows = 2, params = [User(id=7, name=双十一, age=5, createTime=null), User(id=8, name=双十二, age=6, createTime=null)]
id = 7, name = 双十一
MyBatis源码参考
PreparedStatementHandler
@Overridepublic int update(Statement statement) throws SQLException {PreparedStatement ps = (PreparedStatement) statement;//执行SQLps.execute();//返回记录数int rows = ps.getUpdateCount();Object parameterObject = boundSql.getParameterObject();KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();//处理主键idkeyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);return rows;}
参考文档
深入浅出mybatis之返回主键ID
github: my-spring-boot
分支: data-mybaits