非常感谢你的阅读,如果你觉得好或者对你有帮助,请积极给一个留言反馈以示鼓励。
选择一种架构、一种技术的依据是什么? 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