想同时往数据库同一个表插入多条记录,有啥好方法,求大神赐教! 现在我想同时往数据库同一个表插入多条记录,除了循环多次用insert语句插入,有没有更好(更优化)的方法呢?数据库插入 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 拼接sql语句,进行批量插入,我目前知道mysql和oracle的,sqlserver的就不知道了。网上应该都有用法的,百度一下。比起反复插入的优势是,不用频繁的打开关闭数据库。不过如果你要插入的数据量不大的话,其实更改的必要性不大。 你用循环意思是一个SQL要去连接一次数据库,如果十个就循环十次,连十次数据库,这样是很废时间。你可以用批量插入,先把十条SQL用循环写入批量操作中,然后用JDBC批量执行就一次搞定。或则用上面2楼的方法写储存过程。 是用batch?jdbc记得支持batch方法 package day2;import java.sql.*;import day1.ConnectionUtils;/** * 测试JDBC中的批处理 * @author 张三 * @version 1.0 */public class BatchDemo { /** * @param args */ public static void main(String[] args) { batch(100); } /** * 批量插入记录到temp_ning表中 * @param count 要插入的记录总数 */ public static void batch(int count){ String sql = "insert into temp_ning values(?)"; Connection conn = null; PreparedStatement stmt = null; try{ //coding here conn = ConnectionUtils.getConnection(); conn.setAutoCommit(false);//设置为非自动提交 stmt = conn.prepareStatement(sql); for(int i = 107; i <= 156; i++){ stmt.setInt(1, i); stmt.addBatch();//加入到批处理集合 if (i % 10 == 0){ stmt.executeBatch(); stmt.clearBatch(); } } stmt.executeBatch();//执行批处理集合中的语句 conn.commit();//提交 }catch(Exception e){ e.printStackTrace(); }finally{ ConnectionUtils.close(stmt); ConnectionUtils.close(conn); } } } 你用循环意思是一个SQL要去连接一次数据库,如果十个就循环十次,连十次数据库,这样是很废时间。你可以用批量插入,先把十条SQL用循环写入批量操作中,然后用JDBC批量执行就一次搞定。或则用上面2楼的方法写储存过程。恩恩...其实数据量不算很大,只是在做东西刚好碰到这情况,想多了解有没有其他的方法,批量跟存储过程没咋接触过,应该不会很麻烦吧? 好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢? 现在我想同时往数据库同一个表插入多条记录,除了循环多次用insert语句插入。如果数据量不大的话,其实没有优化的必要,循环中去访问DB会有一个问题,那就是循环的开启数据库,这样很耗用数据库的资源,如果是高并发的话,数据库很容易宕掉。package com.test;import java.sql.Connection;import java.sql.PreparedStatement;public class Test { public static void insertBatch() { int count[]; int count1[]; Boolean isinsert = false; Connection con = null; PreparedStatement pst = null; PreparedStatement pst1 = null; try { con.setAutoCommit(false); // 需要用到事务,不能让他自动提交,需要手动提交 pst = con.prepareStatement("table"); // INSERT_SQL表示对一张表的插入记录 pst.setString(1, "name1"); pst.setInt(2, 26); pst.setString(3, "job1"); pst.addBatch(); pst.setString(1, "name2"); pst.setInt(2, 12); pst.setString(3, "job2"); pst.addBatch(); count = pst.executeBatch(); } catch (Exception e) { e.printStackTrace(); } }}可以看下pst.addBatch();这行代码的用法。应该是你想要的。另外如果考虑性能的话,最快就是将这种操作交给存储过程来实现。 好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢?这个意思是循环100条insert语句,但每过10条,就执行下executeBatch,批量执行sql插入,防止万一100条中有一条失败。则可能100条全部无法插入。10条一次执行,断点保护机制 你需求插入的数据从哪里来?如果需要插入的数据多个字段相同,而不同的字段是从数据库获取的,就可以直接一条语句完成插入String sql = "insert into xx(userid,conid,state,custname) select userid,'"+String.valueOf(meetingId)+"',3,custname from yy where id in(); 好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢?这个意思是循环100条insert语句,但每过10条,就执行下executeBatch,批量执行sql插入,防止万一100条中有一条失败。则可能100条全部无法插入。10条一次执行,断点保护机制恩恩,貌似懂了 写一个关于分页技术的问题,求思路求指点 一般jsp开发代码主要发在哪里?是放在页面里还是直接用.class? tomcat5配置jmx 这个阶段该不该学struct? jsp页面之间值传递问题 Tomcat报了这样一个错,请前辈们指点? 抢分,关于SERVLET的配置问题 web多页面操作 Jsp 页面缓冲的问题 TOMCAT 部署遇到问题,求帮助 struts2 中页面跳转与提交得不到参数的问题 顶贴也给分,repo下载方法
比起反复插入的优势是,不用频繁的打开关闭数据库。
不过如果你要插入的数据量不大的话,其实更改的必要性不大。
jdbc记得支持batch方法
import java.sql.*;
import day1.ConnectionUtils;
/**
* 测试JDBC中的批处理
* @author 张三
* @version 1.0
*/
public class BatchDemo { /**
* @param args
*/
public static void main(String[] args) {
batch(100);
}
/**
* 批量插入记录到temp_ning表中
* @param count 要插入的记录总数
*/
public static void batch(int count){
String sql = "insert into temp_ning values(?)";
Connection conn = null;
PreparedStatement stmt = null;
try{
//coding here
conn = ConnectionUtils.getConnection();
conn.setAutoCommit(false);//设置为非自动提交
stmt = conn.prepareStatement(sql);
for(int i = 107; i <= 156; i++){
stmt.setInt(1, i);
stmt.addBatch();//加入到批处理集合
if (i % 10 == 0){
stmt.executeBatch();
stmt.clearBatch();
}
}
stmt.executeBatch();//执行批处理集合中的语句
conn.commit();//提交
}catch(Exception e){
e.printStackTrace();
}finally{
ConnectionUtils.close(stmt);
ConnectionUtils.close(conn);
}
}
}
好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢?
如果数据量不大的话,其实没有优化的必要,
循环中去访问DB会有一个问题,那就是循环的开启数据库,这样很耗用数据库的资源,如果是高并发的话,数据库很容易宕掉。
package com.test;import java.sql.Connection;
import java.sql.PreparedStatement;public class Test {
public static void insertBatch() {
int count[];
int count1[];
Boolean isinsert = false;
Connection con = null;
PreparedStatement pst = null;
PreparedStatement pst1 = null;
try {
con.setAutoCommit(false); // 需要用到事务,不能让他自动提交,需要手动提交
pst = con.prepareStatement("table"); // INSERT_SQL表示对一张表的插入记录 pst.setString(1, "name1");
pst.setInt(2, 26);
pst.setString(3, "job1");
pst.addBatch(); pst.setString(1, "name2");
pst.setInt(2, 12);
pst.setString(3, "job2");
pst.addBatch(); count = pst.executeBatch();
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以看下pst.addBatch();这行代码的用法。应该是你想要的。
另外如果考虑性能的话,最快就是将这种操作交给存储过程来实现。
好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢?
这个意思是循环100条insert语句,但每过10条,就执行下executeBatch,批量执行sql插入,防止万一100条中有一条失败。则可能100条全部无法插入。10条一次执行,断点保护机制
好人,代码都贴出来了,但能解释下这个for循环么,为什么能被10整除就执行呢?
这个意思是循环100条insert语句,但每过10条,就执行下executeBatch,批量执行sql插入,防止万一100条中有一条失败。则可能100条全部无法插入。10条一次执行,断点保护机制恩恩,貌似懂了