直接使用JDBC操作数据库来实现DAO,相对于使用持久层框架(Hibernate等) ,可以减少映射等带来的性能损失。
一般而言,使用JDBC来操作数据库,无非是以下几个步骤:
获取数据源
取得数据库连接
执行SQL语句
处理执行结果和异常
释放数据库连接
这些步骤是每次进行数据库操作都必须进行的。很显然,可以使用模板模式来简化设计,将执行SQL语句的部分抽象出来,其它的步骤由模板自动完成。
虽然设计这样的模板并不算复杂,但是现在我们完全无需自己来实现,应为Spring已经为我们提供了一个非常实用的模板-- JdbcTemplate。它位于Spring包 org.springframework.jdbc.core下,是Spring的jdbc工具包的核心类之一。使用JdbcTemplate的前提是必须为其提供数据源(DataSource),并通过实用类DataSourceUtils来安全地获取和释放数据库连接(Connection对象)。可以说已经是一个完美的实现,因此我们只要放心地使用就可以了。
总体思路
(1)数据源通过Spring的容器来提供;
(2)DAO通过静态方式从Spring容器中获取;
(3)针对接口编程;
(4)提供数据操作父类,简化具体DAO实现。
一、DAO地实现
遵循Spring的良好编程风格,针对接口编程。同时,为了简化对接口的实现,还提供了一个所有实现类的父类,提供了具体的数据库操作方法,这些方法当然就是使用JdbcTemplate来实现的了。
1、Dao父类
主要目的是获取数据源,为子类提供具体的数据库操作方法:
一般而言,使用JDBC来操作数据库,无非是以下几个步骤:
获取数据源
取得数据库连接
执行SQL语句
处理执行结果和异常
释放数据库连接
这些步骤是每次进行数据库操作都必须进行的。很显然,可以使用模板模式来简化设计,将执行SQL语句的部分抽象出来,其它的步骤由模板自动完成。
虽然设计这样的模板并不算复杂,但是现在我们完全无需自己来实现,应为Spring已经为我们提供了一个非常实用的模板-- JdbcTemplate。它位于Spring包 org.springframework.jdbc.core下,是Spring的jdbc工具包的核心类之一。使用JdbcTemplate的前提是必须为其提供数据源(DataSource),并通过实用类DataSourceUtils来安全地获取和释放数据库连接(Connection对象)。可以说已经是一个完美的实现,因此我们只要放心地使用就可以了。
总体思路
(1)数据源通过Spring的容器来提供;
(2)DAO通过静态方式从Spring容器中获取;
(3)针对接口编程;
(4)提供数据操作父类,简化具体DAO实现。
一、DAO地实现
遵循Spring的良好编程风格,针对接口编程。同时,为了简化对接口的实现,还提供了一个所有实现类的父类,提供了具体的数据库操作方法,这些方法当然就是使用JdbcTemplate来实现的了。
1、Dao父类
主要目的是获取数据源,为子类提供具体的数据库操作方法:
public
class
Dao
{
/**
* 日志
*/
protected Log log = LogFactory.getLog(this.getClass().getName());
/**
* 执行查询SQL文
*
* @param strSql
*/
protected void doQuery(String strSql) {
JdbcTemplate jt = new JdbcTemplate(getDataSource()); //使用 JdbcTemplate
try {
List result = jt.queryForList(strSql);
this.resultList = result;
this.resultCount = result.size();
log.debug(logHeader + strSql);
} catch (DataAccessException de) {
log.error(logHeader + de);
}
}
/**
* 执行更新SQL文
*
* @param strSql
*/
protected boolean doUpdate(String strSql) {
JdbcTemplate jt = new JdbcTemplate(getDataSource());
/**
* 日志
*/
protected Log log = LogFactory.getLog(this.getClass().getName());
/**
* 执行查询SQL文
*
* @param strSql
*/
protected void doQuery(String strSql) {
JdbcTemplate jt = new JdbcTemplate(getDataSource()); //使用 JdbcTemplate
try {
List result = jt.queryForList(strSql);
this.resultList = result;
this.resultCount = result.size();
log.debug(logHeader + strSql);
} catch (DataAccessException de) {
log.error(logHeader + de);
}
}
/**
* 执行更新SQL文
*
* @param strSql
*/
protected boolean doUpdate(String strSql) {
JdbcTemplate jt = new JdbcTemplate(getDataSource());