關於DButils中的query(Connection conn, String sql, ResultSetHandler rsh)方法使用的解釋


首先介紹該方法的功能,就是實現數據庫查詢功能,並返回某個封裝的對象,參數conn是數據庫的連接對象,參數sql是查詢的sql語句,參數rsh是用來約束返回的對象。

這是query(Connection conn, String sql, ResultSetHandler<T> rsh)方法的源代碼:

public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh) throws SQLException {
return this.<T>query(conn, false, sql, rsh, (Object[]) null);
}

通過源碼我們可以發現他調用的是另一個重載的query方法:

該方法的源代碼如下:

private <T> T query(Connection conn, boolean closeConn, String sql, ResultSetHandler<T> rsh, Object... params)
throws SQLException {
if (conn == null) {
throw new SQLException("Null connection");
}

if (sql == null) {
if (closeConn) {
close(conn);
}
throw new SQLException("Null SQL statement");
}

if (rsh == null) {
if (closeConn) {
close(conn);
}
throw new SQLException("Null ResultSetHandler");
}

PreparedStatement stmt = null;
ResultSet rs = null;
T result = null;

try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);

} catch (SQLException e) {
this.rethrow(e, sql, params);

} finally {
try {
close(rs);
} finally {
close(stmt);
if (closeConn) {
close(conn);
}
}
}

return result;
}

在源代碼中我標記為橙色就是代碼的關鍵部分,該方法返回一個泛型的result對象,而該對象通過調用ResultSetHandler對象的hadle()方法獲得,

我們來了解ResultSetHandler<T>,以下是ResultSetHandler<T>的源碼:

public interface ResultSetHandler<T> {

/**
* Turn the <code>ResultSet</code> into an Object.
*
* @param rs The <code>ResultSet</code> to handle. It has not been touched
* before being passed to this method.
*
* @return An Object initialized with <code>ResultSet</code> data. It is
* legal for implementations to return <code>null</code> if the
* <code>ResultSet</code> contained 0 rows.
*
* @throws SQLException if a database access error occurs
*/
T handle(ResultSet rs) throws SQLException;

}

他是一個接口;所以我們要實現query(Connection conn, String sql, ResultSetHandler<T> rsh)方法的功能,就必須實現ResultSetHandler<T>中的hadle()f方法。

實現的方法有多種:

1.可以通過匿名內部類來實現該功能:如下所示,Student為一個實體類

2.直接使用ResultSetHandler<T>的實現類BeanHandler實現功能

 3.使用ResultSetHandler<T>的實現類ArrayHandler實現功能

如有不足或者錯誤,歡迎各位大佬指點

 


免責聲明!

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



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