Spring利用JDBCTemplate實現批量插入和返回id

1、先介紹一下java.sql.Connection接口提供的三個在執行插入語句后可取的自動生成的主鍵的方法:
//第一個是 
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException;   
其中autoGenerateKeys 有兩個可選值:Statement.RETURN_GENERATED_KEYS、Statement.NO_GENERATED_KEYS        
//第二個是
PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException;
//第三個是
PreparedStatement prepareStatement(String sql, String[] columnNames)throws SQLEception;
 

?


//
批量插入Person實例,返回每條插入記錄的主鍵值 public int[] insert(List<Person> persons) throws SQLException{String sql = "insert into test_table(name) values(?)" ;int i = 0 ;int rowCount = persons.size() ;int[] keys = new int[rowCount] ;DataSource ds = SimpleDBSource.getDB() ;Connection conn = ds.getConnection() ;//根據主鍵列名取得自動生成主鍵值String[] columnNames= {"id"} ;PreparedStatement pstmt = conn.prepareStatement(sql, columnNames) ;Person p = null ;for (i = 0 ; i < rowCount ; i++){p = persons.get(i) ;pstmt.setString(1, p.getName()) ;pstmt.addBatch();}pstmt.executeBatch() ;//取得自動生成的主鍵值的結果集ResultSet rs = pstmt.getGeneratedKeys() ;while(rs.next() && i < rowCount){keys[i] = rs.getInt(1) ;i++ ;}return keys ; }

?

?

?

2、下面是Spring的JDBCTemplate實例

插入一條記錄返回剛插入記錄的id

Java代碼


public int addBean(final Bean b){   final String strSql = "insert into buy(id,c,s,remark,line,cdatetime," + "c_id,a_id,count,type) values(null,?,?,?,?,?,?,?,?,?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); this.getJdbcTemplate().update( new PreparedStatementCreator(){ public java.sql.PreparedStatement createPreparedStatement(Connection conn) throws SQLException{ int i = 0; java.sql.PreparedStatement ps = conn.prepareStatement(strSql); ps = conn.prepareStatement(strSql, Statement.RETURN_GENERATED_KEYS); ps.setString(++i, b.getC()); ps.setInt(++i,b.getS() ); ps.setString(++i,b.getR() ); ps.setString(++i,b.getline() ); ps.setString(++i,b.getCDatetime() ); ps.setInt(++i,b.getCId() ); ps.setInt(++i,b.getAId()); ps.setInt(++i,b.getCount()); ps.setInt(++i,b.getType()); return ps; } }, keyHolder); return keyHolder.getKey().intValue(); } public int addBean(final Bean b){ final String strSql = "insert into buy(id,c,s,remark,line,cdatetime," + "c_id,a_id,count,type) values(null,?,?,?,?,?,?,?,?,?)"; KeyHolder keyHolder = new GeneratedKeyHolder(); this.getJdbcTemplate().update( new PreparedStatementCreator(){ public java.sql.PreparedStatement createPreparedStatement(Connection conn) throws SQLException{ int i = 0; java.sql.PreparedStatement ps = conn.prepareStatement(strSql); ps = conn.prepareStatement(strSql, Statement.RETURN_GENERATED_KEYS); ps.setString(++i, b.getC()); ps.setInt(++i,b.getS() ); ps.setString(++i,b.getR() ); ps.setString(++i,b.getline() ); ps.setString(++i,b.getCDatetime() ); ps.setInt(++i,b.getCId() ); ps.setInt(++i,b.getAId()); ps.setInt(++i,b.getCount()); ps.setInt(++i,b.getType()); return ps; } }, keyHolder); return keyHolder.getKey().intValue(); } 2.批量插入數據 Java代碼 public void addBuyBean(List<BuyBean> list) { final List<BuyBean> tempBpplist = list; String sql="insert into buy_bean(id,bid,pid,s,datetime,mark,count)" + " values(null,?,?,?,?,?,?)"; this.getJdbcTemplate().batchUpdate(sql,new BatchPreparedStatementSetter() { @Override public int getBatchSize() { return tempBpplist.size(); } @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setInt(1, tempBpplist.get(i).getBId()); ps.setInt(2, tempBpplist.get(i).getPId()); ps.setInt(3, tempBpplist.get(i).getS()); ps.setString(4, tempBpplist.get(i).getDatetime()); ps.setString(5, tempBpplist.get(i).getMark()); ps.setInt(6, tempBpplist.get(i).getCount()); } }); } public void addBuyBean(List<BuyBean> list) { final List<BuyBean> tempBpplist = list; String sql="insert into buy_bean(id,bid,pid,s,datetime,mark,count)" + " values(null,?,?,?,?,?,?)"; this.getJdbcTemplate().batchUpdate(sql,new BatchPreparedStatementSetter() { @Override public int getBatchSize() { return tempBpplist.size(); } @Override public void setValues(PreparedStatement ps, int i) throws SQLException { ps.setInt(1, tempBpplist.get(i).getBId()); ps.setInt(2, tempBpplist.get(i).getPId()); ps.setInt(3, tempBpplist.get(i).getS()); ps.setString(4, tempBpplist.get(i).getDatetime()); ps.setString(5, tempBpplist.get(i).getMark()); ps.setInt(6, tempBpplist.get(i).getCount()); } }); } 3.批量插入并返回批量id 注:由于JDBCTemplate不支持批量插入后返回批量id,所以此處使用jdbc原生的方法實現此功能 Java代碼 public List<Integer> addProduct(List<ProductBean> expList) throws SQLException { final List<ProductBean> tempexpList = expList; String sql="insert into product(id,s_id,status,datetime," + " count,o_id,reasons" + " values(null,?,?,?,?,?,?)"; DbOperation dbOp = new DbOperation(); dbOp.init(); Connection con = dbOp.getConn(); con.setAutoCommit(false); PreparedStatement pstmt = con.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS); for (ProductBean n : tempexpList) { pstmt.setInt(1,n.getSId()); pstmt.setInt(2,n.getStatus()); pstmt.setString(3,n.getDatetime()); pstmt.setInt(4,n.getCount()); pstmt.setInt(5,n.getOId()); pstmt.setInt(6,n.getReasons()); pstmt.addBatch(); } pstmt.executeBatch(); con.commit(); ResultSet rs = pstmt.getGeneratedKeys(); //獲取結果 List<Integer> list = new ArrayList<Integer>(); while(rs.next()) { list.add(rs.getInt(1));//取得ID } con.close(); pstmt.close(); rs.close(); return list; }

?

轉載于:https://www.cnblogs.com/langtianya/p/4919866.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397371.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397371.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jsp壓縮html,使用HtmlCompressor壓縮JSP編譯的Html代碼

HtmlCompressor 能夠刪除多余的HTML代碼。它提供多種方法&#xff1a;刪除無用的空行、刪除注釋以及刪除無用的表格等等&#xff0c;簡單而有效。在Java代碼中可以這樣使用&#xff1a;String html getHtml(); //需要處理的Html代碼HtmlCompressor compressor new HtmlCompre…

LVS負載均衡(3)——LVS工作模式與工作原理

LVS介紹及工作原理1. LVS 介紹LVS,Linux Virtual Server 的簡寫&#xff0c;意即 Linux 虛擬服務器&#xff0c;是一個虛擬的服務器集群系統&#xff0c;可以在 UNIX/Linux 平臺下實現負載均衡集群功能。文章&#xff1a;LVS項目介紹LVS集群體系結構LVS集群的IP負載均衡技術LVS…

保留凸性的方式:一個凸函數在一個隨機變量上的期望仍然是凸函數

設函數 gg 是實數范圍內的一個凸函數&#xff0c;DD 是一個隨機變量&#xff0c; 那么函數 GEDg(y?D)GEDg(y?D) 仍然是一個凸函數。 證明&#xff1a;記 θθθθ, yy 與 yy 是任意兩個數 ≥θG(y)θG(y)θEDg(y?D)θEDg(y?D)ED[θg(y?D)θ(gy?D)]ED[g(θyθy?D)]G(θyθ…

MyBatis入門(二)---一對一,一對多

一、創建數據庫表 1.1、創建數據表同時插入數據 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybatis ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SE…

零基礎學Java的10個方法

2019獨角獸企業重金招聘Python工程師標準>>> 版權聲明&#xff1a;本文為北京尚學堂原創文章&#xff0c;未經允許不得轉載。? 零基礎學Java只要方法得當&#xff0c;依然有機會學習好Java編程。 但作為初學者可以通過制定一些合理清晰的學習計劃。 在幫你屢清楚思…

html 轉換為cshtml,使用Html而不是csHtml

我想使用純HTML頁面而不是使用MVC .net的cshtml . 但是當我通過右鍵單擊索引添加視圖時&#xff0c;我只能看到兩個選項 .public class HomeController : Controller{//// GET: /Home/public ActionResult Index(){return View();}}Cshtml(剃刀)Aspx論壇但仍無濟于事 . 我仍然沒…

scp windows 和 linux 遠程復制 (雙向)

一下命令在cmd中 從w -> l : scp D:\a.txt root192.168.2.113:/home/a 從l -> w: scp root192.168.2.113:/home/aaa d:/b.txt 按說在Linux中也可以&#xff0c;但是不知道怎么的只有在winodws上行&#xff0c;在linux上就會報 ssh: connect to host 192.168.2.157 port 2…

北京尚學堂|程序員的智慧

2019獨角獸企業重金招聘Python工程師標準>>> 版權聲明&#xff1a;本文為北京尚學堂原創文章&#xff0c;未經允許不得轉載。 編程是一種創造性的工作&#xff0c;是一門藝術。精通任何一門藝術&#xff0c;都需要很多的練習和領悟&#xff0c;所以這里提出的“智慧…

翼城中學2021高考成績查詢入口,2021年臨汾中考分數線查詢(4)

臨汾2021年中考分數線查詢 2021臨汾中考錄取分數線 19年臨汾中考各校錄取分數線 臨汾各高中錄取分數線 臨汾2021中考錄取線查詢 中考信息網提供2021臨汾中考分數線查詢信息。臨汾中考錄取分數線預計7月初公布&#xff0c;屆時考生可登陸臨汾招生考試網官網查看分數線情況。2…

JSP EL表達式 param、paramValues的使用

JSP EL表達式 param、paramValues的使用&#xff1a; <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%String path request.getContextPath();String basePath request.getScheme() "://" request…

配置Tomcat使用HTTP/2

轉自&#xff1a; https://zhuanlan.zhihu.com/p/21349186 前情提要&#xff1a; Tomcat高效響應的秘密(一) Sendfile與Gzip Tomcat高效響應的秘密(二) keep alive 前面高效響應的兩篇&#xff0c;我們分析了Sendfile的特性以及HTTP1.1的keep-alive特性&#xff0c;基于這些功…

asp.net razor html,從控制臺應用程序中的ASP.NET Razor模板生成HTML的當前最佳解決方案是什么?...

ServiceStack是用于呈現Razor視圖頁面的另一個選項。 盡管它已針對集成到ASP.NET或HttpListener Web Host中進行了優化(并提供了用于在目錄中自動發現和注冊視圖頁面&#xff0c;即時重新編譯修改后的頁面等的API)&#xff0c;但它還支持靜態生成視圖頁面 &#xff1a;var razo…

通過NSNotification來監聽鍵盤彈出和彈回

在通知中心建立一個廣播來監聽鍵盤的彈出和彈回&#xff0c;在監聽事件中加入觸發事件的一些操作。 [[NSNotificationCenter defaultCenter]addObserver:self selector:selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];[[NSNotificatio…

Xcode緩存數據清除

1. 移除 APP 打包的ipa歷史版本(Archives) 不可恢復&#xff0c;就是你打的包&#xff0c;如果需要dysm文件&#xff0c;及時備份 路徑&#xff1a;~/Library/Developer/Xcode/Archives 2. 移除對舊設備的支持 可重新生成&#xff1b;再連接舊設備調試時&#xff0c;會重新自動…

IT綜合學習網站收集

最近整理了一下曾經使用過的IT從入門到廣泛的綜合類基礎學習網站&#xff0c;記錄下來&#xff0c;以便初學者使用&#xff1a; 1.http://www.w3school.com.cn/ 中文版基礎在線學習平臺 2.http://www.runoob.com/ 中文版基礎在線學習平臺&#xff08;和W3類似&#xff09; 3.h…

電大計算機網絡網考,電大計算機網絡(本)學習周期01任務A_0009答案

一、單項選擇題(共 20 道試題&#xff0c;共 60 分。)1. ( )和數據通信是計算機網絡最基本的兩大功能。A. 資源共享B. 病毒管理C. 用戶管理D. 站點管理2. 計算機網絡系統是由通信子網和( )子網組成的。A. 資源B. 數字C. 信息D. 模擬3. 網絡資源子網負責( )。A. 數據通信B. 數字…

mac安裝gdb及為gdb進行代碼簽名

1. 安裝gdb GDB作為一個強大的c/c調試工具&#xff0c;一直是程序猿們的良好伴侶&#xff0c;但轉到Mac os才發現竟然沒有默認安裝&#xff0c;所幸還有強大的homebrew工具&#xff1a; brew install homebrew/dupes/gdb然后就是漫長的等待編譯安裝時間了&#xff0c;安裝完成后…

Python學習---Django的基礎操作180116

Django創建數據庫操作 django流程之model實例 settigs.py&#xff1a;更改Django2.0.1的配置&#xff0c;更新為之前的路徑配置 DIRS: [os.path.join(BASE_DIR, templates)], # 設置templates的路徑為Django以前版本 # DIRS: [], # 注釋掉該行&#xff0c;此為Django 2.0…

PO、VO、DAO、BO、POJO

一、PO :(persistant object )&#xff0c;持久對象 可以看成是與數據庫中的表相映射的java對象。使用Hibernate來生成PO是不錯的選擇。二、VO :(value object) &#xff0c;值對象通常用于業務層之間的數據傳遞&#xff0c;和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對…

計算機網絡是將地理知識,計算機網絡的基礎知識精選.ppt

計算機網絡的基礎知識精選習題演練 1&#xff0c;WAN的中文含義是()。   A. 局域網   B. 城域網 C. 廣域網   D. 增值網 2&#xff0c;LAN的中文含義是()。   A. 局域網 B. 城域網 C. 廣域網 D. 增值網 3&#xff0c;MAN的中文含義是()。   A. 局域網   B. 城域網 C…