Spring学习点滴,《Spring in Action》笔记(二)2011-08-18 unmi.cc 隔叶黄莺第四章. 征服数据库--------------------------------------------------------------------------------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)