Spring: A Developer's Notebook笔记和小结(12)

/**
作者:Willpower
来源:Rifoo Technology(
http://www.rifoo.com
时间:2006-02-16
备注:转载请保留以上声明
**/

上一篇我们将数据库环境已经安装好,本篇介绍使用Spring JDBC Templates模板来实现持久层的代码。虽然EJB,JDO,Hibernate都可以实现持久层的编码,但是很多老程序员习惯了JDBC的写法,因此Spring框架引入了JDBC Templates来满足这类人群的要求。

传统的JDBC编码需要自己手工建立连接,释放连接,编写SQL语句,执行,然后返回等。所有操作都是手工的。这使得我们的系统中有很多的冗余代码。Spring JDBC Templates改进了这些不足,提供了如下便利的地方:

1 资源管理:
Spring可以帮助我们建立和关闭连接,因此我们不需要手工去写那部分代码,而且也不用担心因为手工编写而造成的程序缺陷。

2 Unchecked exceptions:
Spring不强迫我们使用checked exceptions,因此我们不必去处理那些我们无法恢复的错误。相反的是,我们能够在适当的级别上来捕获到适当的异常。

3 控制反转思想Inversion of control
Spring会为我们迭代结果集,持久化保存数据。

4配置
Spring可以让我们很方便的配置和改变我们的连接资源,比如数据源,连接等。而不需要我们手工改变代码。

简单的说,使用Spring的JDBC模板可以比原来写更少的代码,比原来的代码更易读易维护。
Spring引入了模板(templates)的概念, 我们需要给每个template提供一个SQL查询语句和一个处理结果集(ResultSet )记录行(Row)的方法。下面的类扩展了Spring的JdbcDaoSupport基类,并实现了RentABike接口。可以看到黑体字部分和以前写法的不同。template.query()需要传入上面提到的两个参数来完成查询操作,剩下的所有额外工作都是Spring自动完成的。比如释放资源,关闭连接等。

Example 4-6. JDBCRentABike.java
public class JDBCRentABike extends JdbcDaoSupport implements RentABike {
  private String storeName;
  private static final int MANUFACTURER = 2;
  private static final int MODEL = 3;
  private static final int FRAME = 4;
  private static final int SERIALNO = 5;
  private static final int WEIGHT = 6;
  private static final int STATUS = 7;

  public List getBikes( ) {
    final ArrayList results = new ArrayList( );
   
JdbcTemplate template = getJdbcTemplate( );
    template.query("SELECT * FROM bikes",
      new RowCallbackHandler( ) {
        public void processRow(ResultSet rs)
          throws SQLException {
            Bike bike = new Bike(rs.getString(MANUFACTURER),
            rs.getString(MODEL), rs.getInt(FRAME),
            rs.getString(SERIALNO), rs.getDouble(WEIGHT),
            rs.getString(STATUS));
            results.add(bike);
          }
      });
 
    return results;
  }

  public Bike getBike(String serialNo) {
    final Bike bike = new Bike( );
 
  JdbcTemplate template = getJdbcTemplate( );
    template.query("SELECT * FROM bikes WHERE bikes.serialNo = '"
      + serialNo + "'",
      new RowCallbackHandler( ) {
        public void processRow(ResultSet rs)
          throws SQLException {
            bike.setManufacturer(rs.getString(MANUFACTURER));
            bike.setModel(rs.getString(MODEL));
            bike.setFrame(rs.getInt(FRAME));
            bike.setSerialNo(rs.getString(SERIALNO));
            bike.setWeight(rs.getDouble(WEIGHT));
            bike.setStatus(rs.getString(STATUS));
        }
      });
   
    return bike;
  }

  //etc...

虽然内部类的写法看起来有点别扭,但是实际上很容易学,因为很模板化。

其实它也可以换一种比较好看的写法,下面是重构后的代码:

Example 4-8. JDBCRentABike.java
public List getBikes( ) {
  final ArrayList results = new ArrayList( );
 
JdbcTemplate template = new JdbcTemplate( );

  class BikesHandler implements RowCallbackHandler {
    public void processRow(ResultSet rs) throws SQLException {
      Bike bike = new Bike(rs.getString(MANUFACTURER),
        rs.getString(MODEL), rs.getInt(FRAME), rs.getString(SERIALNO),
        rs.getDouble(WEIGHT), rs.getString(STATUS));
      results.add(bike);
    }
  }
    template.query("SELECT * FROM bikes", new BikesHandler( ));
   
    return results;
  }

  public Bike getBike(String serialNo) {
    final Bike bike = new Bike( );
  JdbcTemplate template = new JdbcTemplate( );
    class BikeHandler implements RowCallbackHandler {
      public void processRow(ResultSet rs) throws SQLException {
        bike.setManufacturer(rs.getString(MANUFACTURER));
        bike.setModel(rs.getString(MODEL));
        bike.setFrame(rs.getInt(FRAME));
        bike.setSerialNo(rs.getString(SERIALNO));
        bike.setWeight(rs.getDouble(WEIGHT));
        bike.setStatus(rs.getString(STATUS));
      }
    }

    template.query("SELECT * FROM bikes WHERE bikes.serialNo = '"
      + serialNo + "'", new BikeHandler( ));


    return bike;
  }

接下来我们在上下文文件RentABikeApp-Servlet.xml中添加数据源和JDBC连接信息。这个bean需要是org.springframework.jdbc.datasource.DriverManagerDataSource的实现。

Example 4-7. RentABikeApp-Servlet.xml
<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
 
<property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>

 
<property name="url">
    <value>jdbc:mysql://localhost/bikestore</value>
  </property>

  <property name="username"><value>bikestore</value></property>
</bean>

<bean id="rentaBike" class="com.springbook.JDBCRentABike">
  <property name="storeName"><value>Bruce's Bikes</value></property>
  <property name="dataSource"><ref bean="dataSource"/></property>
</bean>

下图包括了所有JDBC程序必须做的,其中灰色的是Spring为我们处理的,而我们只需要做剩下的工作就行了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值