无法在Java中更新表行

时间:2016-12-25 05:23:49

标签: java mysql database

Connection conn = SqlConnection.getConnection("jdbc:mysql://localhost:3306/stocks");
Statement statement = conn.createStatement();

    File path = new File("/Users/Zack/Desktop/JavaDB/BALANCESHEETS");
    for(File file: path.listFiles()) {
        if (file.isFile()) {
            String fileName = file.getName();
            String ticker = fileName.split("\\_")[0];
            if (ticker.equals("ASB") || ticker.equals("FRC")) {
                if (ticker.equals("ASB")) {
                    ticker = ticker + "PRD";
                }
                if (ticker.equals("FRC")) {
                    ticker = ticker + "PRD";
                }
            }

            //CSVReader reader = new CSVReader(new FileReader(file));
            //List entries = reader.readAll();
            //ArrayList<String> entry = new ArrayList<String>();

            Reader reader = new BufferedReader(new FileReader(file));
            StringBuilder builder = new StringBuilder();

            int c;
            while ((c = reader.read()) != -1) {
            builder.append((char) c);
            }

            String string = builder.toString();

            ArrayList<String> stringResult = new ArrayList<String>();

            if (string != null) {
                String[] splitData = string.split("\\s*,\\s*|\\n");
                for (int i = 0; i <splitData.length; i++) {
                    if (!(splitData[i] == null) || !(splitData[i].length() ==0)) {
                        stringResult.add(splitData[i].trim());
                    }
                }
            }

            String columnName = null;
            int yearCount = 0;
            for (int i = 0; i < stringResult.size(); i++) {
                int sL = stringResult.get(i).length();


                for (int x = 0; x < sL; x++) {
                    if (Character.isLetter(stringResult.get(i).charAt(x))) {
                        yearCount = 0;
                        System.out.println("index: " + i);
                        columnName = stringResult.get(i);
                        columnName = columnName.replace(" ", "_");
                        System.out.println(columnName);

                        i++;
                        break;
                    }
                }
                yearCount++;
                String value = stringResult.get(i);
                System.out.println("Year: " + stringResult.get(yearCount) + " Value: " + value + " Stock: " + ticker + " Column: " + columnName );
                if (!(columnName == null)) {
                String writeValues = "INSERT INTO BalanceSheet (ticker, Year, " + columnName + ") "
                                    + "VALUE ('" + ticker + "','" + stringResult.get(yearCount) + "','" + value + "')";
                String writeValues2 = "UPDATE BalanceSheet "
                                    + "SET ticker = '" + ticker + "', " 
                                        + "Year = '" + stringResult.get(yearCount) + "', "
                                        + columnName + " = '" + value + "' "
                                        + "WHERE ticker = '" + ticker + "'";
                statement.executeUpdate(writeValues2);
                }
            }

代码的底部是我尝试的两个查询,我试图将所有数据由ticker和year组织成一个表,“writeColumns”可以工作但是它为每个新的“值”设置了一个新行“列名”。我的第二次尝试“writeColumns2”没有做任何事情。

我希望为所有值更新某一年的同一行,然后转到下一年,然后是下一个滚动条。

1 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您希望在不存在的情况下插入行,但如果已经存在则更新值。您需要使用ON DUPLICATE KEY UPDATE

String writeValues = "INSERT INTO BalanceSheet (ticker, Year, " + columnName + ") "
                                    + "VALUES (?,?,?) "
        +"ON DUPLICATE KEY UPDATE " + columnName +"=?";

Statement statement = conn.prepareStatement(writeValues);
statement.setString(1,ticker);
statement.setString(2,stringResult.get(yearCount));
statement.setString(3, value);

如果您在自动收报机上创建一个独特的索引,这将解决您的移民问题

然而,这里有很多其他问题。

每列的更新 - 目前您正在为表格上的每个列执行插入/更新。你应该做的是将所有列的更新插入一个。

您没有在我的代码示例

中使用预先准备好的语句

您根本不应该这样做批处理数据的最佳方法是使用MYSQL内置的LOAD DATA INFILE命令。如果您的数据不是可以轻松导入到mysql中的格式,那么您的Java代码可以将其转换为可以的格式。这样的代码将比现在的代码更简单,更整洁