一、介绍
Spring中关于JDBC的一个辅助类(JDBC Template),它封装了JDBC的操作,使用它来构建项目
为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层,以此建立一个JDBC存取框架。
作为 SpringJDBC 框架的核心,JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法。每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务。通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
二、API
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;注意:spring 3.2.2之后,jdbctemplate中的queryForInt已经被取消了!
call方法:用于执行存储过程、函数相关语句。
三、配置
在Spring核心配置里面创建数据库连接池,然后就可以创建JdbcTemplate,创建之后,就可以在实现类中注入jdbcTemplate对象,然后通过JdbcTemplate对象查询数据库的信息
<context:annotation-config />
<bean id="vbpmJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 数据源配置, 使用DBCP数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${VIP_DB_VIPVBPM_MASTER_DRIVER}"/>
<property name="url" value="${VIP_DB_VIPVBPM_MASTER_URL}"/>
<property name="username" value="${VIP_DB_VIPVBPM_MASTER_USERNAME}"/>
<property name="password" value="${VIP_DB_VIPVBPM_MASTER_PASSWORD}"/>
<!-- Connection Pooling Info -->
<property name="maxActive" value="${VIP_DB_VIPVBPM_MASTER_POOL_MAXWAIT}"/>
<property name="maxIdle" value="${VIP_DB_VIPVBPM_MASTER_POOL_MAXIDLE}"/>
<property name="maxWait" value="${VIP_DB_VIPVBPM_MASTER_POOL_MAXWAIT}" />
<property name="validationQuery" value="${VIP_DB_VIPVBPM_MASTER_VALIDATIONQUERY}" />
<property name="testWhileIdle" value="${VIP_DB_VIPVBPM_MASTER_TESTWHILEIDLE}" />
</bean>
也可以通过注入bean或JdbcDaoSupport方式来配置。
四、使用
定义接口
public interface CrudDao {
/**
* insert、update和delete操作
* @param sql
* @param argTypes
* @param args
* @return
*/
Integer save(String sql, int[] argTypes, Object... args);
/**
* 返回主键
* @param sql
* @param args
* @return
*/
Integer saveAndReturnPrimaryKey(String sql, Object... args);
/**
* 返回表中记录总数
* @param sql
* @return
*/
Integer queryForInt(String sql, int[] argTypes, Object... args);
/**
* select操作
* @param sql
* @param argTypes
* @param args
* @return
*/
List<Map<String, Object>> queryForList(String sql, int[] argTypes, Object... args);
/**
* 根据主键删除表
* @param tableName
* @param id
* @param type
* @return
*/
Integer deleteById(String tableName, Object id, int type);
}
实现类
@Service("crudDaoImpl")
public class CrudDaoImpl implements CrudDao {
@Autowired
private JdbcTemplate vbpmJdbcTemplate;
@Override
public Integer save(String sql, int[] argTypes, Object... args) {
return vbpmJdbcTemplate.update(sql, args, argTypes);
}
@Override
public Integer saveAndReturnPrimaryKey(final String sql, final Object... args) {
KeyHolder keyHolder = new GeneratedKeyHolder();
vbpmJdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
return ps;
}
}, keyHolder);
return keyHolder.getKey().intValue();
}
@Override
public Integer queryForInt(String sql, int[] argTypes, Object... args) {
return vbpmJdbcTemplate.queryForObject(sql, args, argTypes, Integer.class);
}
@Override
public List<Map<String, Object>> queryForList(String sql, int[] argTypes, Object... args) {
return vbpmJdbcTemplate.queryForList(sql, args, argTypes);
}
/**
* 根据主键id删除数据
* @param tableName
* @param id
* @param type
*/
@Override
public Integer deleteById(String tableName, Object id, int type) {
String sql = "delete from " + tableName + " where id=?";
Object[] args = new Object[] { id };
int[] types = new int[] { type };
return save(sql, types, args);
}
}
测试类:
private Integer insertVbpmTaskConf() {
String insertSql = "insert into vbpm_task_conf(proc_name,proc_def_id,task_def_key) values(?,?,?)";
Object[] insertArgs = new Object[] { "testProcessName", "123", "测试"};
return crudDaoImpl.saveAndReturnPrimaryKey(insertSql, insertArgs);
}
五、说明
1、入参:sql、参数值和参数类型,不返回主键
public Integer save(String sql, int[] argTypes, Object... args){
return vbpmJdbcTemplate().update(sql,args,argTypes);
}
或者
public Integer save(String sql, final Object... args){
return vbpmJdbcTemplate().update(sql,new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}
}
});
}
调用
String sql = "delete from vbpm_task_conf where proc_def_id=? and task_def_key=?";
Object[] args = new Object[] { "123", "测试" };
int[] types = new int[] { Types.VARCHAR, Types.VARCHAR };
return crudDaoImpl.save(sql, types, args);
2、入参:sql、参数值,返回主键
public Integer save(final String sql, final Object... args){
KeyHolder keyHolder = new GeneratedKeyHolder();
vbpmJdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
return ps;
}
}, keyHolder);
return keyHolder.getKey().intValue();
}