/**
作者: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为我们处理的,而我们只需要做剩下的工作就行了。
作者: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为我们处理的,而我们只需要做剩下的工作就行了。