插入1000条数据要怎么插入? 拼字符串,插入还是存储过程? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public void batchInsertRows(String sql,final List<Object[]> dataSet) throws Exception{ BatchPreparedStatementSetter setter=new BatchPreparedStatementSetter(){ public int getBatchSize(){ return dataSet.size(); } public void setValues(PreparedStatement ps,int i){ Object[] obj = dataSet.get(i); int nextId = getNextId(); try{ ps.setLong(1,nextId); ps.setLong(2,Integer.parseInt(obj[0].toString())); ps.setLong(3,Integer.parseInt(obj[1].toString())); ps.setString(4,(String)obj[2]);} catch(Exception e){ e.printStackTrace(); } } }; jdbcTemplate.batchUpdate(sql,setter); } 如果是外部提交数据传入(1000条一起插入还是蛮大的),请参考JAVA中的批处理SQL,内部有addBatch()方法,每条数据入参写完后addBatch一次即可,最后使用executeBatch()执行,commit提交,假如我们通过一个getOracleConnect()可以获得一个连接,我们代码大致可以这样写:Connection conn = getOracleConnect();try { conn.setAutoCommit(false);//非自动提交模式 PreparedStatement pstmt = conn.prepareStatement("INSERT INTO A VALUES(?,?)"); for(...) {//这里循环添加批处理,但是用一条SQL pstmt.setString(1,参数1); pstmt.setString(2,参数2); pstmt.addBatch();//这步骤很关键 } pstmt.executeBatch(); conn.commit();//提交事务 conn.setAutoCommit(true);//恢复自动提交模式}catch (SQLException e) { 回滚事务处理}finally { 关闭相关的结果集和链接操作。}第二种情况就是:如果你这一千条数据时在一个表内部需要转存就非常简单了。一个INSERT INTO <目标表> SELECT .... FROM 来源视图;若数据量较大,可以加标记,配合NOLOGGING插入可以提高一定的效率。 用JDBC的批量插入吧..或者也可以写存储过程..个人偏向于存储过程 什么意思数据从何而来,客户端?服务器端自己生成?文件?无论如何用batch没错,不可能一条条数据插入 写的很好,我想问个问题:如果用struts+spring+ibatis的框架,用循环掉,是一次插入还是执行一次插入一次呢?但要是失败了我知道是全部回滚的。 嘿嘿。使用ETL 工具啊。。 struts+sprint+ibatis在插入数据库的时候,一次插入还是多次插入以及是否为事务要看你调用的方式,如:其实要借鉴上述编写的办法可以直接使用一下方式:getSqlMapClientTemplate().getDataSource().getConnection();//ibatis中的对象jdbcTemplate.getDataSource().getConnection();//Spring的DAO对象这个可以直接用上述方式,上述为一次提交,封装于一个事务中。另外若直接使用ibatis和jdbcTemplate则默认情况下是一次提交的,我们先说下如果你要用ibatis完成的情况吧:使用ibatis来完成“事务+批处理”一般我们这样写:SqlMapClient sqlMap = getSqlMapClient();sqlMap.startTransaction();//开始事务sqlMap.startBatch();//开始批处理try { sqlMap做相关的操作 sqlMap..executeBatch();//提交SQL,如果出错在这里报。 sqlMap.commitTransaction();//提交事务}catch(...){...}finally { sqlMap.endTransaction();//结束事务}可以测试一下是否能达到事物的效果。如果用Spring的jdbcTemplate,而Spring中若要封装为事务需要,数据源的配置文件中对其进行切入定义事务管理器或者叫事务代理(细节的定义这里由于篇幅所限,就不多说了),一般定义到业务层方法体,也就是在配置文件中定义后,你在DAO层的操作,只要使用的是这个数据源的信息,那么自动封装到一个事事务中,而jdbcTemplate的批处理实现方法是通过其:jdbcTemplate.batchUpdate(sql, pss)方法,前者为批处理的SQL语句,后者为参数,参数类型:BatchPreparedStatementSetter,需要实现该类的两个抽象方法:getBatchSize()和setValues(PreparedStatement ps,int i)我想第二个setValues的第一个参数应该就不陌生了,这个就是通过Connection预编译好的对象,i可以作为你的辅助参数,相当于是第几条数据用以你自己遍历你的数组类的对象,其实发现没有,它就是JDBC,呵呵。 如果是我,我会用,Execl java 一简单问题。。关于日期的。。 求一正则 ,如果其他能用也行 JSP 生成随机验证码图片在unix系统weblogic应用环境下JSP 生成随机验证码图片是个红叉 [转】Flash平台开发者"技能树" 急~~~ hibernate多表复合查询问题 问语法的值 请问jsp有没有好的编辑工具呢?给分,在线 一个很急的问题 请问从哪里可以下载到免费的jsp的编译软件,谢谢帮忙!! springboot服务器返回的json带转义字符斜杠\ 问题 请大家推荐一个java架构的开源论坛,谢谢。 tomcat启动问题,比较深点,请帮帮忙,谢谢
public int getBatchSize(){
return dataSet.size();
}
public void setValues(PreparedStatement ps,int i){
Object[] obj = dataSet.get(i);
int nextId = getNextId();
try{
ps.setLong(1,nextId);
ps.setLong(2,Integer.parseInt(obj[0].toString()));
ps.setLong(3,Integer.parseInt(obj[1].toString()));
ps.setString(4,(String)obj[2]);}
catch(Exception e){
e.printStackTrace();
}
}
};
jdbcTemplate.batchUpdate(sql,setter);
}
try {
conn.setAutoCommit(false);//非自动提交模式
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO A VALUES(?,?)");
for(...) {//这里循环添加批处理,但是用一条SQL
pstmt.setString(1,参数1);
pstmt.setString(2,参数2);
pstmt.addBatch();//这步骤很关键
}
pstmt.executeBatch();
conn.commit();//提交事务
conn.setAutoCommit(true);//恢复自动提交模式
}catch (SQLException e) {
回滚事务处理
}finally {
关闭相关的结果集和链接操作。
}
第二种情况就是:如果你这一千条数据时在一个表内部需要转存就非常简单了。
一个INSERT INTO <目标表> SELECT .... FROM 来源视图;
若数据量较大,可以加标记,配合NOLOGGING插入可以提高一定的效率。
什么意思数据从何而来,客户端?服务器端自己生成?文件?
无论如何用batch没错,不可能一条条数据插入
struts+sprint+ibatis在插入数据库的时候,一次插入还是多次插入以及是否为事务要看你调用的方式,如:
其实要借鉴上述编写的办法可以直接使用一下方式:
getSqlMapClientTemplate().getDataSource().getConnection();//ibatis中的对象
jdbcTemplate.getDataSource().getConnection();//Spring的DAO对象
这个可以直接用上述方式,上述为一次提交,封装于一个事务中。另外若直接使用ibatis和jdbcTemplate则默认情况下是一次提交的,我们先说下如果你要用ibatis完成的情况吧:
使用ibatis来完成“事务+批处理”一般我们这样写:
SqlMapClient sqlMap = getSqlMapClient();
sqlMap.startTransaction();//开始事务
sqlMap.startBatch();//开始批处理
try {
sqlMap做相关的操作
sqlMap..executeBatch();//提交SQL,如果出错在这里报。
sqlMap.commitTransaction();//提交事务
}catch(...){
...
}finally {
sqlMap.endTransaction();//结束事务
}可以测试一下是否能达到事物的效果。如果用Spring的jdbcTemplate,而Spring中若要封装为事务需要,数据源的配置文件中对其进行切入定义事务管理器或者叫事务代理(细节的定义这里由于篇幅所限,就不多说了),一般定义到业务层方法体,也就是在配置文件中定义后,你在DAO层的操作,只要使用的是这个数据源的信息,那么自动封装到一个事事务中,而jdbcTemplate的批处理实现方法是通过其:jdbcTemplate.batchUpdate(sql, pss)方法,前者为批处理的SQL语句,后者为参数,参数类型:BatchPreparedStatementSetter,需要实现该类的两个抽象方法:
getBatchSize()和setValues(PreparedStatement ps,int i)
我想第二个setValues的第一个参数应该就不陌生了,这个就是通过Connection预编译好的对象,i可以作为你的辅助参数,相当于是第几条数据用以你自己遍历你的数组类的对象,其实发现没有,它就是JDBC,呵呵。