使用 MySql DB 获取 Java 中预准备语句的元数据

2022-09-03 02:14:11

我想获取给定预准备语句的参数名称和参数类型。我正在使用MySQL数据库。但是当我运行我的程序时,它会抛出一个错误:

Exception in thread "main" java.sql.SQLException: Parameter metadata not available for the   given statement

在此行

String paramTypeName = paramMetaData.getParameterTypeName(param);

我不知道为什么会发生这种情况。如果可能的话,请任何人帮助我。

这是我的代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class Main {
  public static void main(String[] args) throws Exception {
    Connection conn = getMySqlConnection();
    Statement st = conn.createStatement();

    String query = "select * from survey where id > ? and name = ?";
    PreparedStatement pstmt = conn.prepareStatement(query);
    ParameterMetaData paramMetaData = pstmt.getParameterMetaData();
    if (paramMetaData == null) {
      System.out.println("db vendor does NOT support ParameterMetaData");
    } else {
      System.out.println("db vendor supports ParameterMetaData");
      // find out the number of dynamic parameters
      int paramCount = paramMetaData.getParameterCount();
      System.out.println("paramCount=" + paramCount);
      System.out.println("-------------------");
      for (int param = 1; param <= paramCount; param++) {
        System.out.println("param number=" + param);
        String paramTypeName = paramMetaData.getParameterTypeName(param);
        System.out.println("param SQL type name=" + paramTypeName);
      }
    }
    pstmt.close();
    conn.close();
  }

public static Connection getMySqlConnection() throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/mydb";
    String username = "root";
    String password = "";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

}

答案 1

当由于服务器不支持准备语句或服务器端预准备语句被禁用而没有可用的元数据时,驱动程序是否应为 ReadyStatement 生成简化的参数元数据?

您必须设置为 truegenerateSimpleParameterMetadata

使用类似于以下内容的连接字符串

jdbc:mysql://localhost:3306/mydb?generateSimpleParameterMetadata=true

答案 2

MySQL JDBC 驱动程序目前不支持它。我正在解决类似的问题,并提出了以下解决方法:

  1. 在项目中包含 H2 数据库(它也可以在嵌入式模式或内存中运行)
  2. 将MySQL创建数据库脚本转换为H2语法(或将其写入ANSI,使其与两者兼容)
  3. 首先在H2数据库上编译预准备的语句并从中获取元数据 - H2数据库支持此函数,并且SQL查询语法在大多数情况下是相似的 - 然后保存获得的元信息以供以后使用
  4. 数据类型等方面可能存在差异,但总的来说,这应该可以让您与MySQL匹配约80%,而不会有太多麻烦

我知道它有很多警告,但它可能在某些用例中起作用。

还考虑将MySQL数据库升级到5.7,有一些与预准备语句相关的增强功能可能会有所帮助,但我对这些增强功能知之甚少:


推荐