SpringJDBC解析4-query方法


重要步驟說明:

首先是從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());  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM