JdbcTemplate的execute()方法用于执行自定义SQL操作。它有两种形式:
- 传入ConnectionCallback或PreparedStatementCallback接口的实现:
jdbcTemplate.execute(new ConnectionCallback() {...});
jdbcTemplate.execute(sql, new PreparedStatementCallback() {...});
- 将自定义操作定义在Callback接口实现中
- JdbcTemplate会获取Connection或PreparedStatement,然后调用Callback方法
- 这使我们可以完全控制SQL的执行过程
示例:
public class UserConnectionCallback implements ConnectionCallback<List<User>> {
public List<User> doInConnection(Connection conn) throws SQLException {
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user");
ResultSet rs = ps.executeQuery();
List<User> users = ...;
return users;
}
}
List<User> users = jdbcTemplate.execute(new UserConnectionCallback());
- 传入自定义的CallableStatementCreator接口实现,用于调用存储过程:
jdbcTemplate.execute(new CallableStatementCreator() {...});
- 需要在接口实现中定义存储过程以及参数
- JdbcTemplate会创建CallableStatement,然后调用存储过程
示例:
public class UserCallableStatementCreator implements CallableStatementCreator {
public CallableStatement createCallableStatement(Connection conn) throws SQLException {
String sql = "{call get_user_by_id(?)}";
return conn.prepareCall(sql);
}
}
jdbcTemplate.execute(new UserCallableStatementCreator());
所以,execute()方法的作用是用于执行自定义的SQL操作,包括:
- ConnectionCallback/PreparedStatementCallback:自定义查询和更新
- CallableStatementCreator:调用存储过程
通过传入不同接口的实现,可以完全控制SQL的执行过程,不受JdbcTemplate的限制。这大大增强了系统的灵活性,可以整合各种复杂SQL逻辑。
相比只提供固定方法,execute()方法的优势是开放性,可以执行任何SQL操作。