JdbcTemplate是Spring框架提供的一个强大的用于简化JDBC操作的工具类。以下是一些常用的方法及代码示例:
- 执行查询并返回单个结果:
String sql = "SELECT * FROM users WHERE id = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{id}, new UserRowMapper());
这里,queryForObject
方法执行SQL查询,并通过指定的RowMapper
将结果集转换为实体对象。
- 执行查询并返回List集合:
String sql = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(sql, new UserRowMapper());
query
方法会执行SQL查询并返回结果集列表,每个结果行都会通过RowMapper
转换为实体对象。
- 执行更新操作(INSERT/UPDATE/DELETE)并获取影响行数:
String insertSql = "INSERT INTO users(name) VALUES (?)";
int rowsAffected = jdbcTemplate.update(insertSql, userName);
System.out.println("Rows affected: " + rowsAffected);
update
方法用于执行非查询操作,返回值表示受影响的行数。
- 批量更新操作:
String updateSql = "UPDATE users SET name = ? WHERE id = ?";
List<Object[]> batchArgs = new ArrayList<>();
for (User user : usersToUpdate) {
batchArgs.add(new Object[]{user.getName(), user.getId()});
}
jdbcTemplate.batchUpdate(updateSql, batchArgs);
batchUpdate
方法可以一次性执行多个相同的SQL语句,提高效率。
- 调用存储过程:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("sp_get_users_by_age")
.declareParameters(new SqlOutParameter("result", OracleTypes.CURSOR));
Map<String, Object> inParams = new HashMap<>();
inParams.put("minAge", 18);
Map<String, Object> outParams = jdbcCall.execute(inParams);
ResultSet rs = (ResultSet) outParams.get("result");
// 处理结果集...
以上只是JdbcTemplate的部分功能展示,实际使用中还可以结合SqlParameterSource、PreparedStatementCreator等接口进行更灵活的操作。
RowMapper
RowMapper是Spring JDBC中的一个接口,用于将数据库结果集的行转换为Java对象。下面是一个具体的User实体类对应的RowMapper实现:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getLong("id")); // 假设用户表中有id字段
user.setName(rs.getString("name")); // 假设用户表中有name字段
user.setEmail(rs.getString("email")); // 假设用户表中有email字段
// ... 更多字段映射...
return user;
}
}
在上述代码中,mapRow
方法会在每次遍历结果集时被调用,它负责从给定的ResultSet(当前行)中提取数据,并将其封装到User对象中。
然后,在JdbcTemplate的操作中,我们可以使用这个RowMapper来将查询结果转化为User对象列表:
String sql = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(sql, new UserRowMapper());
这样,jdbcTemplate.query()
方法会自动调用RowMapper的mapRow
方法,将每一行结果转换成User对象并添加到返回的列表中。