Using QueryRunner to insert ArrayList<Object[]>

使用QueryRunner 结合c3p0进行数据库操作时候,

需求:list<bean>进行插入数据库中,但是QueryRunner 仅仅支持batch():批处理;

Object[][] params = null;
qr.batch("insert into MyTable (param1,param2,param3) values (?,?,?)", params);

需要把后面的参数设置成二维数组,但是如何设置成这种二维数组呢,下面提供类ModelToSqlConverter.java

package com.htzq.dbutil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class ModelToSqlConverter {

    private Object model;

    private List<Object> params, keyParams, modelList;

    private String fieldNameString, questionMarkString, sqlString, conditionString, updateString;

    private boolean update;

    private String[] keys;

    private Object[][] multiParams;

    /**
     * Initializes a newly created <code>ModelToSqlConverter</code>
     *
     * @param model The model representing the ASW file.
     * @param keys The keys for locating the right row in ASW file.
     */
    @SuppressWarnings("unchecked")
    public ModelToSqlConverter(Object model, String... keys){
        this.model = model;
        this.keys = keys;
        params = new ArrayList<Object>();
        keyParams = new ArrayList<Object>();
        questionMarkString = "VALUES (";
        fieldNameString = "(";
        updateString = "";
        conditionString = "WHERE ";
        update = keys != null && keys.length > 0;
        if(model instanceof List<?>){
            modelList = (List<Object>) model;
            convertModelListToSqlAndParams();
        }else{
            convertModelToSqlAndParams();
        }

    }

    /**
     * Main method for Converting Model into SQL String and to value parameters.
     */
    private void convertModelToSqlAndParams(){

        for(Field field : model.getClass().getDeclaredFields()){
            try{
                field.setAccessible(true);
                Object value = field.get(model);
                String fieldName = field.getName();
                if(value != null && !fieldName.equalsIgnoreCase("serialVersionUID")){
                    if(!update){
                        addQuestionMark();
                        addNameToSql(fieldName);
                        addValueToObjectArray(value);
                    }else{
                        if(isKey(fieldName)){
                            conditionString += fieldName + " = ?,";
                            keyParams.add(value);

                        }else{
                            addParamAndNameToSql(fieldName);
                            addValueToObjectArray(value);
                        }
                    }
                }

            }catch(IllegalArgumentException e){
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch(IllegalAccessException e){
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        sqlString = update ? getUpdateSql() : getInsertSql();
        for(Object key : keyParams){
            addValueToObjectArray(key);
        }
    }

    /**
     * Main method for Converting Model into SQL String and to value parameters.
     */
    private void convertModelListToSqlAndParams(){
        int row = 0;
        boolean isKey = false;
        boolean firstModel = true;
        Field[] fields = modelList.get(0).getClass().getDeclaredFields();
        multiParams = new Object[modelList.size()][fields.length];
        for(Object model : modelList){
            int col = 0;
            keyParams = new ArrayList<Object>();
            for(Field field : fields){
                try{
                    field.setAccessible(true);
                    Object value = field.get(model);
                    String fieldName = field.getName();
                    if(value != null && !fieldName.equalsIgnoreCase("serialVersionUID")){
                        if(!update){
                            if(firstModel){
                                addQuestionMark();
                                addNameToSql(fieldName);
                            }
                            addValueToMultiParams(value, row, col);
                        }else{
                            isKey = isKey(fieldName);
                            if(isKey){
                                if(firstModel){
                                    conditionString += fieldName + " = ?,";
                                }
                                keyParams.add(value);
                            }else{
                                if(firstModel)
                                    addParamAndNameToSql(fieldName);
                                addValueToMultiParams(value, row, col);
                            }
                        }
                    }

                }catch(IllegalArgumentException e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }catch(IllegalAccessException e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                if(!isKey)
                    col++;
            }
            firstModel = false;
            for(Object key : keyParams){
                addValueToMultiParams(key, row, col);
                col++;
            }
            row++;
        }
        sqlString = update ? getUpdateSql() : getInsertSql();

    }

    /**
     * @param columnName
     */
    private void addNameToSql(String columnName){
        fieldNameString += columnName + ",";
    }

    /**
     * @param value
     */
    private void addValueToObjectArray(Object value){
        params.add(value);
    }

    /**
     * @param value
     * @param row
     * @param col
     */
    private void addValueToMultiParams(Object value, int row, int col){
        multiParams[row][col] = value;
    }

    public Object[][] getMultiValueParams(){
        return removeNullsFromMultiArray(multiParams);
    }

    /**
     * Adds question mark to string
     */
    private void addQuestionMark(){
        questionMarkString += "?,";
    }

    /**
     * @param columnName
     */
    private void addParamAndNameToSql(String columnName){
        updateString += columnName + "= ?,";
    }

    /**
     * @return the update SQL string.
     */
    private String getUpdateSql(){
        return updateString.substring(0, updateString.lastIndexOf(",")) + " " + conditionString.substring(0, conditionString.lastIndexOf(","));
    }

    /**
     * @return the insert SQL string.
     */
    private String getInsertSql(){
        return fieldNameString.substring(0, fieldNameString.lastIndexOf(",")) + ") " + questionMarkString.substring(0, questionMarkString.lastIndexOf(","))
                + ")";
    }

    private Object[][] removeNullsFromMultiArray(Object[][] multiValuedArray){
        for(int i = 0; i < multiValuedArray.length; i++){
            ArrayList<Object> list = new ArrayList<Object>(); // creates a list to store the elements !=
                                                                // null
            for(int j = 0; j < multiValuedArray[i].length; j++){
                if(multiValuedArray[i][j] != null){
                    list.add(multiValuedArray[i][j]); // elements != null will be added to the list.
                }
            }
            multiValuedArray[i] = list.toArray(new Object[list.size()]); // all elements from list to an
                                                                            // array.
        }
        return multiValuedArray;
    }

    /**
     * Checks if the field name is a key.
     *
     * @param fieldName
     * @return true if the field is a key.
     */
    private boolean isKey(String fieldName){
        boolean isKey = false;
        for(String key : keys){
            if(fieldName.equalsIgnoreCase(key)){
                isKey = true;
            }
        }
        return isKey;
    }

    /**
     * @return the params
     */
    public Object[] getParams(){
        return params.toArray();
    }

    /**
     * @return the sqlString
     */
    public String getSqlString(){
        return sqlString;
    }

    /**
     * @param params the params to set
     */
    public void setParams(List<Object> params){
        this.params = params;
    }

    /**
     * @param sqlString the sqlString to set
     */
    public void setSqlString(String sqlString){
        this.sqlString = sqlString;
    }
}

C3P0MySqlConnection.java

 1 package com.htzq.dbutil;
 2
 3 import java.beans.PropertyVetoException;
 4 import java.sql.SQLException;
 5
 6 import com.mchange.v2.c3p0.ComboPooledDataSource;
 7
 8 public class C3P0MySqlConnection {
 9
10     public ComboPooledDataSource C3P0SqlServerConnection(String []a) throws SQLException {
11          ComboPooledDataSource ds = new ComboPooledDataSource() ;
12         try {
13             ds = new ComboPooledDataSource();//创建连接池实例
14             ds.setDriverClass("com.mysql.jdbc.Driver");//设置连接池连接数据库所需的驱动
15              ds.setJdbcUrl(a[0]);//设置连接数据库的URL
16              ds.setUser(a[1]);//设置连接数据库的用户名
17              ds.setPassword(a[2]);//设置连接数据库的密码
18              ds.setMaxPoolSize(40);//设置连接池的最大连接数
19              ds.setMinPoolSize(2);//设置连接池的最小连接数
20              ds.setInitialPoolSize(5);//设置连接池的初始连接数
21              ds.setMaxStatements(100);//设置连接池的缓存Statement的最大数
22         } catch (PropertyVetoException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         }
26         return ds;
27
28     }
29 }

逻辑处理

1         String sql = sqlBuf.substring(0, sqlBuf.length()-10);
2             List<ShWtqr> list = iSysConfigDao.selectSysCollect(a ,sql);
3
4             a = readPropertiesUtil.readMySqlPro();
5             ModelToSqlConverter modelToSqlConverter = new ModelToSqlConverter(list);
6             String mysql = "INSERT INTO " + list.get(0).getClass().getSimpleName().toUpperCase() + " " + modelToSqlConverter.getSqlString();
7
8             int v = iSysConfigDao.insertSysCollect(a ,mysql,modelToSqlConverter.getMultiValueParams());
insertSysCollect函数如下


 1     @Override
 2     public int insertSysCollect(String[] a,String sql, Object[][] c) {
 3         List<ShWtqr> list = null;
 4         try {
 5             C3P0MySqlConnection c3p0MySqlConnection = new C3P0MySqlConnection();
 6             ComboPooledDataSource ds  = c3p0MySqlConnection.C3P0SqlServerConnection(a);
 7
 8             QueryRunner queryRunner = new QueryRunner(ds);
 9             int []b = queryRunner.batch(sql, c);
10         } catch (SQLException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14         return 0;
15     }



时间: 2024-07-28 17:28:12

Using QueryRunner to insert ArrayList<Object[]>的相关文章

* -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]’

错误描述: * -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]' 错误分析: 这个问题,一般是因为 nsarray或nsdictionary插入数据为空而造成的,例如从服务器获取的数据,服务器端参数更改后,这个参数承接的原参数会找不到值.因此,再将此参数传送给其他地方,如(nsarray或nsdictionary).将出现以上错误.解

Intent.putExtra()传递Object对象或者ArrayList&lt;Object&gt; (转)

Intent传递基本类型相信大家都十分熟悉,如何传递Object对象或者ArrayList<Object>对象呢? 可以通过: (1)public Intent putExtra (String name, Serializable value) (2)public Intent putExtra (String name, Parcelable value) public Intent putParcelableArrayListExtra(String name, ArrayList<

Android中Intent传递Object和ArrayList&lt;Object&gt;对象---笔记

首先看一下Intent的官方的API. 传递一些基本类型数据的方法如下: putExtra(String name, int value) putExtra(String name, String value) putExtra(String name, float value) putExtra(String name, double value) putExtra(String name, long value) putExtra(String name, boolean value) pu

Android Bundle 传递ArrayList&lt;Object&gt;的两种方法

eg. 传递 ArrayList<Group> groups 一:将对象定义成 Parcelable 类型 public class Group implements Parcelable{ } in: Bundle b = new Bundle(); b.putParcelableArrayList("list",groups); out: ArrayList<Group> groups = b.getParcelableArrayList("lis

LINK - EF6 Update/Insert model object from outside of context

LINK - https://msdn.microsoft.com/en-us/data/jj592676.aspx public void InsertOrUpdate(Blog blog) {     using (var context = new BloggingContext())     {         context.Entry(blog).State = blog.BlogId == 0 ?                                    EntityS

c3p0和QueryRunner的结合使用,让开发更加简便

1:DBUtils中的QueryRunner的使用: 1.1:QueryRunner中提供了对SQL语句操作的api: 1.2:主要有三个方法: 1.2.1:query():用于执行select(查询): 1.2.2:update():用于执行insert(插入)/update(更新)/delete(删除): 1.2.3:batch():批处理: 2:c3p0和QueryRunner的结合使用: 2.1:首先导包,如下所示的包: c3p0-0.9.1.2.jar commons-dbutils-

使用ThreadLocal、Apache的dbutils的QueryRunner和dbcp2数据库连接池的BasicDataSource封装操作数据库工具

/** * 数据库操作助手类 */ public class DatabaseHelper { private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseHelper.class); private static final ThreadLocal<Connection> CONNECTION_HOLDER; private static final QueryRunner QUERY_RUNNER; privat

TxQueryRunner类对结果集封装成bean、map及object的操作

一.需要的jar包: itcast-tools-1.4.jar     http://pan.baidu.com/s/1Dbo2i commons-beanutils-1.8.3.jar    http://pan.baidu.com/s/1Dbo2i commons-logging-1.1.1.jar  http://pan.baidu.com/s/1c0yefK0 mysql-connector-java-5.1.28-bin.jar    http://pan.baidu.com/s/1e

Java基础——ArrayList与LinkedList(二)

今天练习ArrayList与LinkedList,在网上看到有关它俩应用效率的题型.觉得很有价值,保留一下. 1 import java.util.ArrayList; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public class CollT5 { 6 static final int N = 50000; 7 8 static long timeList(List<Object> list) { 9 10 l