JdbcTemplate.query(String sql, Object[] args, RowMapper<T> rowMapper) 是查詢多筆資料並映射為物件列表的標準方法。
@Repository
public class TaskDaoImpl implements TaskDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List findTaskList(int flag, int limit, int max) {
String sql = "SELECT t.* FROM task t WHERE t.flag = ? LIMIT ?, ?";
// 參數綁定 (防止 SQL 注入)
Object[] params = new Object[] { flag, limit, max };
// 執行查詢並映射
List taskList = jdbcTemplate.query(sql, params, new RowMapper() {
@Override
public Task mapRow(ResultSet rs, int rowNum) throws SQLException {
Task task = new Task();
task.setId(rs.getLong("id"));
task.setWorkorderid(rs.getInt("workorderid"));
task.setFlag(rs.getInt("flag"));
// 其他欄位...
return task;
}
});
return taskList;
}
}
new RowMapper() { @Override public Task mapRow(ResultSet rs, int rowNum) throws SQLException { Task t = new Task(); t.setId(rs.getLong("id")); // ... return t; } }
(rs, rowNum) -> {
Task t = new Task();
t.setId(rs.getLong("id"));
t.setWorkorderid(rs.getInt("workorderid"));
t.setFlag(rs.getInt("flag"));
return t;
}
public class TaskRowMapper implements RowMapper{ @Override public Task mapRow(ResultSet rs, int rowNum) throws SQLException { Task task = new Task(); task.setId(rs.getLong("id")); task.setWorkorderid(rs.getInt("workorderid")); task.setFlag(rs.getInt("flag")); return task; } } // 使用 jdbcTemplate.query(sql, params, new TaskRowMapper());
// 需資料庫欄位名與 Java 屬性名完全對應 (駝峰/下劃線) jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<>(Task.class));
| 方式 | 範例 | 適用場景 |
|---|---|---|
| Object[] 陣列 | new Object[]{flag, limit, max} | 固定參數數量、簡單查詢 |
| List 轉陣列 | params.toArray() | 動態構建參數 |
| MapSqlParameterSource | new MapSqlParameterSource().addValue("flag", flag) | 命名參數 (需 NamedParameterJdbcTemplate) |
| PreparedStatementSetter | ps -> { ps.setInt(1, flag); ... } | 複雜型別 (Blob, Clob, Array 等) |
Task task = jdbcTemplate.queryForObject(
"SELECT * FROM task WHERE id = ?",
new Object[]{id},
new TaskRowMapper()
);
分頁查詢 (MySQL LIMIT)
異常處理與交易
EmptyResultDataAccessException:queryForObject 查無資料時拋出DataAccessException:Spring 統一資料存取異常體系,非檢查型異常@Transactional 進行交易管理batchUpdate 大量寫入jdbcTemplate.setFetchSize(1000)# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: 123456
hikari:
maximum-pool-size: 20
minimum-idle: 5
# 自動注入 JdbcTemplate,無需額外配置