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 设置如下:
若已经配置过数据库,可忽略此步操作。
2. 在集算器编写下面脚本,需要一个数组型参数param,设置示意图如下:
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 类似,都可以借助集算器来处理。
英文版