Spring NamedParameterjdbc詳解和如何獲得主鍵自增值
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請求的域名