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
@Mapper
public interface UserMapper {
Integer batchInsert(List<User> list);
}
Junit测试类
@SpringBootTest
@Slf4j
class UserMapperTest {
@Autowired
UserMapper userMapper;
@Test
void 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() 获取生成主键ID
User 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
@Override
public int update(Statement statement) throws SQLException {
PreparedStatement ps = (PreparedStatement) statement;
//执行SQL
ps.execute();
//返回记录数
int rows = ps.getUpdateCount();
Object parameterObject = boundSql.getParameterObject();
KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
//处理主键id
keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
return rows;
}
参考文档
深入浅出mybatis之返回主键ID
github: my-spring-boot
分支: data-mybaits