日期:2014-05-16 浏览次数:20828 次
KeyHolder keyHolder = new GeneratedKeyHolder();
int updatecount = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
PreparedStatement ps = (PreparedStatement) connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
return ps;
}
}, keyHolder);
long id = keyHolder.getKey().longValue();
public int update(PreparedStatementCreator psc, final KeyHolder generatedKeyHolder)
throws DataAccessException
{
Assert.notNull(generatedKeyHolder, "KeyHolder must not be null");
logger.debug("Executing SQL update and returning generated keys");
Integer result = (Integer)execute(psc, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps)
throws SQLException
{
//第一步:通过PreparedStatement对象先执行相关sql
int rows = ps.executeUpdate();
List generatedKeys = generatedKeyHolder.getKeyList();
generatedKeys.clear();
//第二步:通过同一个PreparedStatement取得产生的auto-generated keys
ResultSet keys = ps.getGeneratedKeys();
if(keys != null)
try
{
RowMapper rowMapper = getColumnMapRowMapper();
RowMapperResultSetExtractor rse = new RowMapperResultSetExtractor(rowMapper, 1);
//解析取得的ResultSet,放入到holder对象的,供我们的应用程序使用
generatedKeys.addAll((List)rse.extractData(keys));
}
finally
{
JdbcUtils.closeResultSet(keys);
}
if(JdbcTemplate.this.this$0.isDebugEnabled())
JdbcTemplate.this.this$0.debug("SQL update affected " + rows + " rows and returned " + generatedKeys.size() + " keys");
return new Integer(rows);
}
{
super();
}
}
);
return result.intValue();
}
public int executeUpdate()
throws SQLException
{
return executeUpdate(true, false);
}
protected int executeUpdate(boolean clearBatchedGeneratedKeysAndWarnings, boolean isBatch)
throws SQLException
{
if(clearBatchedGeneratedKeysAndWarnings)
{
clearWarnings();
batchedGeneratedKeys = null;
}
return executeUpdate(parameterValues, parameterStreams, isStream, streamLengths, isNull, isBatch);
}
protected int executeUpdate(byte batchedParameterStrings[][], InputStream batchedParameterStreams[], boolean batchedIsStream[], int batchedStreamLengths[], boolean batchedIsNull[], boolean isReallyBatch)
throws SQLException
{
checkClosed();
//这个connection就是我们具体使用的连接的对象,具体实现就是jdbc的connection对象
Connection locallyScopedConn = connection;
if(locallyScopedConn.isReadOnly())
throw SQLError.createSQLException(Messages.getString("PreparedStatement.34") + Messages.getString("PreparedStatement.35"), "S1009");
if(firstCharOfStmt == 'S' && StringUtils.startsWithIgnoreCaseAndWs(originalSql, "SELECT"))
throw SQLError.createSQLException(Messages.getString("PreparedStatement.37"), "01S03");
if(results != null && !locallyScopedConn.getHoldResultsOpenOverStatementClose())
results.realClose(false);
com.mysql.jdbc.ResultSet rs = null;
synchronized(locallyScopedConn.getMutex())
{
Buffer sendPacket = fillSendPacket(batchedParameterStrings, batchedParameterStreams, batchedIsStream, batchedStreamLengths);
Stri