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.mzph.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…