jdbc批量出入-jdbc批量插入,数据只有一条

问题描述

jdbc批量插入,数据只有一条
我统一10条插入一次,可是最后数据库只有第十条数据,前九条都没有,插入几次都是,怎么办
List backList = new ArrayList();
Connection con = getConnection();
PreparedStatement stat = null;
String str= null;
int j = 0;
for(int i=0;i<list.size();i++){
str = list.get(i);
String[] arr = str.split("");
j++;
if(arr.length ==10){
try {

                String name = arr[0];                String pinyin = arr[1];                String age = arr[2];                String sex = arr[3];                String phone = arr[4];                String mobilephone = arr[5];                String address = arr[6];                String birthday = arr[7];                String birthPlace = arr[8];                String company = arr[9];                //根据参数动态拼一个insert语句(""+deptno+""'""+dname+""''""+loc+""')""                String sql = ""insert into user_info ""+""values ('""+name+""''""+pinyin+""''""+age+""''""+                sex+""''""+phone+""''""+mobilephone+""''""+address+""''""+birthday+""''""+birthPlace+""''""+company+""')"";                stat = con.prepareStatement(sql);                System.out.println(sql);                stat.addBatch();                System.out.println(""sql语句加入批处理中"");            } catch (SQLException e2) {                // TODO Auto-generated catch block            }        }        if(j == list.size()){            int s [] = stat.executeBatch();            for(int a:s){                System.out.println(a);            }        }    }        try {            stat.close();            con.close();        } catch (SQLException e1) {            e1.printStackTrace();        }

解决方案

PreparedStatement定义要在for外面定义具有占位符的statement,for中只负责设参数值。
示例代码:

 public int insertTCollectionBatched(List<TCollection> list) {        Connection conn = ConnectionPool.getConnection();        PreparedStatement stat = null;        ResultSet rs = null;        String sql = ""INSERT INTO table"" +         + "" (ParentID ScanTime ExtParam1 ExtParam2)"" + VALUES (????)"";        try {            conn.setAutoCommit(false);            stat = conn.prepareStatement(sql);            int[] counts = {};            for(TCollection collection:list){                setPropertyValue(collection stat);                stat.addBatch();            }            counts = stat.executeBatch();            conn.commit();            return counts.length;        }catch(Exception e){            LogUtil.error(e);        }finally{            ConnectionPool.attemptClose(rs stat conn);        }        return 0 ;    }

SQL占位参数设值代码:

 private void setPropertyValue(TCollection collection PreparedStatement stat)            throws SQLException {    //根据属性值是否传入,设置SQL INT类型参数,未传递的设置默认值,避免SQL异常    if(collection.getParentId()!=null){        stat.setInt(1 collection.getParentId());    }else{        stat.setInt(1 0);    }    if(collection.getScanTime()!=null){        stat.setString(2 collection.getScanTime());    }else{        stat.setString(2 DateTimeUtil.nowAsString());    }    //必须非空    stat.setString(3 collection.getParam1());    stat.setString(4 collection.getParam2());}

解决方案二:
那你跟踪一下代码啊,看执行了几次sql arr.length ==10这个条件满足没

解决方案三:
加点日志分析等,运行打印一下就能跟踪出具体运行时的情况了。

解决方案四:
静态的SQL批量执行

 String sql = ""insert into user_info ""+""values ('""+name+""''""+pinyin+""''""+age+""''""+                sex+""''""+phone+""''""+mobilephone+""''""+address+""''""+birthday+""''""+birthPlace+""''""+company+""')"";                //stat = con.prepareStatement(sql);//这种似乎得有占位符                System.out.println(sql);                stat.addBatch(sql);

解决方案五:
list.size()这里的list哪里来的啊?

时间: 2024-11-30 03:15:59

jdbc批量出入-jdbc批量插入,数据只有一条的相关文章

asp.net 批量向数据库高效插入数据的方法

asp教程.net 批量向数据库教程高效插入数据的方法 有三种方法可以批量向数据库插入数据,利用dataset,利用事务,使用数据库中的Table类型变量实现数据插入 这种方法的前提是数据库中必须支持Table类型的变量 一.利用事务(transaction) '定义执行批量插入数据的函数,参数为insert SQL语句的数组 sub ExeTransaction (Byval Sqlstrlist as string()) dim Conn As String = "Provider=Micr

Android批量插入数据性能优化

做数据同步时遇到一个问题,在下载数据时需要批量的向sqlite插入数据,虽然数据不算多,但是实际测试中每插入一条数据需要将近50ms的时间,这意味着1000条数据就需要花费50s左右的时间,对于用户来说,体验太差了,必须要优化. 在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.明白了这个,解决方案就有了,在批量插入数据的时候,只开启一个事务,这样只会进行一次磁盘操作,代码如下: db.beginTransaction(); try { for (...) {

使用JDBC在MySQL数据库中如何快速批量插入数据_Mysql

使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: void addBatch() throws SQLException Adds a set of parameters to this PreparedStatement object's batch of commands. int[] executeBatch() throws SQLException Submits

java实现jdbc批量插入数据_java

首先介绍三种JDBC批量插入编程方法,进行比较,具体内容如下 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一:使用PreparedStatement加批量的方法 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(o_url, userName, pass

new-参数为两个数组的批量插入数据 该怎么写

问题描述 参数为两个数组的批量插入数据 该怎么写 //js var productcode = shuzu.join(","); var covertypecode = typeshuzu.join(","); /*console.log(productcode); console.log(covertypecode); */ $.ajax({ type:"post", url:"product/addproType.do",

Java实现mybatis批量插入数据到Oracle_java

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址  1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &

Hibernate批量插入数据到数据库

之前笔记中使用jdbc和iBATIS方式实现批量插入数据到数据库.在Hibernate框架中使用相应接口,同样也可以实现数据的批量操作,Hibernate把最近插入的数据都以session-level cache在内存做缓存,首先在配置文件中设置一个合理的JDBC批处理大小hibernate.jdbc.batch_size参数,来指定每次提交SQL的数量.配置hibernate.jdbc.batch_size参数的原因就是尽量少读数据库,hibernate.jdbc.batch_size参数值越

codeigniter框架批量插入数据

 本文介绍codeigniter框架批量插入数据的实例,优化了其中的插入算法,大家参考使用吧   代码如下: $sub_form = array();   $loop = 0;   $ins_loop = 0;   $sum = count($form_datas);   $this->logger->info('insert data total:'.$sum);   //使用事物批量导入有助于提高插入效率   $callStartTime = microtime(true);   $thi

mybatis sql-参数list对象结果如何使用mybatis批量插入数据

问题描述 参数list对象结果如何使用mybatis批量插入数据 使用mybatis oracle,当传来的参数是list对象结果集,如何批量插入数据 解决方案 解决方案二: <!-- WARNING - @mbggenerated This element is automatically generated by MyBatis Generator, do not modify. --> <!-- 表的序列查询 --> select TABLE_SEQ.NEXTVAL from