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;
- }
Spring利用JDBCTemplate实现批量插入和返回id的更多相关文章
- mybatis的插入与批量插入的返回ID的原理
目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...
- spring data jpa开启批量插入、批量更新
spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...
- ibatis插入数据返回ID的方法
ibatis插入数据返回ID的方法 主要就是利用seelctkey来获取这个ID值,但是oracle和mysql的区别还是很大的 oracle的用法 <insert id="inser ...
- mybatis批量插入并返回主键(序列)-oracle
需求:批量插入数据,并返回每条数据的主键(序列),因为这里是采用序列生成唯一的主键的, 其实oracle批量 插入操作有几种,网上百度都是有相关资源的.但是笔者现在的需求是,不仅批量插入数据后,并返回 ...
- Mybatis(spring)(多个参数)(插入数据返回id)
一. 1.两个参数都是int类型() 例子: 1 < select id="searchClassAllNum" resultType="int"> ...
- 利用MySQL存储过程批量插入100W条测试数据
DROP PROCEDURE IF EXISTS insert_batch; CREATE PROCEDURE insert_batch() BEGIN ; loopname:LOOP '); ; T ...
- MySQL插入数据返回id
按照应用需要,常常要取得刚刚插入数据库表里的记录的ID值,在MYSQL中可以使用LAST_INSERT_ID()函数,在MSSQL中使用 @@IDENTITY.挺方便的一个函数.但是,这里需要注意的是 ...
- MyBatis插入并返回id技巧
1, 使用返回插入id的值,这个值即是当前插入的id
- mybatis 插入数据返回ID
hibernate中插入数据后会返回插入的数据的ID,mybatis要使用此功能需要在配置文件中显示声明两个属性即可:
随机推荐
- js-FCC算法Friendly Date Ranges
让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...
- 【bzoj1086】 scoi2005—王室联邦
http://www.lydsy.com/JudgeOnline/problem.php?id=1086 (题目链接) 题意 求将树分为几个联通块,每个联通块大小大于B小于3B,是否可行. Solut ...
- PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]
catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...
- Maven异常:Could not find artifact
用Maven build("clean tomcat7:run" ) Maven聚合工程时,出现了一下问题: [INFO] Scanning for projects... [E ...
- 【Alpha】团队贡献分配计划
在仔细看过邹老师的博客和一些主流公司的绩效管理考核方面的内容后,本来我们小组在讨论后决定简化Google的OKR制度,加入一些自己的元素作为我们团队的主要贡献评定制度. OKR就是“目标和关键成果”( ...
- zabbix监控系列(4)之zabbix报警邮件无法发送
情况介绍 首先确保邮箱规则没有把报警邮件作为垃圾邮件拉黑了. 服务器断电重启后,发现zabbix报警邮件无法发送,断电之前是好好的,但是重启后不行了,于是查看maillog日志,发现这个错误: Hos ...
- python小打小闹之简陋版BBS
闲的蛋疼,索性写个东西玩,于是,写个类似于BBS的念头就开始了. 我们考虑到需要实现的功能: 1 只有登陆的用户才可以点赞,如果没有登陆,那么不可以点赞,点赞次数只可以为1. 2 只有登陆的用户可以评 ...
- JavaScript之继承(原型链)
JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...
- 时间日期----java
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- hibernate......1、2级缓存
1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在 ...