使用工具类 Db 可以很方便调用存储过程,以下是代码示例:
Db.execute(conn -> {
Ret ret = Ret.create();
try (CallableStatement cs = conn.prepareCall("{CALL my_procedure(?,?)}")) {
cs.setObject(1, para1);
cs.setObject(2, para2);
try (ResultSet rs = cs.executeQuery()) {
while (rs.next()) {
ret.set("field1", rs.getInt(1));
ret.set("field2", rs.getString(2));
ret.set("field3", rs.getObject(3));
}
}
}
return ret;
});如上所示,conn.prepareCall(...) 中传入的 "{call my_procedure(?, ?)}" 表示将被调用的存储过程,其中存储过程名为 "my_procedure",其后面的小扩号中的两个问号占位符需要在后续的 java 代码中通过 setObject(...) 传入参数,然后通过 cs.executeQuery() 得到 ResultSet,最后从其中获取数据即可。
注意:prepareCall 参数中必须要有大括号以及 "call",例如: "{CALL proc_name(?)}",此为 JDBC 调用存储过程的规范,并非 jfinal 制定的规则。
此外,MySQL 之下还可以使用更简单的方式调用存储过程:
// 调用存储过程,查询 salary 表
Record first = Db.findFirst("CALL FindSalary (1,\"201901\")");
// 调用存储过程,插入 salary 表
int update2 = Db.update("CALL InsertSalary (3, 123)");
// 调用存储过程,更新 salary 表
int update = Db.update("CALL UpdateSalary (3, 99999)");
// 调用存储过程,删除 salary 表
int delete = Db.delete("CALL DeleteSalary(3)");