品味Spring的魅力(二)

2014-11-23 21:31:24 · 作者: · 浏览: 18
erQuery extends MappingSqlQuery {

 public UserQuery(DataSource datasource) {
  super(datasource, "SELECT * FROM PUB_USER_ADDRESS WHERE USER_ID = ");
  declareParameter(new SqlParameter(Types.NUMERIC));
  compile();
 }

 // Map a result set row to a Java object
 protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
  User user = new User();
  user.setId(rs.getLong("USER_ID"));
  user.setForename(rs.getString("FORENAME"));
  return user;
 }

 public User findUser(long id) {
  // Use superclass convenience method to provide strong typing
  return (User) findObject(id);
 }
}

  其次是第二个问题,最麻烦的地方应该说是需要截住JDBC的异常,然后判断异常的类型,并重新抛出异常。错误的问题可以通过连接来获取,所以麻烦的是如何截获异常。Spring Framework采用的方法是回调,处理回调的类在Spring Framework中被称为template

JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList();
template.query("SELECT USER.NAME FROM USER",
new RowCallbackHandler() {
 public void processRow(ResultSet rs) throws SQLException {
  names.add(rs.getString(1));
 }
});

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。

  层间松耦合

  在开放源码界已经出现了大量的基于MVC的Web容器,但是这些容器都仅限于Web的范围,不涉及Web层次后端的连接,spring作为一个整体性的框架,定义了一种Web层和后端业务层的连接方式, 这个思路仍然疏运图MVC的范畴,但耦合更松散,不依赖于具体的集成层次。

public class GoogleSearchController
implements Controller {

 private IGoogleSearchPort google;

 private String googleKey;

 public void setGoogle(IGoogleSearchPort google) {
  this.google = google;
 }

 public void setGoogleKey(String googleKey) {
  this.googleKey = googleKey;
 }

 public ModelAndView handleRequest(
  HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
   String query = request.getParameter("query");
   GoogleSearchResult result =
   // Google property definitions omitted...

   // Use google business object
   google.doGoogleSearch(this.googleKey, query,start, maxResults, filter, restrict, safeSearch, lr, ie, oe);

   return new ModelAndView("googleResults", "result", result);
  }
 }

  回调函数是一个匿名类,其中也使用了模板方法,异常的处理都在父类中完成了。