简体   繁体   中英

How do I list multiple databases with their tables by using “Show Tables” via Java?

I am trying to list MySQL databases and their tables with Java. For now, I have two databases as "Database_Services with MySQL_Database_Service , MSSQL_Database_Service , and Directory_Services with Active_Directory , OpenLDAP tables. I get the output for Database_Services and its tables but I do not get the other ones.

public class connectMySQL implements serverConnection{
Connection conn;
Statement stmt;
public void connect(String dbName){
    String url;
    try {
        if(dbName.equals("")){
            url = "jdbc:mysql://x:x/";
        }
        else{
            url = "jdbc:mysql://x:x”+ dbName;
        }
        String username = “x”;
        String password = "x";
        conn =  DriverManager.getConnection(url,username,password);
        stmt = conn.createStatement();
    }
    catch (SQLException ex)
    {
        System.out.println("An error occurred. Maybe user/password is invalid");
        ex.printStackTrace();
    }
}

}

public class listInf extends connectMySQL implements listInfrastructure {
public void list() {
    String dbName;
    ResultSet rs;
    try{
        connect("");
        String str = "SHOW DATABASES";
        ResultSet resultSet = stmt.executeQuery(str);
        while(resultSet.next()){
            dbName = resultSet.getString("Database");
            if(!dbName.contains("schema") && !dbName.equals("mysql")){
                System.out.println(dbName);
                rs = stmt.executeQuery("SHOW TABLES IN " + dbName);
                while (rs.next()) {
                    System.out.println("\t" + rs.getString("Tables_in_" + dbName));
                }
            }
        }
    }
    catch(SQLException e){
        System.out.println("Error");
    }
}

}

I want to get an output like:

Database_Services:

  1. MySQL_Database_Service.
  2. MSSQL_Database_Service.

Directory_Services:

  1. Active_Directory_Service.

  2. OpenLDAP_Service.

You are using the same Statement for multiple queries. You cannot do that. From the Javadoc of Statement :

By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

Connection conn1 = DriverManager.getConnection(url, username, password);
Connection conn2 = DriverManager.getConnection(url, username, password);

Statement statement1 = conn1.createStatement();
Statement statement2 = conn2.createStatement();

ResultSet resultSet1 = statement1.executeQuery("SHOW TABLES IN DB1");
ResultSet resultSet2 = statement2.executeQuery("SHOW TABLES IN DB2");

while (resultSet1.next()) {
   System.out.println("");
}

while (resultSet2.next()) {
   System.out.println("");
}

if you have more than 2 database, then simply you can use loop for to get the results.

You can use the meta information database information_schema .

SELECT 
    TABLE_SCHEMA,
    TABLE_NAME 

FROM information_schema.TABLES

WHERE TABLE_SCHEMA IN ('Database_Services', 'Directory_Services')

ORDER BY TABLE_SCHEMA

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM