1. 程式人生 > >Spring JDBC Template ,以及使用preparedstatements傳引數

Spring JDBC Template ,以及使用preparedstatements傳引數

JdbcTemplate 被定義為一個Spring 管理的bean 該bean 是執行緒安全的,並且可以被不同的資料訪問物件所共享,因此被定義為單利,JdbcTemplate 的bean主要依賴項為一個DataSource 物件, 所以,需要把建立的dataSource 物件注入到JdbcTemplat
spring 將資料訪問的樣本程式碼抽象到模板類中 spring 為JDBC 提供了兩種型別的模板類供給選擇
1 .JdbcTemplate :最基本的jdbc模板,這個模板支援簡單的資料庫訪問功能,以及基於索引引數的查詢
2 NamedParameterJdbcTemplate 查詢時可以將值以命名引數的形式繫結到SQL 中,而不是使用簡單的索引引數
一般來說,jdbcTemplate 是最好的選擇方案, 只有在需要使用命名引數的時候,才需要使用到NamedParameterJdbcTemplate

JdbcTemplate 查詢
JdbcTemplate 通過不同的過載白本提供了各種方法來執行查詢,並將查詢結果作為應用程式中不同物件型別進行處理,有 query() queryForObject() queryForList() queryForMap() queryForRowSet() 方法以及他們多個不同的過載方法(接收不同輸入引數,比如 查詢字串,查詢輸入引數值,型別,結果物件型別等)
JdbcTemplate 的query() queryForObject() 方法完全遵循了相同的方法,他們接收查詢字串,查詢引數以及RowMapper 型別的回撥物件作為輸入引數
JdbcTemplate 可以使用RowMapper 將ResultSet 中返回的每一行對映到一個結果物件。通常作為一個輸入引數傳遞給JdbcTemplate ,當然也可以使用new BeanPropertyRowMapper<>(User.class) 直接輸入物件類來返回結果物件
queryForList() queryForMap() 方法採用了一種更簡單方法,queryForList() 方法執行查詢並換回一個List 。queryForMap() 返回一個Map 該map 的鍵為列名

JdbcTemplate 插入,更新 刪除
所有的入,更新 刪除 SQL 操作都是使用JdbcTemplate 的update方法完成

當然jdbctemplate也支援使用preparedstatements 來傳引數 ,首先先區分 preparedstatements 和statement的區別在與什麼地方
statement 在執行一個查詢的時候,資料庫將首先查詢字串,然後在執行之前進行解析,編譯以及計算執行計劃, 如果多次執行相同的查詢,那麼該預處理步驟就會成為一個性能瓶頸,而如果使用preparedstatements ,則該預處理不走僅被執行一次,因此,會減少執行時間,相比於每次動態建立查詢字串,使用preparedstatements 的另外一個好處就是保護系統免受sql 注入供給,preparedstatements 執行的查詢使用起來更安全
jdbcTemplate 對preparedstatements 提供了方法 主要是將普通的引數改為 PreparedStatementSetter 來設定傳入的引數 方法如下

query(String sql, PreparedStatementSetter pss, RowMapper<T> rowMapper)
  List<User> userList = jdbcTemplate.query("select * from user where id = ?", preparedStatement -> preparedStatement.setInt(1,id), new BeanPropertyRowMapper<>(User.class));
query(PreparedStatementCreator psc, RowMapper<T> rowMapper)

jdbctempleate demo gitjdbctempleate