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

Logo

鸿蒙生态一站式服务平台。

更多推荐