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

use*_*790 15 java mysql metadata sqlexception

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

Exception in thread "main" java.sql.SQLException: Parameter metadata not available for the   given statement
Run Code Online (Sandbox Code Playgroud)

在这条线上

String paramTypeName = paramMetaData.getParameterTypeName(param);
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.如果可能,请有人帮助我.

这是我的代码:

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;
  }

}
Run Code Online (Sandbox Code Playgroud)

Bha*_*hah 12

根据这个

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

你必须设置generateSimpleParameterMetadata为true

使用类似于此的连接字符串

jdbc:mysql://localhost:3306/mydb?generateSimpleParameterMetadata=true
Run Code Online (Sandbox Code Playgroud)