日期:2014-05-16  浏览次数:20454 次

Spring数据库访问(HSQL)(二)
    上一篇我们介绍了HSQL数据库的基本概念和操作,我们现在从HSQL的服务器模式开始,使用Spring来操作JDBC。HSQL内嵌了服务器模式的启动方式,不过需要使用java命令来运行,可以参考官方文档。为了演示的方便,我们使用程序启动服务器,做法也很简单。如下:
package org.ourpioneer.vehicle.util;
import org.hsqldb.Server;
/**
 * 启动HSQL服务器实例
 * 
 * @author Nanlei
 * 
 */
public class HsqlServer {
	private void startHsqlServer(String dbPath, String dbName, int port) {
		Server server = new Server();
		// 0表示第0个数据库,Server模式可以启动10个数据库
		server.setDatabasePath(0, dbPath + dbName);
		server.setDatabaseName(0, dbName);
		server.setPort(port);
		server.setSilent(true);
		server.start();
		System.out.println("HSQLDB Server started!");
	}
	public static void main(String[] args) {
		// 源代码路径
		System.out.println(System.getProperty("user.dir"));
		// 类路径
	System.out.println(Thread.currentThread().getContextClassLoader()
				.getResource(".").getPath());
		String base = System.getProperty("user.dir");
		String dbPath = base
				+ "\\src\\main\\resources\\org\\ourpioneer\\vehicle\\db\\";
		String dbName = "vehicle";
		int port = 2011;
		new HsqlServer().startHsqlServer(dbPath, dbName, port);
	}
}

    这样我们就可以通过运行主函数来启动HSQL的服务器了,这里需要做些说明,就是路径的问题,因为我们开发时都是操作源文件路径下的文件,那么我们使用源文件路径,而部署后代码执行类路径下资源,那么需要切换到类路径下的文件,因为这里是使用主函数运行,所以路径的获取可能会和非主函数方式运行有所不同,这个就视具体环境来确定了,此时运行该主函数,就可以看到HSQL服务器的启动信息了。
    这里我们指定了启动一个数据库vehicle,并启用端口号2011,路径是开发使用的源文件路径。点击运行,看到如下信息:

    之后我们在Spring中配置数据源。这就很简单了,使用Commons的DBCP组件来实现最简单的连接池,如下配置即可:
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
		<property name="url"
			value="jdbc:hsqldb:hsql://localhost:2011/vehicle;shutdown=true" />
		<property name="username" value="ROOT" />
		<property name="password" value="123" />
	</bean>

    下面先从DAO模式入手,逐步来看Spring对JDBC的简化操作和JDBC模板的优雅。为了操作车辆对象,编写一个VehicleDAO接口,封装对象数据操作的方法:
package org.ourpioneer.vehicle.dao;
import org.ourpioneer.vehicle.bean.Vehicle;
/**
 * VehicleDAO:封装数据操作方法
 * 
 * @author Nanlei
 * 
 */
public interface VehicleDAO {
	public void insert(Vehicle vehicle);
	public void update(Vehicle vehicle);
	public void delete(Vehicle vehicle);
	public Vehicle findById(int id);
}

    DAO模式将数据交互完全封装,业务层面只需进行相关的逻辑操作并准备好封装的对象数据,DAO层就完成数据持久工作。写好接口,下面就是实现类,这里给出两个完整方法作为说明:
package org.ourpioneer.vehicle.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.ourpioneer.vehicle.bean.Vehicle;
/**
 * VehicleDAO实现类
 * 
 * @author Nanlei
 * 
 */
public class VehicleDAOImpl implements VehicleDAO {
	private DataSource dataSource;
	/**
	 * 注入数据源
	 * 
	 * @param dataSource
	 */
	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	public Vehicle findById(int id) {
		String sql = "select * from vehicle where ID=?";
		Connection conn = null;
		Vehicle vehicle = null;
		try {
			conn = dataSource.getConnection();
			PreparedStatement pstat = conn.prepareStatement(sql);
			pstat.setInt(1, id);
			ResultSet rs = pstat.executeQuery();
			if (rs.next()) {
				vehicle = new Vehicle(rs.getString("PLATE"), rs
						.getString("CHASSIS"), rs.getString("COLOR"), rs
						.getInt("WHEEL"), rs.getInt("SEAT"));
				vehicle.setId(rs.getInt("ID"));
			}
			rs.close();
			pstat.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return vehicle;
	}
	/**
	 * 添加Vehicle
	 */
	public void insert(Vehicle vehicle) {
		String sql = "insert into vehicle(PLATE,CHASSIS,COLOR,WH