1. 程式人生 > >JdbcTemplate 0.9版本原始碼分析

JdbcTemplate 0.9版本原始碼分析

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等操作。後期會寫更加簡單的用法。