Java 中如何传递数组参数给 SQL

Java 传递数组参数给 SQL 进行查询时需要做一些专门处理。比如 SQL 语句 select * from EMP where EID in(?)中,如果要把数组 [1,2,4] 作为参数传入,需要把 SQL 写成 select * from EMP where EID in(?, ?, ?)的形式,? 的个数和参数数组的长度相同,参数数组长度变化时就要再改写 SQL,比较麻烦。如果是字符串或日期时间类,则还要再拼上引号、或做数据类型转换等,更缺乏灵活性,通用性也不强。
借助集算器可以很方便地完成这件事。

下面就以上述例子 SQL 说明实施步骤。

1.   运行集算器,配置数据库连接并命名,填写的参数和 JDBC 连接时一样。
操作菜单:Tool->Datasource Connection->Datasouce 设置如下:

a100png

若已经配置过数据库,可忽略此步操作。

2.   在集算器编写下面脚本,需要一个数组型参数param,设置示意图如下:

a101png


SPL 脚本 test.dfx 文件实现:
A B
1 =connect("db") / 连接数据库
2 =A1.query@x("select * from EMP where   EID in(?)", param) / 数组参数作为条件查询

3.    执行脚本返回结果:
A2 EID NAME SURNAME GENDER STATE BIRTHDAY HIREDATE DEPT SALARY
1 Rebecca Moore F California 1974-11-20 2005-03-11 R&D 7000
2 Ashley Wilson F New York 1980-07-19 2008-03-16 Finance 11000
4 Emily Smith F Texas 1985-03-07 2006-08-15 HR 7000

4.      集成到 Java 应用中

集算器提供了 JDBC 驱动,将脚本集成代码如下:

public static void testDataServer() {
Connection con = null;
java.sql.PreparedStatement st;
 
try{
    int[] ls = new int[]{6,7,9,10};  // 数组参数
    Class.forName("com.esproc.jdbc.InternalDriver");
    con= DriverManager.getConnection("jdbc:esproc:local://"); 
    // 调用 test.dfx 脚本
    st =con.prepareCall("test ?");
 
    // 直接填入即可,不必改写 SQL
    st.setObject(1, ls); 
    st.execute();
 
    // 获取结果集
    ResultSet rst = st.getResultSet();
    System.out.println(rst);
}catch(Exception e){
    System.out.println(e);
}finally{
    // 关闭连接
    if (con!=null) {
        try {
            con.close();
        }catch(Exception e) {
            System.out.println(e);
        }
    }  
  }
}

集算器与 JAVA 集成的进一步信息可参考:《Java 如何调用 SPL 脚本》。
在开发中还有常见的多条件查询,且不确定个数的参数处理,也与传递数组参数给 SQL 类似,都可以借助集算器来处理。