重要步驟說明:
首先是從PersonServiceImpl方法進去,調用JdbcTemplate的query方法,然后執行一連串錯中復雜的調用,而且里面有很多函數都是以回調形式處理,
1)JdbcTemplate接受到query請求,由於query沒有帶參數,所以選擇不帶sql參數的重載方法query執行。
2)query方法面會創建一個內部類(QueryStatementCallback),然后實例化,傳給execute方法,等待execute回調。
3)上面是傳了一個callback對象的實例進入execute,其實execute也是JdbcTemplate的核心方法,雖然execute有很多重載方法,但是他們的核心邏輯其實沒什么特別大的差別。
4)獲取到List對象后,就直接退出execute方法,逐步返回result,知道返回給最初的調用者
其他概念詳見SpringJDBC解析前面的系列,這里着重看一下回調函數
public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException { Assert.notNull(sql, "SQL must not be null"); Assert.notNull(rse, "ResultSetExtractor must not be null"); if (logger.isDebugEnabled()) { logger.debug("Executing SQL query [" + sql + "]"); } class QueryStatementCallback implements StatementCallback<T>, SqlProvider { public T doInStatement(Statement stmt) throws SQLException { ResultSet rs = null; try { rs = stmt.executeQuery(sql); ResultSet rsToUse = rs; if (nativeJdbcExtractor != null) { rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); } //先進入RowMapperResultSetExtractor的回調函數,然后再回調PersonRowMapper的mapRow方法 return rse.extractData(rsToUse); } finally { JdbcUtils.closeResultSet(rs); } } public String getSql() { return sql; } } return execute(new QueryStatementCallback());