java [30] NamedParameterJdbcTemplate使用帶命名引數的JDBCtemplete
阿新 • • 發佈:2018-11-10
在經典的 JDBC 用法中, SQL 引數是用佔位符 ? 表示,並且受到位置的限制. 定位引數的問題在於, 一旦引數的順序發生變化, 就必須改變引數繫結. 在 Spring JDBC 框架中, 繫結 SQL 引數的另一種選擇是使用具名引數(named parameter).
那麼什麼是具名引數?
具名引數: SQL 按名稱(以冒號開頭)而不是按位置進行指定. 具名引數更易於維護, 也提升了可讀性. 具名引數由框架類在執行時用佔位符取代具名引數只在 NamedParameterJdbcTemplate 中得到支援。NamedParameterJdbcTemplate可以使用全部jdbcTemplate方法,除此之外,我們來看看使用它的具名引數案例:
package com.us.spring; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import com.us.sqltable.userInfo; import datasource.DBCPUtils; public class NamedJdbcTemplete { static NamedParameterJdbcTemplate named = new NamedParameterJdbcTemplate( DBCPUtils.getDataSource()); @SuppressWarnings("deprecation") public static void main(String[] args) { /*List user = findUsers(5, 100f); System.out.println(user);*/ userInfo user = new userInfo(); user.setId(5); user.setMoney(500f); System.out.println(findUsers2(user)); user.setBirthday(new Date(1028, 3, 15)); user.setUsername("mo"); user.setPasswd("rt"); user.setType("ooxx"); addUser(user); } // 插入資料時使用NamedParameterJdbcTemplate比JdbcTemplate簡單點 static void addUser(userInfo user) { String sql = "insert into userInfo(username,passwd,type,birthday,money) values (:username,:passwd,:type,:birthday,:money)"; SqlParameterSource sps = new BeanPropertySqlParameterSource(user); KeyHolder keyHolder = new GeneratedKeyHolder(); named.update(sql, sps, keyHolder); int id = keyHolder.getKey().intValue(); user.setId(id); //如果是組合主鍵 Map map = keyHolder.getKeys(); //獲取key 列名 System.out.println(map); } static List findUsers(int id,float money) { //一般方法 //String sql = "select username,passwd,type,birthday,money from userInfo where id<? and ? money >?"; //使用命名引數 String sql = "select username,passwd,type,birthday,money from userInfo where id<:i and money >:m"; //假如資料庫中的名字跟java類中的名字對應不起來,可以使用別名同樣實現 //String sql = "select user_name,passwd,type,birthday,money from userInfo where username=?"; Map params = new HashMap(); params.put("i", id); params.put("m", money); //userInfo user=new userInfo(); List users = named.query(sql, params, new BeanPropertyRowMapper<userInfo>(userInfo.class)); return users; } static List findUsers2(userInfo user) { //這種方法比較簡單,但是需要傳入一個物件,並且:後面的名字有限制。 String sql = "select username,passwd,type,birthday,money from userInfo where id<:id and money >:money"; SqlParameterSource sps = new BeanPropertySqlParameterSource(user); List users = named.query(sql, sps, new BeanPropertyRowMapper<userInfo>(userInfo.class)); return users; } }