Java - Mysql - Множественный запрос

Строка qLink = "";

                        qLink = "INSERT INTO trackgps.queclinklogs(Supplier,NtwProtocol,IMEI,log,DBTIME)" +
                                "VALUES"                    +
                                "("                         +
                                "'" + supplier              + "',"+
                                "'" + protocol              + "',"+
                                "'" + failedQIMEI           + "',"+
                                "'" + failedQLog            + "',"+
                                "'" + currentQuecTimestamp  + "'" +
                                "),"                        +
                                "("                         +
                                "'" + supplier              + "'" + "," +
                                "'" + protocol              + "'" + "," +
                                "'" + QuecLinkIMEI          + "'" + "," +
                                "'" + data2                 + "'" + "," +
                                "'" + currentQuecTimestamp  + "'" +
                                ")";    


                        Statement stmtLink = connQ.createStatement();
                        stmtLink.execute(qLink);
                        stmtLink.close();

Строковое потребление байтов = "";

                    bytesconsumption = "INSERT INTO test_backoffice.carrierDataConsumption(IMEI,beginMonth,endMonth,dataConsumed,month,year) VALUES"    +
                                        "("                                                                                                             +
                                        "'"+ QuecLinkIMEI                                                                                   + "'" + "," +
                                        "NOW()"                                                                                                   + "," +
                                        "NOW()"                                                                                                   + "," +
                                        "'"+ totalBytesConsumed                                                                                  + "'," +
                                        "MONTH(NOW())"                                                                                            + "," +
                                        "YEAR(NOW())"                                                                                                   +
                                        ") ON DUPLICATE KEY UPDATE endMonth = NOW(), dataConsumed = dataConsumed + " + totalBytesConsumed;

                    Statement stmtbytesconsumption;

                    stmtbytesconsumption = connQ.createStatement();
                    stmtbytesconsumption.execute(bytesconsumption);
                    stmtbytesconsumption.close();

Строка qdebug = "";

    qdebug = "INSERT INTO trackgps.rawdata(Module,SubModule,IMEI,listenerTime,msg)" +
            "VALUES"                    +
            "("                         +
            "'"+ "LISTENER TCP"         + "'" + "," +
            "'"+ SubMod                 + "'" + "," +
            "'"+ identifier             + "'" + "," +
            "'"+ listendatetime         + "'" + "," +
            "'"+ msg                    + "'" +
            ")";    

    Statement stmtqdebug = conn.createStatement();
    stmtqdebug.execute(qdebug);
    stmtqdebug.close();

Есть ли способ выполнить эти три вставки всего за один оператор Java? Вместо того, чтобы создавать 3 заявления с 3 выполнениями и 3 закрытиями?

Другой вопрос, который у меня есть, должен ли я использовать заявления или PrepareStatements?


person ThelmaJay    schedule 14.02.2014    source источник


Ответы (2)


Вы можете вызвать все 3 запроса в одном выражении:

Statement stmt = conn.createStatement();
stmt.executeUpdate(qLink);
stmt.executeUpdate(bytesconsumption);
stmt.executeUpdate(qdebug);
stmt.close();

Используйте PreparedSatement вместо Statement, когда хотите:

  • выполнять один и тот же оператор много раз с разным набором параметров
  • не заботьтесь о формировании параметров, например. если listendatetime имеет тип Timestamp, вы можете использовать только ps.setTimestamp(4, listendatetime), и драйвер правильно отформатирует его независимо от базовой базы данных.
person agad    schedule 14.02.2014

Вы можете объединить запросы с помощью ";" символ, чтобы разделить его и выполнить все в уникальном операторе.

Запрос:

"INSERT INTO table1 ... ;INSERT INTO table2 ...;"

и исполнение:

Statement st = conn.createStatement();
st.execute("INSERT INTO table1 ... ;INSERT INTO table2 ...;");
st.close();

Ваше здоровье

person Community    schedule 14.02.2014
comment
спасибо :). Я собираюсь попробовать. - person ThelmaJay; 14.02.2014
comment
это не работает :(. Это работает только тогда, когда я делаю отдельный подготовленный оператор. - person ThelmaJay; 17.02.2014
comment
Вы можете использовать решение @agad! :) - person ; 17.02.2014
comment
Спасибо @fastebro. буду использовать :) - person ThelmaJay; 07.03.2014