JdbcTemplate的使用

来源:互联网 发布:网络与格纹是什么意思 编辑:程序博客网 时间:2024/06/06 08:51

一、介绍

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();}


原创粉丝点击