Spring数据库访问(HSQL)(四)

本文接[url=http://sarin.iteye.com/blog/869978]上一篇[/url]继续研究Spring的JDBC模板。
之前,我们使用JDBC模板的方法是在每次调用方法时生成该对象,并使用了一个dataSource作为参数,这个dataSource是在生成DAO的实现类时Spring进行注入的。显然,这样的方式并不是最佳的做法,因为每次方法调用时都需要重新生成新的JDBC模板对象,那么现在,我们就来看看如何优化我们的程序。首先是简化JDBC模板的创建,那么我们就采用注入的方式来进行:
package org.ourpioneer.vehicle.dao;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import org.ourpioneer.vehicle.bean.Vehicle;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
/**
* VehicleDAO实现类
*
* @author Nanlei
*
*/
public class VehicleDAOImpl implements VehicleDAO {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void delete(Vehicle vehicle) {
String sql = "delete from vehicle where ID=?";
jdbcTemplate.update(sql, vehicle.getId());
}
public Vehicle findById(int id) {
String sql = "select * from vehicle where ID=?";
BeanPropertyRowMapper<Vehicle> vehicleRowMapper = BeanPropertyRowMapper
.newInstance(Vehicle.class);
return jdbcTemplate.queryForObject(sql, new Object[] { id },
vehicleRowMapper);
}
public void insert(final Vehicle vehicle) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)";
jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(),
vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat());
}
public void update(Vehicle vehicle) {
String sql = "update vehicle set PLATE=?,CHASSIS=?,COLOR=?,WHEEL=?,SEAT=? where ID=?";
jdbcTemplate.update(sql, vehicle.getPlate(), vehicle.getChassis(),
vehicle.getColor(), vehicle.getWheel(), vehicle.getSeat(),
vehicle.getId());
}
public void insertBatch(final List<Vehicle> vehicles) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement pstat, int i)
throws SQLException {
Vehicle vehicle = vehicles.get(i);
pstat.setString(1, vehicle.getPlate());
pstat.setString(2, vehicle.getChassis());
pstat.setString(3, vehicle.getColor());
pstat.setInt(4, vehicle.getWheel());
pstat.setInt(5, vehicle.getSeat());
}
public int getBatchSize() {
return vehicles.size();
}
});
}
public List<Vehicle> findAll() {
String sql = "select * from vehicle";
RowMapper<Vehicle> rows = BeanPropertyRowMapper
.newInstance(Vehicle.class);
return jdbcTemplate.query(sql, rows);
}
public int countVehicle() {
String sql = "select count(*) from vehicle";
return jdbcTemplate.queryForInt(sql);
}
public String getChassis(int id) {
String sql = "select COLOR from vehicle where ID=?";
return (String) jdbcTemplate.queryForObject(sql, new Object[] { id },
String.class);
}
}

精简后的代码就非常短了,也非常的清晰。那么采用注入之后,需要修改Spring的配置文件,当然这也非常的简单:
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>

除了这种使用方式,我们还可以直接扩展Spring的JdbcDaoSupport抽象类,那么只需让我们的DAO实现类扩展JdbcDaoSupport即可,配置文件中直接给DAO注入数据源即可,而且我们不需要再显式注入它们,因为JdbcDaoSupport已经为我们做了这些工作了,代码就得到了进一步的精简:
public class VehicleDAOImpl extends JdbcDaoSupport implements VehicleDAO {
public void delete(Vehicle vehicle) {
String sql = "delete from vehicle where ID=?";
getJdbcTemplate().update(sql, vehicle.getId());
}
… … …
}

对应修改配置文件:
	<bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl">
<property name="dataSource" ref="dataSource" />
</bean>

这样我们的DAO层代码就已经非常的精简了,维护性也提高了。同时,我们还可以扩展SimpleJdbcDaoSupport抽象类来获得一些Java 5的新特性支持,不过Spring 3中已经对JdbcTemplate进行了调整,想测试SimpleJdbcDaoSupport也很简单,可以直接使用getSimpleJdbcTemplate()方法获得简化的JDBC模板,然后进行操作。下面我们通过SipleJdbcTemplate来看看如何简化查询操作,首先修改一下我们的映射器。
改为实现ParameterizedRowMapper接口,覆盖的方法不变。但在Spring3中,SimpleJdbcTemplate使用RowMapper是新方法,ParameterizedRowMapper是已经废弃的方法了。这点要注意,那么我们继续使用Spring3中的RowMapper。
	public Vehicle findById(int id) {
String sql = "select * from vehicle where ID=?";
return getSimpleJdbcTemplate().queryForObject(sql,
new VehicleRowMapper(), id);
}

这样就不需要转型了,代码得到进一步的精简,这就是利用了Java 5的新特性:泛型。当然还有一种实现方式:
	public Vehicle findById(int id) {
String sql = "select * from vehicle where ID=?";
return getSimpleJdbcTemplate().queryForObject(sql,
BeanPropertyRowMapper.newInstance(Vehicle.class), id);
}

这样我们就不需要再额外创建RowMapper的实现类了,这样就会自动为我们映射属性了。再看看查询所有车辆的方法,也得到了大量的简化:
	public List<Vehicle> findAll() {
String sql = "select * from vehicle";
return getSimpleJdbcTemplate().query(sql,
BeanPropertyRowMapper.newInstance(Vehicle.class));
}

而单值查询的方式也可以继续精简:
	public String getChassis(int id) {
String sql = "select COLOR from vehicle where ID=?";
return getSimpleJdbcTemplate().queryForObject(sql, String.class, id);
}

更多简化的JDBC模板使用方法参考官方文档即可,都非常非常的简单了。下面一个内容就是命名参数的使用了。JDBC模板也支持命名参数风格的SQL语句,使用起来也很容易,比如我们的插入操作,就可以改为:
	public void insert(final Vehicle vehicle) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)";
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("plage", vehicle.getPlate());
parameters.put("chassis", vehicle.getChassis());
parameters.put("color", vehicle.getColor());
parameters.put("wheel", vehicle.getWheel());
parameters.put("set", vehicle.getSeat());
getSimpleJdbcTemplate().update(sql, parameters);
}

update方法还可以使用ParameterSource实现的参数,比如:
	public void insert(final Vehicle vehicle) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)";
Map<String, Object> parameters = new HashMap<String, Object>();
… … …
SqlParameterSource parameterSource =
new MapSqlParameterSource(parameters);
getSimpleJdbcTemplate().update(sql, parameterSource);
}

这两种方法都不是很简便,需要设置参数,下面就来简化操作:
	public void insert(final Vehicle vehicle) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)";
SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(vehicle);
getSimpleJdbcTemplate().update(sql, parameterSource);
}

使用自动为我们映射属性的BeanPropertySqlParamterSource就很简单了,一步到位了。批量插入操作同样可以使用命名参数的方式来进行:
	public void insertBatch(final List<Vehicle> vehicles) {
String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(:plate,:chassis,:color,:wheel,:seat)";
List<SqlParameterSource> parameters = new ArrayList<SqlParameterSource>();
for (Vehicle vehicle : vehicles) {
parameters.add(new BeanPropertySqlParameterSource(vehicle));
}
getSimpleJdbcTemplate().batchUpdate(sql,
parameters.toArray(new SqlParameterSource[0]));
}

Spring对JDBC的支持就介绍完了。(本部分内容完)后续将继续探讨Spring的数据库访问之ORM部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值