程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring學習點滴,《Spring in Action》筆記(二)

Spring學習點滴,《Spring in Action》筆記(二)

編輯:關於JAVA

第四章. 征服數據庫

--------------------------------------------------------------------------------

31. Spring 把數據訪問流程中的固定部分和可變部分分開,分別映射成兩截然不同的類,模板 (Template)和回調(Callback),模板管事物控制、資源管理以及異常處理;回調實現特定於應用的部 分--創建 statement、綁定參數、以及整理結果集。模板方法模式的優秀應用(P123)

32. JdbcTemplate template = new JdbcTemplate(myDataSource); 構造。 所有 Spring Dao 模板類 是線程安全的,可以為每一個 DAO 配置一個 JdbcTemplate 屬性,也可以讓 DAO 類繼承 JdbcDaoSupport,然後在 DAO 類中用 getJdbcTemplate() 獲取到 JdbcTemplate 進行數據庫操作。書中 的做法是給每個 Dao 加一個 JdbcTemplate 屬性,記錄的日志略有不同,實際中注意(P127)

33. JdbcTemplate 的 execute() 方法不可帶 sql 參數,即不存在 execute(String sql, Object[] params) 方法,而 update 才有 update(String sql, Object[] params) 方法可以,還能指定每一字段 的類型(通過第三個參數 int[] argTypes),保證了類型安全,130頁說 JdbcTemplate 提供了 execute (String sql, Object[] params) 是錯誤的。(P130)

34. JdbcTemplate 類創建了 PreparedStatementCreator(createPreparedStatementCreator (Connection conn)) 和 PreparedStatementSetter(setValues(PreparedStatement ps)), 批量更新時 需要創建自己的 BatchPreparedStatementCreator 類:

BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){
  public int getBatchSize(){ return persons.size();}
  public void setValues(PreparedStatement ps, int index) throws SQLException{
    Person person = (Person) persons.get (index);
    ps.setInt(0,person.getId().intValue());
    ...... 
  }
};
getJdbcTemplate().batchUpdate(sql,setter);
BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){
  public int getBatchSize(){ return persons.size ();}
  public void setValues(PreparedStatement ps, int index) throws SQLException{
    Person person = (Person) persons.get(index);
    ps.setInt(0,person.getId ().intValue());
    ......
  }
};
getJdbcTemplate().batchUpdate (sql,setter);

把傳入的List<Person>批量的進行數據庫相應操作(P131)

35. 用JdbcTemplate讀數據,可以用 JdbcTemplate.query(sql,params, rowCallbackHandler), 實現 RowCallbackHandler的 processRow(ResultSet rs) 組裝查詢到的一個對象。實現自己的 RowMapper把 ResultSet 中一條記錄映射成一個對象,用JdbcTemplate.query(sql, params, new MyRowMapper())能夠 返回查詢整理後的對象列表,書中 133 頁的帶 RowMapperResultReader的query方法已經不存在了,在 Spring 2.x 中連 RowMapperResultReader 這個類也沒啦,敬請關注 RowMapper。由此可見,即使是只返 回一條記錄的查詢也可用帶 RowMapper的query方法,只需返回第一條記錄就行。(P132)

36. JdbcTemplate的 queryForXXX可更快捷返回簡單的查詢值,如一個 count, 只返回一條記錄的一 個字段的值。書上沒說這個,看 JdbcTemplate 代碼的方法發現的。

37. JdbcTemplate 調用存儲過程: jdbcTemplate.execute("{ARCHIVE_STUDENTS}", new CallableStatementCallback(){.....}); 看清了,就是要實現自己的 CallableStatementCallback的一 個方法(P134)

 

public Object doInCallableStatement(CallableStatement cs){
  cs.execute();
  return null;
}
public Object doInCallableStatement(CallableStatement cs){
   cs.execute();
  return null;
}

38. 可以不使用 JdbcTemplate, 而擴展 SqlUpdate 和 MappingSqlQuery 把操作創建成對象,這種做 法可以可以讓你的代碼幾乎不和 JDBC API 進行交互,不過我還是覺得用 JdbcTemplate 通俗易懂。擴展 DataFieldMaxValueIncrementer 取得自增鍵值,有三個方法 nextIntValue()、nextLongValue()、 nextStringValue(),根據實際數據庫可以用不同的實現,如 Oracle、PostgreSQL、MySQL 和 Hypersonic 等數據庫的序列機制的實現或自己寫的實現。

39. Spring 只需提供 ORM 框架的整合點,以及一些附加的服務:整合事務處理、異常處理、線程安 全,輕量級模板、便利的支持類、資源管理。Spring 整合 Hibernate 的關鍵在於對 LocalSessionFactoryBean 的配置,不再需要 hibernate.cfg.xml(或 hibernate.properties) 了。可用 LocalSessionFactoryBean 的 mappingDirectoryLocations 屬性加載某一路徑下的所有 *.hbm.xml 文件 。最後留意 HibernateTemplate(它的 HibernateCallback 接口) 和 HibernateDaoSupport 的使用。 (P139)

40. Spring 與 JDO 和 OBJ 的整合使用較少,先跳過。Spring 支持兩種版本的 iBatis:1.3 和 2.0 ;1.3 的類命名為 SqlMapXxx,2.0 的類命名為 SqlMapClientXxx。對 SqlMap 的整合要配置一個 SqlMapClientFactoryBean,仍然保留 sqlMap-config.xml 文件,並通過 configLocation 屬性配置給 SqlMapClientFactoryBean,它相當於 LocalSessionFactoryBean。關注 SqlMapClientTemplate 的配置 和使用,還有一個 SqlMapClientCallbak 接口可擴展。(P149)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved