非常感謝你的閱讀,如果你覺得好或者對你有幫助,請積極給一個留言反饋以示鼓勵。
選擇一種架構、一種技術的依據是什么? Rod Johnson 認為,應該是基于實踐的依據、來自歷史項目或親自試驗的經驗,而不是任何形式的偶像崇拜或者門戶之見。
如果說 Spring 發起了對 J2EE 常規應用的挑戰,那其立足的基礎就是實踐,把大量實踐中的經驗累積成一種最佳實踐,把這種最佳實踐融合到 J2EE 應用的方方面面。
事實勝于雄辯,用具體的示例進行闡述:
在 JDBC 操作中,我們用到的無非是增、刪、改、查 CRUD4 個功能,每個功能都覆蓋了 1 建立連接 2 構造 PrepareStatement 對象 3 進行操作 如果有異常回滾 4 關閉連接。
以查詢為例:
Connection conn=null;
PrepareStatement stmt = null;
ResultSet rs = null;
List results = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
stmt = conn.preparedStatement(sql);
rs = stmt.executeQuery();
results = new ArrayList();
while(rs.next()) {
Object vo = new Object();
vo.setXX(rs.getXType(fieldName1));
vo.setYY(rs.getYType(fieldName2));
……
results.add(vo);
}
} catch(Exception ex) {
conn.rollback();
} finally {
if (null != rs) rs.clse();
if (null != stmt) stmt.clse();
if (null != conn) conn.clse();
}
對于:
Object vo = new Object();
vo.setXX(rs.getXType(fieldName1));
vo.setYY(rs.getYType(fieldName2));
……
我們實際開發中常常使用 rs2VO(Resultset rs) 私有函數來進行轉化;
這個過程, Spring 提供了 RowMapper 接口,其方法是 public Object mapRow ( ResultSet rs, int index )異曲同工。
對于 while(rs.next()) {
Object vo = new Object();
vo.setXX(rs.getXType(fieldName1));
vo.setYY(rs.getYType(fieldName2));
……
results.add(vo);
}
這個過程:
Spring 中用 new RowMapperResultReader(new RowMapper()) 來取代;
外加其提供的避免大量重復代碼的回調函數,因此整個過程最后只剩下:
jdbcTemplate.query(sql, params, new RowMapperResultReader(new RowMapper()))
一句話這么簡單。
窺一豹而知全斑(當然有全部讀完),所以我覺得與其說 Spring 是挑戰 J2EE 應用的地位,不如說其是通過大量實踐從而提出了更有效的方式,是一種最佳實踐的體現.
因此,Spring 的過程也是論述“循序方法”論述的過程。
讀完:《精通 Spring 》《 Spring In Action 》《 J2EE without EJB 》和大量網絡文章有感。
Thanks very much to visit blog, welcome your feedback, your feedback is the Driver && Power to me