NamedParameterJdbcTemplate 是 Spring 對 JdbcTemplate 的增強封裝,支援 SQL 中使用命名參數(如 :name)替代傳統佔位符(?),大幅提升 SQL 可讀性與維護性。本文詳細介紹其核心用法與兩種參數綁定方式。
// 方式一:使用 DataSource
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate(dataSource);
// 方式二:使用現有 JdbcTemplate(推薦,復用連線池)
NamedParameterJdbcTemplate npjt = new NamedParameterJdbcTemplate(jdbcTemplate);
String insertSql = "INSERT INTO test(name) VALUES(:name)";
String selectSql = "SELECT * FROM test WHERE name=:name";
String deleteSql = "DELETE FROM test WHERE name=:name";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "name5");
// 執行更新
npjt.update(insertSql, paramMap);
// 查詢
List<Integer> result = new ArrayList<>();
npjt.query(selectSql, paramMap, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
result.add(rs.getInt("id"));
}
});
// 使用 SqlParameterSource 刪除
SqlParameterSource paramSource = new MapSqlParameterSource(paramMap);
npjt.update(deleteSql, paramSource);
定義實體類別:
public class UserModel {
private int id;
private String myName;
// getter/setter 省略
}
直接綁定物件屬性:
UserModel model = new UserModel();
model.setMyName("name5");
String insertSql = "INSERT INTO test(name) VALUES(:myName)";
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(model);
npjt.update(insertSql, paramSource);
關鍵規則:SQL 中的命名參數(:myName)必須與 JavaBean 屬性名稱(myName)完全一致。
| 參數來源 | 適用場景 | 優點 | 注意事項 |
|---|---|---|---|
| Map<String, Object> | 簡單參數、動態構建 | 靈活、無需定義類別 | 需手動 put 每個參數 |
| BeanPropertySqlParameterSource | 實體物件已存在 | 自動映射屬性、減少樣板碼 | 屬性名需與 SQL 參數名一致 |
| MapSqlParameterSource | Map 封裝為 SqlParameterSource | 支援鏈式呼叫 addValue() | 本質仍是 Map |
NamedParameterJdbcTemplate 同樣支援 batchUpdate(),參數來源可為 SqlParameterSource[] 陣列,適合大量資料匯入場景。
NamedParameterJdbcTemplate 是 Spring JDBC 開發的利器。實務中建議:
JdbcTemplate 初始化Map 綁定BeanPropertySqlParameterSource,實現零樣板碼參數綁定掌握命名參數綁定技巧,能讓資料庫操作程式碼更清晰、更安全、更易維護。