在prepare语句中传递数组参数 – 获取“java.sql.SQLFeatureNotSupportedException”
我在我的prepare语句中遇到错误java.sql.SQLFeatureNotSupportedException。 我正在使用Mysql数据库。
以下是我的代码。
class tmp { public static void main(String arg[]) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/sample", "root", "root"); PreparedStatement pst = conn .prepareStatement("select * from userinfo where firstname in(?)"); String[] Parameter = { "user1", "Administrator" }; Array sqlArray = conn.createArrayOf("VARCHAR", Parameter); pst.setArray(1, sqlArray); ResultSet rs = pst.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1)); } } catch (Exception e) { e.printStackTrace(); } } }
对于Mysql
–
在Mysql中无法设置数组。
而不是你可以在循环中形成(?,?,..)的查询以及设置值的相同方式。
String[] Parameter = { "user1", "Administrator" }; String query="select * from userinfo where firstname in ("; String temp=""; for(i=0;i
PreparedStatement pst = conn.prepareStatement(query);
所以查询成为 - 从userinfo中选择*,其中first(?,?)
并使用循环传递值。
对于Oracle
-
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("CHAR_ARRAY", conn); String[] Parameter = { "user1", "Administrator" }; java.sql.Array sqlArray = new oracle.sql.ARRAY(arrayDescriptor, conn, content); . . pstmt.setArray(1, sqlArray);
错误信息非常清楚。 MySQL
不支持自定义数据类型。
目前MySQL仅支持:
- 数字类型
- 日期和时间类型
- 字符串类型
或者,您可以将每个输入值用作MySQL
中IN
函数的一组值。
更改您的JAVA
代码如下:
StringBuilder sbSql = new StringBuilder( 1024 ); sbSql.append( "select * from userinfo where firstname in(" ); for( int i=0; i < Parameter.length; i++ ) { if( i > 0 ) sbSql.append( "," ); sbSql.append( " ?" ); } // for sbSql.append( " )" ); PreparedStatement pst = conn.prepareStatement( sbSql.toString() ); for( int i=0; i < Parameter.length; i++ ) { pst.setString( i+1, Parameter[ i ] ); } // for ResultSet rs = pst.executeQuery();