Java: использование массива в качестве параметров условий для вставки данных в MySQL - PullRequest
0 голосов
/ 20 сентября 2019
package com.example.dev1.controller;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/*import java.sql.ResultSet;*/
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

import javax.swing.JApplet;

public class ReadLg extends JApplet {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String[] lev_param = { "DEBUG", "WARN", "INFO", "ERROR" };
        List<String> listparam = Arrays.asList(lev_param);
        String temp = null;
        PreparedStatement ps = null;
        Connection con = null;
        /* ResultSet rs = null; */

        try {
            BufferedReader br = new BufferedReader(new FileReader("All.log"));
            String username = ****;
            String pwd = ****;
            String connurl = "jdbc:mysql://10.247.36.174:3306/d_accesslog?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";

            con = DriverManager.getConnection(connurl, username, pwd);

            String line = null;
            while ((line = br.readLine()) != null) {
                temp+=line;
                if (line.equals(listparam)) {
                    String sql = "INSERT INTO t_weblogic_test (RawData) values ('\''+line+'\'')";
                    temp=null;
                } 

                ps = con.prepareStatement(sql);
                ps.executeUpdate();
            }

            br.close();
            con.close();
            ps.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Итак, я немного запутался, как вставить массив в качестве условия параметра.
Я хочу добавить массив в качестве моего параметра.в этой программе я считываю данные журнала и устанавливаю уровень журнала в качестве условия моего параметра, поэтому при чтении следующего уровня журнала он останавливается и вставляет данные в БД.поэтому я немного запутался, как именно это сделать.

этот файл журнала будет выглядеть ниже
"DEBUG [CorporateUserSMImpl] 30-05-2019 00:01:04: id = 2c9dc30c673209d201675e3e5c961456"
"WARN [LoginAction] 30-05-2019 00:01:04: процесс входа в систему для главной страницы go batchID = 2c9dc30c6ac6b815016b0452cd3d41ef time ENDCALLBO = 2019-05-30 00: 01: 04.198 "

, поэтому при чтении следующего уровня журнала будетостановите и сохраните предыдущую строку

NEW !!!что если файл журнала выглядит следующим образом
"DEBUG [AccountDAOImpl] 30-05-2019 00:01:45: .....

начать вызывать метод getByAccountGroupIdAndIsInquiryPicklistWithAccountTypeNew 12
"DEBUG [AccountDAOImpl] 30-05-2019 00:01:45: currentPage = 1

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Здесь есть несколько вещей, которые нужно оптимизировать.Ваша конкретная проблема заключается в том, что вы сравниваете всю строку с вашим ArrayList, который не будет работать: line.equals(listparam).Вы должны взять первый токен своей строки и посмотреть, содержит ли ваш список такое значение.Один из возможных способов сделать это:

String firstWord = line.split(" ",2)[0];
if(listparam.contains(firstWord)) {

}

Далее я бы порекомендовал использовать конструкцию try-with-resources для создания ресурсов con, ps и br.Это автоматически закроет их, если что-то пойдет не так.Кроме того, я бы создал PreparedStatement с подготовленным параметром для передачи сообщения журнала в конце концов, вместо того, чтобы просто конкатенировать его в строке sql.Это будет лучше для производительности, так как вам нужно будет создать оператор только один раз, и это будет безопаснее.

Я переписал ваш код чуть ниже, это не проверено, поэтому все еще может содержать некоторые недостатки, но я надеюсь,Вы получите общее представление:

public static void main(String[] args) {
    String connurl = "jdbc:mysql://10.247.36.174:3306/d_accesslog?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    String username = "****";
    String pwd = "****";
    // Use a prepared parameter in the sql string
    String sql = "INSERT INTO t_weblogic_test (RawData) values (?)";

    String[] levParam = { "DEBUG", "WARN", "INFO", "ERROR" };
    List<String> listparam = Arrays.asList(levParam);

    // Use a try-with-resources block to automatically handle the closing of the resources
    try(Connection con = DriverManager.getConnection(connurl, username, pwd); 
        PreparedStatement ps = con.prepareStatement(sql);
        BufferedReader br = new BufferedReader(new FileReader("All.log"));) {

      String line = null;
      while ((line = br.readLine()) != null) {
        // Get first token
        String firstWord = line.split(" ",2)[0];
        if(listparam.contains(firstWord)) { // Start of the first log message
          // Process all the messages from the log file
          processMessages(line, br, listparam, ps);
          break;
        }
      }
    } catch(SQLException ex) {
      // ex handling
    } catch(IOException ex) {
      // ex handling
    }
  }

  private static void processMessages(String line, BufferedReader br, List<String> listparam, PreparedStatement ps) throws IOException, SQLException {
    String message = line;

    // Scan until the end of the message, eg the start of the next message
    while ((line = br.readLine()) != null) {
      // Get first token
      String firstWord = line.split(" ",2)[0];
      if(listparam.contains(firstWord)) { // Start of the next log message
        // Insert your message
        ps.setString(1, message);
        ps.executeUpdate();
        message = line; // Start of the new message
      } else { // Continuation of the current message
        message = message.concat(line);
      }
    }

    if(!message.isEmpty()) {
      // Insert the last message from the log file
      ps.setString(1, message);
      ps.executeUpdate();
    }
  }
0 голосов
/ 20 сентября 2019

Вы можете вставить массив в качестве параметров параметров для вставки данных в MySQL, заменив sql, как указано ниже:

String [] levParam = {"DEBUG", "WARN", "INFO", "ERROR"};List listparam = Arrays.asList (levParam);

while ((line = br.readLine()) != null) {
     String line=null;

            String firstWord= line.split(" \\[")[0];
            if(listparam.contains(firstWord)) { 

      processMessages(line, br, listparam, ps);

    }
}


   private static void processMessages(String line, BufferedReader br, List<String> listparam, PreparedStatement ps) throws IOException, SQLException {
String message = line;

// Scan until the end of the message, eg the start of the next message
while ((line = br.readLine()) != null) {

 String lastWord= s.split(" \\[")[1];

    // Insert your message
     String sql = "INSERT INTO t_weblogic_test (RawData) values ('\''+lastWord+'\'')";
       ps = con.prepareStatement(sql);
       ps.executeUpdate();
    message = line; // Start of the new message

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...