Insight mybatis insert useGeneratedKeys

有这么一个场景:

使用mybatis insert操作,需要新增记录的主键Id,可以配置useGeneratedKeys=true 并且keyProperty=xxx。

这样,mybatis 就把主键Id回填至入参object。

useGeneratedKeys 是怎样实现的?

首先需要明确的是,insert 执行完成后,才发生的主键回填的事件。如下所示:

public int update(Statement statement) throws SQLException {
    // 1.insert sql 执行
    PreparedStatement ps = (PreparedStatement) statement;
    ps.execute();
    int rows = ps.getUpdateCount();
    // 2.获取当前MS 配置的KeyGenerator,并执行回填操作
    Object parameterObject = boundSql.getParameterObject();
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
    return rows;
}

其次,主键生成分为auto 或者人工指定(包括sequence),useGeneratedKeys做了两种适配。

1.通过Jdbc接口查询自增记录并回填,参考

public void processBatch(MappedStatement ms, Statement stmt, List parameters) {
    ResultSet rs = null;
    try {
        // Retrieves any auto-generated keys created as a result of executing this Statement object.
        rs = stmt.getGeneratedKeys();
        // mapper配置的keyProperty
        final String[] keyProperties = ms.getKeyProperties();
        if (keyProperties != null && rsmd.getColumnCount() >= keyProperties.length) {
            for (Object parameter : parameters) {
              if (!rs.next()) break; // there should be one row for each statement (also one for each parameter)
              final MetaObject metaParam = configuration.newMetaObject(parameter);
              if (typeHandlers == null) typeHandlers = getTypeHandlers(typeHandlerRegistry, metaParam, keyProperties);
              populateKeys(rs, metaParam, keyProperties, typeHandlers);
            }
        }
    }
    //...
}

2.人工指定的主键回填,参考:SelectKeyGenerator。


总结:

主键回填原来是这样的,豁然开朗。JDBC 接口需要认真读一读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值