Вопрос

I have a batch process program in place where I am using JDBC to make calls to the database. I am sending information in a batch of 100 with 'ID' as the primary key.

I want to make a single call to the database and then execute multiple SQL statements before closing the connection.

I am posting portion of the code for reference

        //  Database credentials
        String USER = username;
        String PASS = password;

        Connection connec = null;
        Statement stmt = null;

        //STEP 2: Register JDBC driver
        Class.forName("com.mysql.jdbc.Driver");

        //STEP 3: Open a connection
        System.out.println("Connecting to a selected database...");
        connec = DriverManager.getConnection(DB_URL, USER, PASS);
        System.out.println("Connected database successfully...");

        //STEP 4: Execute a query
        System.out.println("Creating statement...");
        stmt = connec.createStatement();

        // Step 2: To update the database with the new count and the netppe values.

        // Step to know whether the ID is present or not in the database
        for(int i=0;i<identities.length;i++){
        String booleanString = "SELECT 1 FROM cgm_counters WHERE id = "+identities[i];

stmt.execute(booleanString);  
        ResultSet resultSet = stmt.getResultSet(); //result set for records  
        boolean recordFound = resultSet.next(); 
        ResultSet rs = null;
// Retrieve the 'netppe' information.
        if(recordFound){

            String sql =  "SELECT * FROM cgm_counters WHERE id="+identities[i];
            rs = stmt.executeQuery(sql);
            while(rs.next()){
                 //Retrieve by column name
                 double net_ppe  = rs.getDouble("spend");
                 System.out.println("The value of the netppe :"+net_ppe);
            }

}// end of 'If' statement

I want to do three things in one go for each ID in the for loop.

1 > I want to see whether the ID is present or not in the database
2 > If ID - present
{ 
2 a > retrieve the 'netppe' information for that particular ID
2 b > retrieve the 'count' information for that same ID
2 c> Update the database with the new 'netppe' and 'count' value for the same ID
} else {
Insert the information for the new ID
}

How to execute all the statements without having to close the connection for each ID? New to JDBC and SQL. Any help is appreciated.

Это было полезно?

Решение

Okay so there are many problems with your code. First off,

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

You would have to pass a Driver implementation, not the interface itself; but the good news is that this code is unnecessary as of JDBC 4.0. It already scans your classpath to locate drivers for you.

Second, your connection is not being closed with each query. There's nowhere in your code where you're calling connec.close(). JDBC won't close the connection for you, either.

Third, you don't need to do this with nested for loops! That is an awful idea. Your concept of SQL queries and JDBC needs some sharpening. You can simply do the following:

for(int i=0;i<identities.length;i++) {
    String sql =  "SELECT * FROM cgm_counters WHERE id="+identities[i];
    ResultSet rs = stmt.executeQuery(sql);
    while(rs.next()){
        //Retrieve by column name
        double net_ppe  = rs.getDouble("spend");
        System.out.println("The value of the netppe :"+net_ppe);
    }
}

Even better would be to do a batch query.

String batch = "(";
for (int i = 0; i < identities.length;i++) {
    if (i < identities.length() - 1) 
        batch += "?, ";
    else 
        batch += "?)"
}

String sql =  "SELECT * FROM cgm_counters WHERE id in " + batch;
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
    double net_ppe  = rs.getDouble("spend");
    System.out.println("The value of the netppe :"+net_ppe);
}

It seems you are doing a preliminary round of queries to "check" whether each ID is in the table, but this is not necessary. If the ID is not in the table, then you'll get an empty result set in return. There's nothing wrong with an empty result set. Your while loop will never run in this case because rs.next() will return false. You can also check whether it's empty by calling rs.first(). This way doesn't move the cursor.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top