zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    View Code

    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     }
    
    
    







  • 相关阅读:
    ECS:Systems
    ECS:Components
    ECS:Entitias
    对List遍历过程中添加和删除的思考
    SpringBoot 推荐博客
    理解和解决Java并发修改异常ConcurrentModificationException(转载)
    我对CopyOnWrite的思考
    最简日志打印规范(推荐,转载)
    为什么不应该使用Zookeeper做服务发现?(转载)
    浏览器允许跨域设置(不用于生产环境,开发用)
  • 原文地址:https://www.cnblogs.com/wang3680/p/7766927.html
Copyright © 2011-2022 走看看