问 题
INSERT INTO USER(name,age,address,loan_type)
VALUES(#{name},#{age},#{address},#{loanType});
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语句呢。
解决方案
@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);
}
}
这一段是Mybatis中PreparedStatementHandler的源码。大概意思是如果使用自动生成主键,并且值keyProperty不为空,Statement最后执行的时候会把keyProperty涉及到的列值返回
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起