拼字符串,插入还是存储过程?

解决方案 »

  1.   

     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);
        }
      

  2.   

    如果是外部提交数据传入(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插入可以提高一定的效率。
      

  3.   

    用JDBC的批量插入吧..或者也可以写存储过程..个人偏向于存储过程
      

  4.   


    什么意思数据从何而来,客户端?服务器端自己生成?文件?
    无论如何用batch没错,不可能一条条数据插入
      

  5.   

    写的很好,我想问个问题:如果用struts+spring+ibatis的框架,用循环掉,是一次插入还是执行一次插入一次呢?但要是失败了我知道是全部回滚的。
      

  6.   

    嘿嘿。使用ETL 工具啊。。
      

  7.   


    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,呵呵。
      

  8.   

    如果是我,我会用,Execl