当前位置: 代码迷 >> 综合 >> 解决问题:JDBC判断指定数据库是否存在某张表
  详细解决方案

解决问题:JDBC判断指定数据库是否存在某张表

热度:100   发布时间:2023-11-23 10:13:05.0

 驱动: com.mysql.cj.jdbc.Driver

 正确查询方法:

public class JdbcConnection {public static Connection getConn() {String driver = "com.mysql.cj.jdbc.Driver";// 1.urlString 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());}
}

 错误查询方法: 

1.url没有设置nullCatalogMeansCurrent=true参数
2.resultSetmetaData.getTables(null, null, "table_name", new String[]{"TABLE"});第一个参数未设置指定数据库名称.jdbc就会在jdbc:mysql://localhost: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();try (ResultSet resultSet = 
// 说明:第一个参数并没有指定数据库名,根据上面的说明必须在连接jdbcurl处添加nullCatalogMeansCurrent=true参数
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.htmlJDBC如何判断数据库的表是否存在 :https://blog.csdn.net/naruto0025/article/details/74201730

 

    

  相关解决方案