在prepare语句中传递数组参数 - 获取“java.sql.SQLFeatureNotSupportedException”

时间:2014-07-02 10:05:27

标签: java mysql arrays jdbc prepared-statement

我在我的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();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

Mysql -

在Mysql中无法设置数组。

而不是你可以在循环中形成(?,?,..)的查询以及设置值的相同方式。

String[] Parameter = { "user1", "Administrator" };
String query = "select * from userinfo where firstname in (";
String temp = "";

for(i = 0; i < Parameter.length; i++) {
  temp += ",?";
}

temp = temp.replaceFirst(",", "");
temp += ")";
query = query + temp;

PreparedStatement pst = conn.prepareStatement(query);

所以查询变为

  

select * from userinfo where firstname in (?,?)

并使用循环传递值。

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

答案 1 :(得分:2)

错误信息非常清楚。 MySQL不支持自定义数据类型。

目前MySQL仅支持:

  1. Numeric Type
  2. Date and Time Type
  3. String Type
  4. 或者,您可以将每个输入值用作INMySQL函数的一组值。

    按如下方式更改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();
    

答案 2 :(得分:0)

将列表转换为逗号分隔的字符串并使用。

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");

                // Consider this list is already constructed
                List<String> parameter = new ArrayList<String>();
                parameter.add("user1");
                parameter.add("Administrator");

                String parameterStr = "'" + String.join("','", parameter) + "'";
                PreparedStatement pst = conn.prepareStatement("select * from userinfo where firstname in(" + parameterStr + ")");

                ResultSet rs = pst.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getInt(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }