java - MyBatis如何获取Mysql自增id
巴扎黑
巴扎黑 2017-04-18 09:16:53
[Java讨论组]
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO USER(name,age,address,loan_type)
        VALUES(#{name},#{age},#{address},#{loanType});
    </insert>

user表中id自增,添加过一条数据后,可以得到主键id;

DEBUG [main] - ==>  Preparing: INSERT INTO USER(name,age,address,loan_type) VALUES(?,?,?,?); 
DEBUG [main] - ==> Parameters: wrh(String), 26(Integer), 哈哈(String), 123(String)
DEBUG [main] - <==    Updates: 1

log信息。
那么问题来了,MyBatis是如何添加完一条数据后得到主键id呢?是insert之后再select嘛,但没有看到select语句呢。

巴扎黑
巴扎黑

全部回复(3)
PHP中文网
@Override
  protected Statement instantiateStatement(Connection connection) throws SQLException {
    String sql = boundSql.getSql();
    if (mappedStatement.getKeyGenerator() instanceof Jdbc3KeyGenerator) {
      String[] keyColumnNames = mappedStatement.getKeyColumns();
      if (keyColumnNames == null) {
        return connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
      } else {
        return connection.prepareStatement(sql, keyColumnNames);
      }
    } else if (mappedStatement.getResultSetType() != null) {
      return connection.prepareStatement(sql, mappedStatement.getResultSetType().getValue(), ResultSet.CONCUR_READ_ONLY);
    } else {
      return connection.prepareStatement(sql);
    }
  }

这一段是MybatisPreparedStatementHandler的源码。大概意思是如果使用自动生成主键,并且值keyProperty不为空,Statement最后执行的时候会把keyProperty涉及到的列值返回

高洛峰

在insert标签中添加如下代码:

<selectKey resultType="int" order="AFTER" keyProperty="id">
          SELECT LAST_INSERT_ID()
</selectKey>

添加之后,会在对象添加之后自动填入id

PHPz

<selectKey resultType="int" order="AFTER" keyProperty="id">

      SELECT ...

</selectKey>

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号