1 快速上手

2 JFinalConfig

3 Controller

4 AOP

5 ActiveRecord

6 Enjoy 模板引擎

7 EhCachePlugin

8 RedisPlugin

9 Cron4jPlugin

10 Validator

11 国际化

12 Json 转换

13 JFinal架构及扩展

14 升级到 5.2.2

5.16 调用存储过程

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