使用MySQL连接器Java改进查询

时间:2015-01-20 19:54:32

标签: java mysql jdbc

当我必须在Java中处理MySQL DB时,我使用MySQL自己开发的驱动程序。使用此库非常容易,但我对性能有疑问。什么"关闭"我每次向DB查询时都应该使用哪种方法?

例如,如果我有一个for循环,这会在DB中生成更多插入,我应该使用什么?

private void invioInsert(String query){
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch (Exception E) {
        System.err.println("Non trovo il driver da caricare.");
        E.printStackTrace();
    }
    try {
        PreparedStatement statement = conn.prepareStatement(query);
        statement.execute();
        statement.close();

    } catch (SQLException E) {
        System.out.println("SQLException: " + E.getMessage());
        System.out.println("SQLState:     " + E.getSQLState());
        System.out.println("VendorError:  " + E.getErrorCode());
    }
}

例如,for循环可以是:

for(int i=0; i<=10, i++){
    String query = "INSERT TABLE VALUES ("+i+")";
    sendQuery(query);
}

所以这是for循环的完整代码:

for (int i = 0; i < file.getList().size(); i++) {
        StringTokenizer tokenizer = new StringTokenizer(file.getList().get(i).replace("\"", ""));
        String ID = tokenizer.nextToken("|");
        int j = 0;
        while(j<5){
            tokenizer.nextToken("|");
            j++;
        }
        String voto = tokenizer.nextToken("|");
        String query = "Insert RisultatiGiocatori values ('"+giornata+"','"+ID+"','"+voto+"')";
        invioInsert(query);
    }

2 个答案:

答案 0 :(得分:1)

这是批量执行PreparedStatement的经典用例:

String query = "INSERT TABLE VALUES (?)";
try {
    PreparedStatement statement = conn.prepareStatement(query);
    for(int i=0; i<=10, i++){
        statement.setInt(1, i);
        statement.addBatch();
    }
    statement.executeBatch();
    statement.close();

} catch (SQLException E) {
    System.out.println("SQLException: " + E.getMessage());
    System.out.println("SQLState:     " + E.getSQLState());
    System.out.println("VendorError:  " + E.getErrorCode());
}

答案 1 :(得分:0)

永远不要在循环内创建PreparedStatement。 尝试在外面创建声明,你会有很大的改进。