spring jdbcTemplate源碼剖析

來源:互聯網
上載者:User

標籤:

  本文淺析 spring jdbcTemplate 源碼,主要是學習其設計精髓。模板模式、巧妙的回調

一、jdbcTemplate 類結構

①、JdbcOperations : 介面定義了方法,如

<T> T execute(StatementCallback<T> action) throws DataAccessException;

void execute(String sql) throws DataAccessException;

<T> T query(String sql, ResultSetExtractor<T> rse) throws DataAccessException;

。。。

②、JdbcAccessor : 定義了資料來源。

③、實現JdbcOperations介面定義的方法

二、jdbcTemplate 模板模式

1、我們看下execute(StatementCallback<T> action)實現 (核心)

public <T> T execute(StatementCallback<T> action) throws DataAccessException {        Assert.notNull(action, "Callback object must not be null");        Connection con = DataSourceUtils.getConnection(getDataSource());        Statement stmt = null;        try {            Connection conToUse = con;            if (this.nativeJdbcExtractor != null &&                    this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {                conToUse = this.nativeJdbcExtractor.getNativeConnection(con);            }            stmt = conToUse.createStatement();            applyStatementSettings(stmt);            Statement stmtToUse = stmt;            if (this.nativeJdbcExtractor != null) {                stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);            }            T result = action.doInStatement(stmtToUse); // 回調            handleWarnings(stmt);            return result;        }        catch (SQLException ex) {            JdbcUtils.closeStatement(stmt);            stmt = null;            DataSourceUtils.releaseConnection(con, getDataSource());            con = null;            throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);        }        finally {            JdbcUtils.closeStatement(stmt);            DataSourceUtils.releaseConnection(con, getDataSource());        }    }

2、再看下 execute(String sql) 源碼

public void execute(final String sql) throws DataAccessException {        if (logger.isDebugEnabled()) {            logger.debug("Executing SQL statement [" + sql + "]");        }        class ExecuteStatementCallback implements StatementCallback<Object>, SqlProvider {            @Override            public Object doInStatement(Statement stmt) throws SQLException {                stmt.execute(sql); // JAVA  jdbc                return null;            }            @Override            public String getSql() {                return sql;            }        }        execute(new ExecuteStatementCallback()); // 調用上述T execute(StatementCallback<T> action)     }

 由此,可以知道,我們平時常用的execute(final String sql) 方法,底層幫我們做了很多事情,如建立預設的ExecuteStatementCallback,採用回調的方式,由模板去執行sql,關閉連結

 3、T query(final String sql, final ResultSetExtractor<T> rse) 源碼實現

@Override    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 {            @Override            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);                    }                    return rse.extractData(rsToUse);                }                finally {                    JdbcUtils.closeResultSet(rs);                }            }            @Override            public String getSql() {                return sql;            }        }        return execute(new QueryStatementCallback());    }
View Code

 

 4、update(final String sql) 源碼

@Override    public int update(final String sql) throws DataAccessException {        Assert.notNull(sql, "SQL must not be null");        if (logger.isDebugEnabled()) {            logger.debug("Executing SQL update [" + sql + "]");        }        class UpdateStatementCallback implements StatementCallback<Integer>, SqlProvider {            @Override            public Integer doInStatement(Statement stmt) throws SQLException {                int rows = stmt.executeUpdate(sql);                if (logger.isDebugEnabled()) {                    logger.debug("SQL update affected " + rows + " rows");                }                return rows;            }            @Override            public String getSql() {                return sql;            }        }        return execute(new UpdateStatementCallback());    }
View Code

 

spring jdbcTemplate源碼剖析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.