使用java将多个值插入mysql db表时出错

时间:2013-04-23 08:41:59

标签: java mysql jdbc

这是我的问题。我必须创建一个程序,我将从excel文件中读取数据并将此数据加载到数据库中的表中。该表将具有excel文件的名称,表的字段将是excel文件的第一行中的数据。我已经使代码读取excel文件并使用我想要的名称创建表。现在我必须在表中插入值,但在这里我有错误。

以下代码是我制作的整个程序。

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class readexcel {


    public static void main (String[] args) throws Exception {

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/kainourgia","root", "root");
        Statement  stmt = con.createStatement();
        //String filename = "C:\\Users\\myfiles\\Documents\\test6.xls";
        String fullPath = "C:\\Users\\myfiles\\Documents\\test7.xls";
        String Path = "C:\\Users\\myfiles\\Documents\\";
        String filename = "test7.xml";
        String[] parts = filename.split("\\.");
        String tablename = parts[0];


        List sheetData = new ArrayList();
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(fullPath);
            HSSFWorkbook workbook = new HSSFWorkbook(fis);
            HSSFSheet sheet = workbook.getSheetAt(0);

            Iterator rows = sheet.rowIterator();
            while (rows.hasNext()) {
                HSSFRow row = (HSSFRow) rows.next();
                Iterator cells = row.cellIterator();

                List data = new ArrayList();
                   while (cells.hasNext()) {
                   HSSFCell cell = (HSSFCell) cells.next();
                   data.add(cell);
                   }
                   sheetData.add(data);
            }

                   } catch (IOException e) {
                   e.printStackTrace();
                   } finally {
                   if (fis != null) {
                   fis.close();
                   }
                   }

    showExcelData(sheetData);
    HashMap<String,Integer> tFields = new HashMap();
    tFields = parseExcelData(sheetData);
    String str = getCreateTable(con, tablename, tFields);
    str = fillTable ( con, tablename, tFields);
    }

    private static void showExcelData(List sheetData) {
//      HashMap<String, String> tableFields = new HashMap();
        for (int i=0; i<sheetData.size();i++){
          List list = (List) sheetData.get(i);
          for (int j=0; j<list.size(); j++){
              Cell cell = (Cell) list.get(j);
              if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
              {
                  System.out.print(cell.getNumericCellValue());
              }
              else if(cell.getCellType()==Cell.CELL_TYPE_STRING)
              {
                  System.out.print(cell.getRichStringCellValue());
              }
              else if(cell.getCellType()==Cell.CELL_TYPE_BOOLEAN) {
                  System.out.print(cell.getBooleanCellValue());
              }
              if (j < list.size() - 1) 
              {
                  System.out.print(", ");
              }
          }
          System.out.println("");
        }
    }


    @SuppressWarnings({ "unchecked", "unused" })
    private static HashMap parseExcelData (List sheetData){

            HashMap<String,Integer> tableFields = new HashMap();
            List list = (List) sheetData.get(0);
            for (int j=0; j<list.size(); j++){
                Cell cell=(Cell) list.get(j);
                tableFields.put(cell.getStringCellValue(),cell.getCellType());
        }

            return tableFields;

        }

    private static String getCreateTable(Connection con, String tablename, HashMap<String, Integer> tableFields){
        Iterator iter = tableFields.keySet().iterator();
        Iterator cells = tableFields.keySet().iterator(); 
        String str="";
        String[] allFields = new String[tableFields.size()];
        int i = 0;
        while (iter.hasNext()){
            String fieldName = (String) iter.next();
            Integer fieldType=(Integer)tableFields.get(fieldName);

            switch (fieldType){
                case Cell.CELL_TYPE_NUMERIC:
                    str=fieldName + " INTEGER";
                    break;
                case Cell.CELL_TYPE_STRING:
                    str= fieldName + " VARCHAR(255)";
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    str=fieldName + " INTEGER";
                    break;
            }
            allFields[i++]= str;
        }
        try 
        {
            Statement  stmt = con.createStatement();
//          try
//          {
//              System.out.println( "Use the database..." );
//              stmt.executeUpdate( "USE kainourgia;" );
//          }
//          catch( SQLException e )
//          {
//              System.out.println( "SQLException: " + e.getMessage() );
//              System.out.println( "SQLState:     " + e.getSQLState() );
//              System.out.println( "VendorError:  " + e.getErrorCode() );
//          }
            try
            {
                String all = org.apache.commons.lang3.StringUtils.join(allFields, ",");
                String createTableStr = "CREATE TABLE " + tablename + " (" + all + ")";

                System.out.println( "Create a new table in the database" );
                stmt.executeUpdate( createTableStr );
            }
            catch( SQLException e )
            {
                System.out.println( "SQLException: " + e.getMessage() );
                System.out.println( "SQLState:     " + e.getSQLState() );
                System.out.println( "VendorError:  " + e.getErrorCode() );
            }
        }
        catch(Exception e)
        {
        }
        return str;
    }

    private static String fillTable(Connection con, String fieldname, HashMap<String, Integer> tableFields){
        Iterator iter = tableFields.keySet().iterator();
        Iterator cells = tableFields.keySet().iterator(); 
        String str="";
        String[] tousFields = new String[tableFields.size()];
        int i = 1; 
        while (iter.hasNext()){
            String fieldName = (String) iter.next();
            Integer fieldType=(Integer)tableFields.get(fieldname);
            while (cells.hasNext()){
                String fieldName1 = (String) cells.next();
                Integer fieldType1=(Integer)tableFields.get(fieldName1);
                }
                tousFields[i++]= str;   
        }
        try
        {
            Statement  stmt = con.createStatement();
            System.out.println ( "Use the table");
            String all = org.apache.commons.lang3.StringUtils.join(tousFields, ",");
            String sql= "INSERT INTO" + fieldname + "VALUES (" +all +")";
            stmt.executeUpdate (sql);
        }
        catch( SQLException e )
        {
            System.out.println( "SQLException: " + e.getMessage());
            System.out.println( "SQLState: " + e.getSQLState() );
            System.out.println( "VendorError: " + e.getErrorCode());
        }

        return str;
    }
    private Statement createStatement() {
        return null;
    }           


}

我得到的错误是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at readexcel.fillTable(readexcel.java:183)
    at readexcel.main(readexcel.java:68)

有人可以帮我解决吗? 如何在每个单元格中插入值,我该怎么办? 插入值中的命令是否正确?

1 个答案:

答案 0 :(得分:0)

您尝试访问tousFields中的非现有索引。

您需要将其声明为:

String[] tousFields = new String[tableFields.size() + 1];