JdbcTemplate核心方法

JdbcTemplate 是 Spring 框架中用于简化 JDBC 操作的核心工具类,它封装了底层 JDBC 的繁琐操作(如连接管理、异常处理等),使开发者能更专注于 SQL 和业务逻辑。以下是其核心方法及用途:


1. 更新操作(DML:INSERT/UPDATE/DELETE)

int update(String sql, Object... args)
  • 用途:执行增删改操作,返回受影响的行数。
  • 参数
    • sql:SQL 语句,使用 ? 作为占位符。
    • args:填充占位符的参数列表。
  • 示例1、数据插入
    String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
    int rows = jdbcTemplate.update(sql, "Alice", 25);
    
      String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
    int rows = jdbcTemplate.update(sql, new Object[]{
    "Alice", 
    25
    });
    
    • 示例2、数据更新
    String sql = "UPDATE user SET  age=? WHERE name=?";
    int rows = jdbcTemplate.update(sql,25, "Alice" );
    
    • 示例3、数据删除
    String sql = "DELETE user  WHERE name=?";
    int rows = jdbcTemplate.update(sql, "Alice" );
    

2. 查询操作(DQL:SELECT)

List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
  • 用途:查询多行数据,通过 RowMapper 将结果集映射为对象列表。
  • 参数
    • sql:SQL 语句。
    • rowMapper:将每一行数据映射为一个对象(如实现 RowMapper<T> 接口)。
    • args:SQL 参数。
  • 示例
    String sql = "SELECT * FROM user WHERE age > ?";
    List<User> users = jdbcTemplate.query(sql, (rs, rowNum) -> 
        new User(rs.getString("name"), rs.getInt("age")), 18);
    
T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
  • 用途:查询单条记录,若无结果或结果多条会抛出异常。
  • 示例
    User user = jdbcTemplate.queryForObject(
        "SELECT * FROM user WHERE id = ?", 
        (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")), 
        1
    );
    
    当User类中属性名为user表中字段的驼峰命名形式时,还可以按下面方式:
    String sql="SELECT * FROM user WHERE id = ?";
    int id=2;
     User user = jdbcTemplate.queryForObject(
       sql,new Object[]{id}, new BeanPropertyRowMapper<User >(User .class)
    );
    
List<Map<String, Object>> queryForList(String sql, Object... args)
  • 用途:查询结果直接返回为 List<Map>,适用于动态列或不确定表结构的情况。
  • 示例
    List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM user");
    

3. 批处理操作

int[] batchUpdate(String sql, List<Object[]> batchArgs)
  • 用途:批量执行相同 SQL(不同参数),提升效率。
  • 参数
    • sql:SQL 语句。
    • batchArgs:每行参数是一个 Object[],对应一次更新。
  • 示例
    String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
    List<Object[]> batchArgs = Arrays.asList(
        new Object[]{"Alice", 25},
        new Object[]{"Bob", 30}
    );
    int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
    

4. 执行任意 SQL(如 DDL)

int execute(String sql, Object... args)
  • 用途:执行非查询类 SQL(如 CREATE TABLE),返回受影响行数(可能为 0)。
  • 示例
    String sql = "CREATE TABLE IF NOT EXISTS user (id INT PRIMARY KEY, name VARCHAR(50))";
    jdbcTemplate.execute(sql);
    

5. 调用存储过程

void call(String sql, CallableStatementCreator csc, CallableStatementCallback<T> action)
  • 用途:执行存储过程,支持输入/输出参数。
  • 示例
    String sql = "{call get_user_by_id(?, ?)}";
    jdbcTemplate.call(connection -> {
        CallableStatement cs = connection.prepareCall(sql);
        cs.setInt(1, 1); // 输入参数
        cs.registerOutParameter(2, Types.VARCHAR); // 输出参数
        return cs;
    }, (cs, rowNum) -> {
        String name = cs.getString(2); // 获取输出参数
        System.out.println("User name: " + name);
    });
    

6. 其他实用方法

  • queryForMap:查询单条记录并转为 Map<String, Object>
  • queryForRowSet:返回 SqlRowSet(类似 ResultSet,但与连接解耦)。

关键特性

  1. 异常处理:自动将 SQLException 转换为 Spring 的 DataAccessException(运行时异常,无需显式捕获)。
  2. 参数绑定:支持 ? 占位符和命名参数(需配合 NamedParameterJdbcTemplate)。
  3. 资源管理:自动关闭 ConnectionStatementResultSet,避免资源泄漏。

使用建议

  • 优先使用 JdbcTemplate 而非原生 JDBC,减少模板代码。
  • 结合 RowMapperBeanPropertyRowMapper 简化对象映射。
  • 批处理操作时使用 batchUpdate 提升性能。

如果需要更简洁的命名参数支持,可考虑 NamedParameterJdbcTemplate(基于 JdbcTemplate 扩展)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值