1. 程式人生 > >Spring NamedParameterjdbc詳解和如何獲得主鍵自增值

Spring NamedParameterjdbc詳解和如何獲得主鍵自增值

NamedParameterJdbcTemplate類是基於JdbcTemplate類,並對它進行了封裝從而支援命名引數特性。
NamedParameterJdbcTemplate主要提供以下三類方法:execute方法、query及queryForXXX方法、update及batchUpdate方法。

首先讓我們看個例子吧:

@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物件屬性來決定命名引數的值。

package cn.javass.spring.chapter7;  
public class UserModel {  
    private int id;  
    private String myName;     
    //省略getter和setter       
}  

@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屬性名稱相對應才可以。

上面是看轉載別人的部落格,下面我來補充一點,我建立的表中實現了主鍵自增
但是如何獲得自增後的主鍵值呢,不能直接通過user.getId();
之前我利用JdbcTemplate獲得了自增的主鍵值,自己摸索了一下後,發現NamedParameterJdbcTemplate採用類似的方法


下面列舉下我實現的程式碼:
向表中插入資料的Sql語句:

private final String INSERT_SQL="insert into td(user_name,password)values(:user_name,:password)";
執行sql語句和獲得主鍵自增值:
@Override
	public KeyHolder save(UserModel user) {
		KeyHolder keyHolder=new GeneratedKeyHolder();
		/**
		 * SqlParameterSource:可以使用SqlParameterSource實現作為來實現為命名引數設值,
		 * 預設有MapSqlParameterSource和BeanPropertySqlParameterSource實現;
		 * MapSqlParameterSource實現非常簡單,只是封裝了java.util.Map;
		 * 而BeanPropertySqlParameterSource封裝了一個JavaBean物件,通過JavaBean物件屬性來決定命名引數的值。
		 */
		SqlParameterSource paramSource=new BeanPropertySqlParameterSource(user);
		/**
		 * 設定如何獲取自增主鍵值,注意下面的引數,下面的比較重要
		 */
		getNamedParameterJdbcTemplate().update(INSERT_SQL, paramSource,keyHolder,new String[]{"id"});
		return keyHolder;
	}


通過KeyHolder.getKey().intVal便可以獲得自增的主鍵值

今天被虐慘了,唉,得靜下心來追趕了!

相關推薦

Spring NamedParameterjdbc如何得主增值

NamedParameterJdbcTemplate類是基於JdbcTemplate類,並對它進行了封裝從而支援命名引數特性。 NamedParameterJdbcTemplate主要提供以下三類方法:execute方法、query及queryForXXX方法、update

mybatis使用@Insert @SelectKey 執行插入語句時得主增長值

@Insert(" insert into table(c1,c2) " + " values (#{c1},#{c2}) ") @SelectKey(resultType = long.class,keyColumn = "id",before = fa

spring事務管理(例項)

原文地址: 寫這篇部落格之前我首先讀了《Spring in action》,之後在網上看了一些關於Spring事務管理的文章,感覺都沒有講全,這裡就將書上的和網上關於事務的知識總結一下,參考的文章如下: 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取

aop基於spring-aop xml的簡單程式設計

文章目錄 AOP核心概念 1、橫切關注點 2、切面(Aspect) 3、連線點(joinpoint) 4、切入點(pointcut) 5、通知(advice) 6、

Spring Security(一)認證之核心元件服務

一直以來都特別喜歡Spring的全家桶系列,也一直想寫關於Spring Security的系列文章,接觸security從最初的Guide開始入手,到專案中的原始碼閱讀,最近又沉下心來看了幾遍文件,打算嘗試一下,把我的理解都記錄下來,寫一個較為完整的系列文章。

mysql 外來(foreign key)的例項

外來鍵具有保持資料完整性和一致性的機制,對業務處理有著很好的校驗作用。 ============================白話文簡介================================= 簡單來說,若profile表的uid列作為外來鍵user_profile,參考的主表的列(refere

Spring實現自動裝配(spring註解手動注入比較

概述 註釋配置相對於 XML 配置具有很多的優勢: 它可以充分利用 Java 的反射機制獲取類結構資訊,這些資訊可以有效減少配置的工作。如使用 JPA 註釋配置 ORM 對映時,我們就不需要指定 PO 的屬性名、型別等資訊,如果關係表字段和 PO 屬性名、型別都一致,您

Mysql 外來例項

外來鍵具有保持資料完整性和一致性的機制,對業務處理有著很好的校驗作用。 ============================白話文簡介================================= user 表:id 為主鍵 profile 表: uid 為主鍵 簡單來說,若表 profile 的

android studio 工具使用快捷使用

可以開發屬於自己的應用,是否有點小激動?好吧!讓我們開始,首先點選Start a new Android Studio Project建立工程: 接下來需要輸入應用名稱(第一個字母要大寫)、公司域以及指定應用存放目錄,點選Next按鈕進入下一步: 如果第一個字母不

SVN trunk(主線) branch(分支) tag(標記) 用法詳細操作步驟

trac load mar span 必須 最可 objc copy 右鍵 原文地址:http://blog.csdn.net/vbirdbest/article/details/51122637 使用場景: 假如你的項目(這裏指的是手機客戶端項目)的某個版本(例如1.0

Storm容錯機制Acker實戰案例

storm acker 失敗重發 可靠性Storm中有個特殊的Executor叫acker,他們負責跟蹤spout發出的每一個Tuple的Tuple樹。當acker發現一個Tuple樹已經處理完成了,它會告訴框架回調Spout的ack(),否則回調Spout的fail()。Acker的跟蹤算法是Storm的主

JS中的showModelDialog實例

cti 信息 創建 字符 非模態窗口 tle cin dialog ima 1.<a href="#" onclick="SeePic(‘${list.PATH}‘)"><font color="blue">預覽</font></a

Spring Mvc

spring mvc一、spring mvc處理請求的流程。客戶端發出http請求,如果匹配到DispatcherServlet的請求映射路徑,則web容器將請求轉交給DispatcherServlet處理。DispatcherServlet接受到請求後,根據請求的信息和HandlerMapping的配置,找

Spring JdbcTemplate

bject 方便 object 不能 數據源 cte led 執行 pre JdbcTemplate簡介   Spring對數據庫的操作在jdbc上面做了深層次的封裝,使用spring的註入功能,可以把DataSource註冊到JdbcTemplate之中。   Jdb

Spring AOP

開發 blank 關註 proxy 系統 frame main函數 lns 功能 一.前言 在以前的項目中,很少去關註spring aop的具體實現與理論,只是簡單了解了一下什麽是aop具體怎麽用,看到了一篇博文寫得還不錯,就轉載來學習一下,博文地址:htt

AFNetworking 3.0 使用 源碼解析實現原理

數據 syn ria 特定 style conn afn rda gre AFN原理&& AFN如何使用RunLoop來實現的: NSString * requestURL = @"http://119.254.98.136/api/v1/web/

【轉載】Spring AOP 、 JDK動態代理、CGLib動態代理

rto 工廠 第一個 lec 僅支持 sel clas sleep gpo 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的簡稱,面向切面

redis lru緩存清理算法相關配置

rand add 就是 即使 oev ima 最大的 進行 時間比較 首先,需要先配置redis的conf文件,涉及到lru相關的配置一共有三個分別是:maxmemory,設置redis用來存放數據的最大的內存大小,一旦超出這個內存大小之後,就會立即使用LRU算法清理掉部分

【CronExpression表達式案例】(轉載)

強烈 簡單的 exce 初始 每分鐘 第三周 normal orm 以及 原文地址:https://www.cnblogs.com/pipi-changing/p/5697481.html 找了下Cron的資料,這篇作者寫的比較清晰,轉載記錄一下,方便後面使用的時候在g

iOS NSURLProtocol應用

com string handle gist mutable 註冊 header rec canonical   問題:因dns發生域名劫持 需要手動將URL請求的域名重定向到指定的IP地址   最近在項目裏由於電信那邊發生dns發生域名劫持,因此需要手動將URL請求的域名