Подтвердить что ты не робот

Получить метаданные для подготовленного оператора в java с помощью MySql DB

Я хочу получить имя параметра и тип параметра данного подготовленного оператора. Я использую базу данных 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;
  }

}
4b9b3361

Ответ 1

Согласно this

Если драйвер создает упрощенные метаданные параметров для PreparedStatements, когда нет  метаданные доступны либо потому, что сервер не мог поддерживать подготовку инструкции, либо  Готовые инструкции на стороне сервера отключены?

Вы должны установить generateSimpleParameterMetadata в true

используйте строку подключения, аналогичную этой

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

Ответ 2

Вы не задали параметр для подготовленных операторов, без которых невозможно получить метаданные параметров. поэтому сначала установите параметр

pstmt.setInt(val)
pstmt.setString(val)

После добавления параметров вы можете получить метаданные о параметре.

Надеюсь, что это поможет.

Ответ 3

Драйвер MySQL JDBC в настоящее время не поддерживает его. Я решаю аналогичную проблему и придумал следующее обходное решение:

  • включает в себя базу данных H2 в вашем проекте (она также может работать во встроенном режиме или в памяти)
  • переведите MySQL в базу данных script в синтаксис H2 (или напишите в ANSI, чтобы он был совместим с обоими)
  • сначала скомпилировать подготовленные заявления по базе данных H2 и получить от них метаданные - база данных H2 поддерживает эту функцию, а синтаксис SQL-запросов в большинстве случаев схож с аналогичным - затем сохраните полученную метаинформацию для последующего использования
  • могут быть различия в типах данных и т.д., но в целом это должно дать вам примерно 80% соответствия с MySQL без лишних хлопот.

Я знаю, что у него много предостережений, но он может работать в некоторых случаях.

Также рассмотрите возможность обновления базы данных MySQL до 5.7, есть некоторые улучшения, связанные с подготовленными инструкциями, которые могут помочь, но я не очень глубоко осведомлен о них: