解決問題:JDBC判斷指定數據庫是否存在某張表

 驅動: com.mysql.cj.jdbc.Driver

 正確查詢方法:

public class JdbcConnection {
    public static Connection getConn() {
        String driver = "com.mysql.cj.jdbc.Driver";
        // 1.url
        String url = "jdbc:mysql://localhost:3306/ump?useSSL=false&nullCatalogMeansCurrent=true";
        String username = "root";
        String password = "123456";
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) throws Exception{
        Connection conn = getConn();
        DatabaseMetaData metaData = conn.getMetaData();
        // 2.resultSet 
        ResultSet resultSet = metaData.getTables(null, null, "table_name", new String[]{"TABLE"});
        System.out.println("是否存在:" + resultSet.next());
    }
}

 錯誤查詢方法: 

當:2.resultSet
  metaData.getTables(null, null, "table_name", new String[]{"TABLE"});
第一個參數未設置指定數據庫名稱,
同時1.url沒有設置nullCatalogMeansCurrent=true參數
jdbc就會在jdbc:mysql://101.132.44.225:3306/下掃描所以數據庫是否存在table_name表

-----------------------------------------------------------------------------------------------

發現問題:

 springboot2.1.x 集成elastic-job不會自動創建JOB_EXECUTION_LOG,JOB_STATUS_TRACE_LOG表。

分析:

  springboot2.1.x 集成mysql-connector-java爲8.0.x版本,

  棄用com.mysql.jdbc.Driver,將會加載com.mysql.cj.jdbc.Driver驅動

elastic-job源碼-->JobEventRdbStorage類中createJobExecutionTableAndIndexIfNeeded方法:

private void createJobExecutionTableAndIndexIfNeeded(final Connection conn) 
    throws SQLException {
    DatabaseMetaData dbMetaData = conn.getMetaData();
    // 說明:第一個參數並沒有指定數據庫名,根據上面的必須在連接jdbcurl處添加
    // nullCatalogMeansCurrent=true參數
    try (ResultSet resultSet = 
dbMetaData.getTables(null, null, TABLE_JOB_EXECUTION_LOG, new String[]{"TABLE"})) {
        // 查詢表是否存在
        if (!resultSet.next()) {
            createJobExecutionTable(conn);
        }
    }
}

結論:

elastic-job會查詢表JOB_EXECUTION_LOG,JOB_STATUS_TRACE_LOG是否存在,如果在其他庫中存在,
則不會創建,所以當其他庫中存在時,url必須加上nullCatalogMeansCurrent=true參數,
公司項目正是因爲沒有設置nullCatalogMeansCurrent參數,其他庫存在該表,才導致不可以自動創建。

幫助博客:

 Mybatis Generator使用com.mysql.cj.jdbc.Driver遇到的問題 : 
        https://www.cnblogs.com/boboooo/p/9100991.html

 JDBC如何判斷數據庫的表是否存在 :
        https://blog.csdn.net/naruto0025/article/details/74201730

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章