JdbcTemplate的使用

本文介绍了Spring框架中的JDBCTemplate类,包括其提供的主要方法、配置步骤和使用示例。JDBCTemplate简化了JDBC操作,提高了数据库访问效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值