Spring 的 NamedParameterJdbcTemplate(轉),springnobeannamed
NamedParameterJdbcTemplate類是基於JdbcTemplate類,並對它進行了封裝從而支持命名參數特性。
NamedParameterJdbcTemplate主要提供以下三類方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。
首先讓我們看個例子吧:
java代碼:
Java代碼
- @Test
- public void testNamedParameterJdbcTemplate1() {
- NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;
- //namedParameterJdbcTemplate =
- // new NamedParameterJdbcTemplate(dataSource);
- namedParameterJdbcTemplate =
- 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<String, Object>();
- paramMap.put("name", "name5");
- namedParameterJdbcTemplate.update(insertSql, paramMap);
- final List<Integer> result = new ArrayList<Integer>();
- namedParameterJdbcTemplate.query(selectSql, paramMap,
- new RowCallbackHandler() {
- @Override
- public void processRow(ResultSet rs) throws SQLException {
- result.add(rs.getInt("id"));
- }
- });
- Assert.assertEquals(1, result.size());
- SqlParameterSource paramSource = new MapSqlParameterSource(paramMap);
- namedParameterJdbcTemplate.update(deleteSql, paramSource);
- }
接下來讓我們分析一下代碼吧:
1)NamedParameterJdbcTemplate初始化:可以使用DataSource或JdbcTemplate 對象作為構造器參數初始化;
2)insert into test(name) values(:name):其中“:name”就是命名參數;
3) update(insertSql, paramMap):其中paramMap是一個Map類型,包含鍵為“name”,值為“name5”的鍵值對,也就是為命名參數設值的數據;
4)query(selectSql, paramMap, new RowCallbackHandler()……):類似於JdbcTemplate中介紹的,唯一不同是需要傳入paramMap來為命名參數設值;
5)update(deleteSql, paramSource):類似於“update(insertSql, paramMap)”,但使用SqlParameterSource參數來為命名參數設值,此處使用MapSqlParameterSource實現,其就是簡單封裝java.util.Map。
NamedParameterJdbcTemplate類為命名參數設值有兩種方式:java.util.Map和SqlParameterSource:
1)java.util.Map:使用Map鍵數據來對於命名參數,而Map值數據用於設值;
2)SqlParameterSource:可以使用SqlParameterSource實現作為來實現為命名參數設值,默認有MapSqlParameterSource和BeanPropertySqlParameterSource實現;MapSqlParameterSource實現非常簡單,只是封裝了java.util.Map;而BeanPropertySqlParameterSource封裝了一個JavaBean對象,通過JavaBean對象屬性來決定命名參數的值。
java代碼:
Java代碼
- package cn.javass.spring.chapter7;
- public class UserModel {
- private int id;
- private String myName;
- //省略getter和setter
- }
java代碼:
Java代碼
- @Test
- public void testNamedParameterJdbcTemplate2() {
- NamedParameterJdbcTemplate namedParameterJdbcTemplate = null;
- namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
- UserModel model = new UserModel();
- model.setMyName("name5");
- String insertSql = "insert into test(name) values(:myName)";
- SqlParameterSource paramSource = new BeanPropertySqlParameterSource(model);
- namedParameterJdbcTemplate.update(insertSql, paramSource);
- }
可以看出BeanPropertySqlParameterSource使用能減少很多工作量,但命名參數必須和JavaBean屬性名稱相對應才可以。