JdbcTemplate 0.9版本原始碼分析
阿新 • • 發佈:2018-12-12
JdbcTemplate 核心方法:
public void query(PreparedStatementCreator psc, RowCallbackHandler callbackHandler) throws DataAccessException {
doWithResultSetFromPreparedQuery(psc, new RowCallbackHandlerResultSetExtracter(callbackHandler));
}
public void doWithResultSetFromPreparedQuery(PreparedStatementCreator psc, ResultSetExtracter rse) throws DataAccessException { Connection con = null; ResultSet rs = null; try { con = DataSourceUtils.getConnection(this.dataSource); PreparedStatement ps = psc.createPreparedStatement(con); if (logger.isInfoEnabled()) logger.info("Executing SQL query using PreparedStatement: [" + psc + "]"); rs = ps.executeQuery(); rse.extractData(rs); SQLWarning warning = ps.getWarnings(); rs.close(); ps.close(); // throwExceptionOnWarningIfNotIgnoringWarnings(warning); } catch (SQLException ex) { // throw getExceptionTranslater().translate("JdbcTemplate.query(psc) with PreparedStatementCreator [" + psc + "]", null, ex); ex.printStackTrace(); } finally { DataSourceUtils.closeConnectionIfNecessary(con, this.dataSource); } }
這裡涉及到兩個介面:PreparedStatementCreator和ResultSetExtracter,
public interface PreparedStatementCreator {
PreparedStatement createPreparedStatement(Connection conn) throws SQLException;
String getSql();
}
public interface ResultSetExtracter { void extractData(ResultSet rs) throws SQLException; }
其中JdbcTemplate中有一個內部類
private final class RowCallbackHandlerResultSetExtracter implements ResultSetExtracter { private RowCallbackHandler callbackHandler; public RowCallbackHandlerResultSetExtracter(RowCallbackHandler callbackHandler) { this.callbackHandler = callbackHandler; } public void extractData(ResultSet rs) throws SQLException { while (rs.next()) { this.callbackHandler.processRow(rs); } rs.close(); rs = null; } }
此類是個例項變數RowCallbackHandler,封裝你自己實現的RowCallbackHandler實現類,呼叫方法processRow,每次呼叫你不用自己呼叫rs.next(),直接呼叫類似rs.getString()可以獲取值。下面是介面RowCallbackHandler:
public interface RowCallbackHandler {
void processRow(ResultSet rs) throws SQLException;
}
最後貼上測試類:
public class TestJdbcTemplate {
private static String name="";
private static ResultSet resultSet=null;
@org.junit.Test
public void test()
{
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/emp";
String username = "root";
String password = "123456";
DriverManagerDataSource driverManagerDataSource=new DriverManagerDataSource(driver,url,username,password);
com.interface21.jdbc.core.JdbcTemplate jdbcTemplate=new com.interface21.jdbc.core.JdbcTemplate();
jdbcTemplate.setDataSource(driverManagerDataSource);
PreparedStatementCreator psc=new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
PreparedStatement ps=conn.prepareStatement("select * from emp where id=?");
ps.setInt(1,186);
return ps;
}
@Override
public String getSql() {
return "select * from emp where id=186";
}
};
RowCallbackHandler rch=new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
name=rs.getString(2);
resultSet=rs;
}
};
jdbcTemplate.query(psc,rch);
System.out.println(name);
}
}
以上就是對原始jdbc最簡單的封裝,自己不用關心想Connect的close等操作。後期會寫更加簡單的用法。