一.Spring 对数据访问(DA )有什么支持?
Spring 提供了一种模板回调结构,所谓的模版就是包装了对JDBC 及 Hibernate 的操作, 简化编程的重复代码;另外,提供与平台无关的异常转换。而开发人员可以通过回调接口来操作JDBC 或者是Hibernate 的API
二.使用 JdbcTemplate :
1 如何配置
dataSource-->jdbcTemplate-->Dao
即:配置数据源,将其注入给jdbc 模版,再将jdbc 模版注入给Dao ,这样在Dao 中就可以使用模版了。
2 怎么用?
两个基本方法:
void update(String sql,Object[] args)
传入的连个参数分别是String 类型的sql 语句和sql 语句中设置的参
数列表。
Object query(String sql, Object[] args, ResultSetExtractor rse)
三个参数分别是sql 语句,sql 语句中的参数列表,结果集的提取器。
注意:如果sql 语句中没有参数,不要给query() 方法传入null ,而是直接取消该参数。
示例:
public Book findById(int id) {
String sql = "select * from t_book where id=?";
return (Book)jt.query(sql, new Object[]{id}, new ResultSetExtractor(){
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException {
Book book = null;
if(rs.next()){
book = new Book(rs.getInt(1),rs.getString(2),rs.getDouble(3));
}
return book;
}
});
}
如果查询语句返回的结果是一个集合,那么使用RowMapper 会比
ResultSetExtractor 更方便,例如:
public List<Book> findAll() {
String sql = "select * from t_book";
return jt.query(sql, new RowMapper(){
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Book(rs.getInt(1),rs.getString(2),rs.getDouble(3));
}
});
}
模版为我们做了进一步的封装,这自然方便了我们代码的编写,但是有些功
能模版确实完成不了,就需要模版把操作权重新交给我们。例如,在保存数
据的时候需要得到数据库中自动生成的字段。
jt.execute(new ConnectionCallback(){
doInConnection(Connection con){
//to do something
}
})
ConnectionCallback 回调接口会把整个连接暴露给我们,这样我们就可以以前
一样地操作连接对象了。
三.使用 HibernateTemplate
1 配置结构:
dataSource-->sessionFactory-->hibernateTemplate-->dao
示例:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>domain/Book.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="ht" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="bookDao" class="dao.hn.BookDaoImpl">
<property name="ht" ref="ht" />
</bean>
2 怎么用?
基本方法与Session 的相同:
save() update() delete() get()
不同之处在于session 中用的是createQuery(hql) 方法来定义查询
而模版中使用find() 方法,例如:
List find(String hql,Object[] args)
3 需要添加的jar 包:
spring 开发包lib 目录下
dom4j/dom4j.jar
j2ee/jta.jar
jakarta-commons/commons-collection.jar
antlr/antlr.jar
四.不使用数据访问模版,使用hibernate native API 的情况
配置:
dataSource-->sessionFactory-->dao
dao 的实现:
void save(Book b){
sf.getCurrentSession().save(b);
}
另外,如果抛出异常,需要自己捕获。