Spring数据访问模版

一.Spring 对数据访问(DA )有什么支持?

Spring 提供了一种模板回调结构,所谓的模版就是包装了对JDBC Hibernate 的操作, 简化编程的重复代码;另外,提供与平台无关的异常转换。而开发人员可以通过回调接口来操作JDBC 或者是HibernateAPI

      

二.使用 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);

              }

另外,如果抛出异常,需要自己捕获。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值