使用工具类 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)");