使用MySql DB获取java中prepared语句的元数据
我想获取给定准备语句的参数名和参数类型。我正在使用MySQL数据库。但当我运行程序时,它会抛出一个错误:使用MySql DB获取java中prepared语句的元数据,java,mysql,metadata,sqlexception,Java,Mysql,Metadata,Sqlexception,我想获取给定准备语句的参数名和参数类型。我正在使用MySQL数据库。但当我运行程序时,它会抛出一个错误: Exception in thread "main" java.sql.SQLException: Parameter metadata not available for the given statement 在这条线上 String paramTypeName = paramMetaData.getParameterTypeName(param); 我不知道为什么会这样。如果可
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;
}
}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.ParameterMetaData;
导入java.sql.PreparedStatement;
导入java.sql.Statement;
公共班机{
公共静态void main(字符串[]args)引发异常{
连接conn=getMySqlConnection();
语句st=conn.createStatement();
String query=“从调查中选择*,其中id>和name=?”;
PreparedStatement pstmt=conn.prepareStatement(查询);
ParameterMetaData paramMetaData=pstmt.getParameterMetaData();
if(paramMetaData==null){
System.out.println(“db供应商不支持ParameterMetaData”);
}否则{
System.out.println(“db供应商支持ParameterMetaData”);
//找出动态参数的数量
int paramCount=parammadata.getParameterCount();
System.out.println(“paramCount=“+paramCount”);
System.out.println(“------------------------”;
对于(int-param=1;param根据
如果没有,驱动程序是否应该为PreparedStatements生成简化的参数元数据
元数据可用,原因可能是服务器无法支持准备语句,或者
服务器端准备的语句被禁用?
您必须将generateSimpleParameterMetadata
设置为true
使用与此类似的连接字符串
jdbc:mysql://localhost:3306/mydb?generateSimpleParameterMetadata=true
您尚未将参数设置为准备好的语句,如果没有这些语句,则无法获取参数元数据。因此,请先设置参数
pstmt.setInt(val)
pstmt.setString(val)
添加参数后,可以获得有关参数的元数据
希望这有帮助。MySQL JDBC驱动程序目前不支持它。我正在解决类似的问题,并提出了以下解决方法:
在项目中包括H2数据库(它也可以在嵌入式模式或内存中运行)
将MySQL创建数据库脚本转换为H2语法(或者用ANSI编写,以便两者兼容)
首先在H2数据库上编译准备好的语句并从中获取元数据-H2数据库支持此功能,SQL查询语法在大多数情况下类似-然后保存获取的元数据信息以供以后使用
在数据类型等方面可能会有差异,但通常情况下,这会让您与MySQL的匹配率达到80%左右,而不会有太多麻烦
我知道它有很多警告,但在某些用例中可能会起作用
还考虑将MySQL数据库升级到5.7,有一些与准备好的语句相关的改进可能会有帮助,但是我对那些:
哪一行抛出该SQLException
?字符串paramTypeName=paramMetaData.getParameterTypeName(param);顺便说一句,这一行是无用的语句st=conn.createStatement();
为哪个参数获得该异常(param
值)?嗨,Bhesh Gurung…我已经试过了,执行得很好。谢谢Bhavik…我的代码在URL中添加了“generateSimpleParameterMetadata=true”后仍在工作,但它给出的参数类型是“VARCHAR”,在我的例子中,参数是“INTEGER”。当我给出这个查询时:-“select*from test1 where age>?”。它给出的参数类型是“VARCHAR”。但在我的例子中,参数是“age”,这是“INTEGER”类型。请使用数据库再次检查它。不应该发生这种情况。请使用getParameterClassName(int-param)
检查您得到的值是多少?