PreparedStatement 批量更新,插入数据到Oracle mysql

PreparedStatement实现数据更新 PreparedStatement实现数据更新 在之前分析Statement接口的时候所采用的就是一种数据增加的更新处理才发现的问题,同样现在将通过PreparedStatement接口来解决之前所遇到的问题。 在使用PreparedStatement接口的时候由于需要准确的设置数据的操作类型,所以在进行日期设置的时候就需要有一个非常重要的说明: PreparedStatement 支持的是java.sql.Date,而不支持java.util.Date对象实例。 在PreparedStat. 阅读详情
  1. /**   
  2.  * 更新数据库已有的customer信息   
  3.  * @param List<CustomerBean>   
  4.  * @return    
  5.  */    
  6. public int updateExistsInfo(List<CustomerBean> updateList){    
  7.     //查询的SQL语句    
  8.     String sql = "update t_customer set LICENSE_KEY=?,CORPORATE_NAME=?,INTEGRATED_CLASSIFICATION=?,BOSSHEAD=?," +    
  9.             "CONTACT_PHONE=?,ORDER_FREQUENCY=?,CONTACT_ADDRESS=?,USER_ID=? where CUSTOMER_ID=?" ;        
  10.     //插入需要的数据库对象    
  11.     Connection conn = null;    
  12.     PreparedStatement pstmt = null;    
  13.     
  14.     try  {              
  15.         conn = new DBSource().getConnection();    
  16.         //设置事务属性    
  17.         conn.setAutoCommit(false);      
  18.         pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);                
  19.         for(CustomerBean cbean : updateList){    
  20.             pstmt.setString(1, cbean.getLicense_key());    
  21.             pstmt.setString(2, cbean.getCorporate_name());    
  22.             pstmt.setString(3, cbean.getIntegrated_classification());    
  23.             pstmt.setString(4, cbean.getBosshead());    
  24.             pstmt.setString(5, cbean.getContact_phone());    
  25.             pstmt.setString(6, cbean.getOrder_frequency());    
  26.             pstmt.setString(7, cbean.getContact_address());    
  27.             pstmt.setInt   (8, cbean.getUser_id());    
  28.             pstmt.setInt   (9, cbean.getCustomer_id());    
  29.                 
  30.             pstmt.addBatch();    
  31.                 
  32.         }    
  33.         int[] tt = pstmt.executeBatch();    
  34.         System.out.println("update : " + tt.length);    
  35.     
  36.         //提交,设置事务初始值    
  37.         conn.commit();    
  38.         conn.setAutoCommit(true);    
  39.     
  40.         //插入成功,返回    
  41.         return tt.length;    
  42.     
  43.     }catch(SQLException ex){    
  44.         try{    
  45.             //提交失败,执行回滚操作    
  46.             conn.rollback();    
  47.     
  48.         }catch (SQLException e) {    
  49.             e.printStackTrace();    
  50.             System.err.println("updateExistsInfo回滚执行失败!!!");    
  51.         }    
  52.     
  53.         ex.printStackTrace();    
  54.         System.err.println("updateExistsInfo执行失败");    
  55.     
  56.         //插入失败返回标志0    
  57.         return 0;    
  58.     
  59.     }finally {    
  60.         try{    
  61.             //关闭资源    
  62.             if(pstmt != null)pstmt.close();    
  63.             if(conn != null)conn.close();    
  64.                 
  65.         }catch (SQLException e) {    
  66.             e.printStackTrace();    
  67.             System.err.println("资源关闭失败!!!");    
  68.         }    
  69.     }    
  70. }     
  71.     
  72. /**   
  73.  * 插入数据中没有的customer信息   
  74.  * @param List<CustomerBean>   
  75.  * @return    
  76.  */    
  77. public int insertNewInfo(List<CustomerBean> insertList){    
  78.                 
  79.     //查询的SQL语句    
  80.     String sql = "insert into t_customer(CUSTOMER_ID," +    
  81.             "LICENSE_KEY,CORPORATE_NAME,INTEGRATED_CLASSIFICATION,BOSSHEAD,CONTACT_PHONE," +    
  82.             "ORDER_FREQUENCY,CONTACT_ADDRESS,USER_ID,CUSTOMER_NUM,CUSTOMER_CODING," +    
  83.             "INVESTIGATION_TIME,SMS_REC_FLAG,WAP_FLAG,PRICE_GATHERING_FLAG,SOCIETY_STOCK_FLAG," +    
  84.             "REGION_TYPE)" +    
  85.             "VALUES(CUSTOMER.NEXTVAL," +    
  86.             "?,?,?,?,?," +    
  87.             "?,?,?,?,?," +    
  88.             "TO_DATE(?,'YYYY-MM-DD'),?,0,0,0," +    
  89.             "?)" ;    
  90.         
  91.     //插入需要的数据库对象    
  92.     Connection conn = null;    
  93.     PreparedStatement pstmt = null;    
  94.     
  95.     try  {              
  96.         conn = new DBSource().getConnection();    
  97.     
  98.         //设置事务属性    
  99.         conn.setAutoCommit(false);    
  100.             
  101.         pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);                
  102.     
  103.         for(CustomerBean cbean : insertList){    
  104.             pstmt.setString(1, cbean.getLicense_key());    
  105.             pstmt.setString(2, cbean.getCorporate_name());    
  106.             pstmt.setString(3, cbean.getIntegrated_classification());    
  107.             pstmt.setString(4, cbean.getBosshead());    
  108.             pstmt.setString(5, cbean.getContact_phone());    
  109.             pstmt.setString(6, cbean.getOrder_frequency());    
  110.             pstmt.setString(7, cbean.getContact_address());    
  111.             pstmt.setInt(8, cbean.getUser_id());    
  112.             pstmt.setString(9, "gyyc00000");//    
  113.             pstmt.setString(10, "95000000");//    
  114.             pstmt.setString(11, getToday());    
  115.             pstmt.setInt(12, cbean.getSms_rec_flag());    
  116.             pstmt.setInt(13, cbean.getRegion_type());    
  117.                 
  118.     
  119.             pstmt.addBatch();    
  120.     
  121.         }    
  122.         int[] tt = pstmt.executeBatch();    
  123.         System.out.println("insert : " + tt.length);    
  124.     
  125.         //提交,设置事务初始值    
  126.         conn.commit();    
  127.         conn.setAutoCommit(true);    
  128.     
  129.         //插入成功,返回    
  130.         return tt.length;    
  131.     
  132.     }catch(SQLException ex){    
  133.         try{    
  134.             //提交失败,执行回滚操作    
  135.             conn.rollback();    
  136.     
  137.         }catch (SQLException e) {    
  138.             e.printStackTrace();    
  139.             System.err.println("insertNewInfo回滚执行失败!!!");    
  140.         }    
  141.     
  142.         ex.printStackTrace();    
  143.         System.err.println("insertNewInfo执行失败");    
  144.     
  145.         //插入失败返回标志0    
  146.         return 0;    
  147.     
  148.     }finally {    
  149.         try{    
  150.             //关闭资源    
  151.             if(pstmt != null)pstmt.close();    
  152.             if(conn != null)conn.close();    
  153.                 
  154.         }catch (SQLException e) {    
  155.             e.printStackTrace();    
  156.             System.err.println("资源关闭失败!!!");    
  157.         }    
  158.     }    
  159. }    
         使用Java JDBC基本的API批量插入数据到数据库中
         
  1. import java.sql.Connection;  
  2. import java.sql.Statement;  
  3. //...  
  4. Connection connection = new getConnection();  
  5. Statement statemenet = connection.createStatement();  
  6. for (Employee employee: employees) {  
  7.     String query = "insert into employee (name, city) values('"  
  8.             + employee.getName() + "','" + employee.getCity + "')";  
  9.     statemenet.addBatch(query);  
  10. }  
  11. statemenet.executeBatch();  
  12. statemenet.close();  
  13. connection.close();  
  14. 请注意我们是如何从Employee对象中的数据动态创建查询并在批处理中添加,插入一气呵成。完美!是不是?
    等等......你必须思考什么关于SQL注入?这样动态创建的查询SQL注入是很容易的。并且每个插入查询每次都被编译。
    为什么不使用PreparedStatement而不是简单的声明。是的,这是个解决方案。下面是SQL注入安全批处理。
    SQL Injection Safe Batch - SQL注入安全批处理
    思考一下下面代码:
    [java]  view plain  copy
    1. import java.sql.Connection;  
    2. import java.sql.PreparedStatement;  
    3.  //...  
    4. String sql = "insert into employee (name, city, phone) values (?, ?, ?)";  
    5. Connection connection = new getConnection();  
    6. PreparedStatement ps = connection.prepareStatement(sql);  
    7.  for (Employee employee: employees) {  
    8.     ps.setString(1, employee.getName());  
    9.     ps.setString(2, employee.getCity());  
    10.     ps.setString(3, employee.getPhone());  
    11.     ps.addBatch();  
    12. }  
    13. ps.executeBatch();  
    14. ps.close();  
    15. connection.close();  
    看看上面的代码。漂亮。我们使用的java.sql.PreparedStatement和在批处理中添加INSERT查询。这是你必须实现批量插入逻辑的解决方案,而不是上述Statement那个。
    这一解决方案仍然存在一个问题。考虑这样一个场景,在您想要插入到数据库使用批处理上万条记录。嗯,可能产生的OutOfMemoryError:

    java.lang.OutOfMemoryError: Java heap space
    com.mysql.jdbc.ServerPreparedStatement$BatchedBindValues.<init>(ServerPreparedStatement.java:72)
    com.mysql.jdbc.ServerPreparedStatement.addBatch(ServerPreparedStatement.java:330)
    org.apache.commons.dbcp.DelegatingPreparedStatement.addBatch(DelegatingPreparedStatement.java:171)

    这是因为你试图在一个批次添加所有语句,并一次插入。最好的办法是将执行分批次。看看下面的解决方案
    Smart Insert: Batch within Batch - 智能插入:将整批分批
    这是一个简单的解决方案。考虑批量大小为1000,每1000个查询语句为一批插入提交。
    [java]  view plain  copy
    1. String sql = "insert into employee (name, city, phone) values (?, ?, ?)";  
    2. Connection connection = new getConnection();  
    3. PreparedStatement ps = connection.prepareStatement(sql);  
    4. final int batchSize = 1000;  
    5. int count = 0;  
    6. for (Employee employee: employees) {  
    7.     ps.setString(1, employee.getName());  
    8.     ps.setString(2, employee.getCity());  
    9.     ps.setString(3, employee.getPhone());  
    10.     ps.addBatch();  
    11.     if(++count % batchSize == 0) {  
    12.         ps.executeBatch();  
    13.     }  
    14. }  
    15. ps.executeBatch(); // insert remaining records  
    16. ps.close();  
    17. connection.close();  
        这才是理想的解决方案,它避免了SQL注入和内存不足的问题。看看我们如何递增计数器计数,一旦BATCHSIZE 达到 1000,我们调用executeBatch()提交。

         
Hibernate实战:MySQL到Oracle数据迁移的踩坑与性能优化 数据迁移是后端开发中绕不开的高难度任务,尤其在跨数据库平台时,需要处理字段映射、主键策略、时区差异以及大数据量下的内存与性能问题。ORM框架Hibernate通过对象模型与数据库方言的映射,能够在复杂业务系统中复用已有实体关系,显著降低手工SQL的翻译成本。当源库为MySQL、目标库为Oracle时,利用Hibernate的分页读取、批量写入、事务边界控制以及连接池调优,可以有效规避OOM、主键冲突和LazyInitializationException等典型故障。本文从实体映射、双数据源配置、键集分页、断 阅读详情

相关推荐

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2550

Java JDBC批处理插入数据操作

PreparedStatement 批量更新,插入数据到Oracle

学海无涯路的专栏 1662

现代控制理论(4)——李雅普诺夫稳定性理论

文章目录

wang7301的博客 5万+

【Java】关于采用PreparedStatement中executeBatch()方法实现批量更新或插入时数据相互覆盖的问题

批量更新或插入数据

weixin_42369773的博客 1305

LCD、LED、OLED、Mini LED、Micro LED、全阵列LED、QLED、QD-OLED、QNED、AMOLED是什么意思?

LCD(液晶显示器,Liquid Crystal Display)定义:LCD 是一种利用液晶材料控制光线通过的显示技术,需依靠背光源(如冷阴极荧光灯 CCFL 或 LED)照亮液晶层以形成图像。技术原理:液晶分子在电场作用下改变排列,控制背光通过的强度和颜色。液晶本身不发光,需外部光源。特点:结构包括背光层、液晶层、彩色滤光片和偏光片。响应时间较慢,黑色表现因背光漏光而偏灰。LED(发光二极管显示,Light Emitting Diode)定义。

中国最威武的城市!武功军威-武威,铁骨铮铮! 3428

双目立体匹配算法:SGBM

SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。

weixin_45303602的博客 9411

mysql preparedstatement 批量update_使用PreparedStatement实现批量插入数据的操作

1.批量执行SQL语句当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率JDBC的批量处理语句包括下面三个方法:- addBatch(String):添加需要批量处理的SQL语句或是参数;- executeBatch():执行批量处理语句;- clearBatch():清空缓存的数据通常我们会遇到两种批...

weixin_36277054的博客 2155

PyMuPDF为PDF文件添加注释

我将介绍如何使用PyMuPDF库来为PDF文件添加注释,包括文本注释、高亮注释、下划线注释等15种注释的使用方法。

布啦啦 2244

PreparedStatement批量插入/更新数据优化——setObject与set具体类型的效率差异

使用做数据更新时,尽可能不要使用setObject方法,数据库中字段是什么类型,就set什么。还是不要太省事儿了。-_-||

wx的博客 1836

CANoe中如何仿真报文的CRC和Counter,告诉你三种方法皆可实现

CANoe中如何仿真报文的CRC和Counter

蚂蚁小兵 5284

在blender中安装vtk插件

Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。

如果想成为中心,那么就到中心去吧。 294

JDBC批处理插入更新MySQL Oracle

Today we will look into JDBC Batch insert and update examples in MySQL and Oracle databases. Sometimes we need to run bulk queries of a similar kind for a database. For example, loading data from CSV ...

从零开始的教程世界 868

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Seata 0.8.0 正式发布

java4all原创,欢迎关注 摘要:Seata 0.8.0 正式发布。 Seata 0.8.0 正式发布。 Seata是阿里巴巴开源的分布式事务中间件,以高效并且对业务0 侵入的方式,解决微服务场景下面临的分布式事务问题。 0.8.0版本主要feature: 1.支持 oracle 数据库的 AT 模式; 2.支持 or...

IT云清 1728

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据库操作

另一种分页策略介绍:基于缓存的分页技术(也被称作假分页),一次性把数据全部取出来放在缓存中,根据用户要看的页数(page)和每页记录数(pageSize),计算把哪些数据输出显示,将可滚动结果集的指针移动到指定位置。PreparedStatement类的方法, 可以将多条预编译的sql语句添加到PreparedStatement对象的SQL语句列表中。如果仅仅是单表操作,不需要返回刚刚插入的主键值,但如果有关联关系的表操作,需要获得刚刚插入的主键值。//预先定义好的SQL语句。

星月IWJ 588

Jdbc批处理一点异同

同样的代码:public class TestBatch {   public static void main(String[] args) throws SQLException, ClassNotFoundException { //Class.forName("oracle.jdbc.driver.OracleDriver"); //Connection conn = DriverMa...

weixin_34277853的博客 78

数据库连接封装

public class DBConnection { private String dbusername; private String dbpasswd; private DBType dbtype; private String JDBCString; public DBConnection(DBType type, String...

weixin_30699741的博客 178

Hibernate、JDBC之批量插入

public void batchAddSendCus(finalList shpSendVouchs)throws Exception {       super.getHibernateTemplate().execute(new HibernateCallback(){           public Object doInHibernate(Session s

yuxiaoping225170的专栏 871

oracle数据库中插数据,ORACLE数据库中插入大字段数据的解决方法

2009年7月2日 天气晴 周四解决向ORACLE数据库表中大字段(BLOB类型)插入字符数据的方法:(完整代码下载在附件 )// 对应文章导入public static void MysqlarchiveToOracleAracle() {// log.debug("文章导入中...");String sql = "select * from archive where 1=1";try {my...

weixin_30868873的博客 821

Spring Boot + Oracle 数据库批量操作性能大比拼:哪种写法效率最高?

摘要:Spring Boot + Oracle 批量操作性能测试报告 本文通过实测对比了Spring Boot项目中Oracle数据库的4种批量操作方式: 无事务循环单条插入(性能最差,1000条需3-4秒) 有事务循环单条插入(性能提升3-4倍) foreach批量拼接SQL(推荐<2000条数据) JDBC原生batch(大数据量最优) 关键结论: 小数据量(<2000条):推荐foreach批量插入(最快45ms/1000条) 大数据量(>1万条):使用JDBC原生batch模式(10万条仅886ms

张小凡 1013

JDBC: 批量处理提高SQL处理速度

引用:忘了 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面两个方法: addBatch(String):添加需要批量处理的SQL语句或是参数; executeBatch();执行批量处理语句; 通常我们会遇到两种批量执行SQL语句的情况: 多条...

a453202743的博客 210

数据迁移,Oracle,Mysql,Sql server,数据库数据传输

简单高效的数据库迁移代码

mr.lv 427

java连接Oracle数据库

连接数据库有多种方式,对于初学者连接数据库,这里介绍两种方法及两种连接配置方式 方法一  运用statement  1、创建一个JDBC-statement项目 2、导包 --把连接数据库的驱动包导入 oracle驱动包可以在Oracle安装位置找到,也可以自己去下载 路径就是 app\计算机用户名\product\11.2.0\dbhome_1\jdbc\lib mysql驱动包...

he__xu的博客 8万+

如何利用LoadRunner最高效的批量制造Oracle数据

前不久写过一篇高效大批量制造MySQL数据的文章:《如何利用LoadRunner最高效的批量制造MySQL数据》,后来有人问我,怎么高效大批量制造Oracle数据。其实是一样的,也是用JDBC的批量插入(addBatch)方法,以下就提供一下我写的脚本,以供参考:/* * LoadRunner Java script. (Build: _build_number_) * * Script ...

smooth的博客 5655

jdbc操作数据库插入、更新、删除、查找

mysql数据库: public boolean insertFrom(Person per){ boolean flag = false; Connection conn = null; conn = JdbcCon.jdbcConMysql(); PreparedStatement ps = null; ...

menghuanruxue的博客 327
上一篇: base64 图片处理
下一篇: arcgis在地图上描点
落落的天堂
博客等级 码龄15年 470粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值