📌  相关文章
📜  需要一个 'org.springframework.jdbc.core.JdbcTemplate 类型的 bean (1)

📅  最后修改于: 2023-12-03 15:12:50.671000             🧑  作者: Mango

需要一个 org.springframework.jdbc.core.JdbcTemplate 类型的 bean

简介

JdbcTemplate 是 Spring 框架提供的数据访问模板,用于简化 JDBC 编程。JdbcTemplate 需要 DataSource 来获取数据库连接。它提供了一系列的方法来执行 SQL 语句和存储过程,并处理结果集。

定义 org.springframework.jdbc.core.JdbcTemplate bean

在 Spring 配置文件中,可以通过以下方式定义 JdbcTemplate bean:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

其中,dataSource 为实现了 javax.sql.DataSource 接口的 bean,用于获取数据库连接。

另外,可以通过构造器注入的方式来定义 JdbcTemplate bean:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>
使用 JdbcTemplate
执行SQL语句

JdbcTemplate 提供了 update() 方法来执行 SQL 语句,如 INSERT、UPDATE 和 DELETE 等,该方法会返回受影响的行数:

public int executeUpdate(String sql)
public int executeUpdate(String sql, Object... args)

示例:

jdbcTemplate.update("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 30);

JdbcTemplate 还提供了批量执行 SQL 语句的方法 batchUpdate()

public int[] batchUpdate(String sql, List<Object[]> batchArgs)

示例:

List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[]{"Alice", 30});
batchArgs.add(new Object[]{"Bob", 25});
batchArgs.add(new Object[]{"Charlie", 40});
int[] updateCounts = jdbcTemplate.batchUpdate("INSERT INTO users (name, age) VALUES (?, ?)", batchArgs);
查询单个结果

如果只需要查询单个结果,可以使用 queryForObject() 方法,该方法会返回查询结果的第一行第一列的值:

public <T> T queryForObject(String sql, Class<T> requiredType)
public <T> T queryForObject(String sql, Object[] args, Class<T> requiredType)

示例:

String name = jdbcTemplate.queryForObject("SELECT name FROM users WHERE id = ?", new Object[]{1}, String.class);
查询多个结果

如果需要查询多个结果,可以使用 query() 方法,该方法会返回查询结果的一个列表:

public <T> List<T> query(String sql, RowMapper<T> rowMapper)
public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)

示例:

查询 users 表中所有用户的信息:

List<User> users = jdbcTemplate.query("SELECT * FROM users", new RowMapper<User>() {
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setAge(rs.getInt("age"));
        return user;
    }
});
执行存储过程

JdbcTemplate 还提供了 call() 方法来执行存储过程:

public Map<String, Object> call(CallableStatementCreator csc, List<SqlParameter> declaredParameters) throws DataAccessException
public <T> T execute(CallableStatementCreator csc, CallableStatementCallback<T> action) throws DataAccessException

示例:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
        .withProcedureName("sp_update_user_age");
Map<String, Object> inParams = new HashMap<>();
inParams.put("id", 1);
inParams.put("age", 40);
SqlParameterSource in = new MapSqlParameterSource(inParams);
jdbcCall.execute(in);
总结

JdbcTemplate 可以帮助开发者简化 JDBC 编程,提供了一系列的方法来执行 SQL 语句和存储过程,并处理结果集。在定义 JdbcTemplate bean 时需要注意为其设置数据源,使用时可以直接调用其提供的方法来访问数据库。