<a name="imPZx"></a>
Foxnic-SQL (9) —— DAO 特性 : 执行存储过程与函数
<a name="ILkYL"></a>
概述
Foxnic-SQL 对函数与存储过程的调用做了简化,使调用过程尽量简洁。虽然现在新构建的应用越来越不提倡使用数据库存储过程与函数,但是它们还是非常广泛地被使用着。任何技术的使用,一是看场景,而是看使用者,存储过程和函数不应被抛弃。<br /> 本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。 <a name="X2dnY"></a>
定义存储过程
首先,在数据库创建存储过程和函数,存储过程的特点是多个参数,多个返回值。函数的特点是多个参数,一个返回值。当然,从数据库角度它们还有其它的区别,我们不做展开,在此我们只关心调用的形式。示例代码如下:
1CREATE DEFINER=`foxnic`@`%` PROCEDURE `demo_proc` 2( 3 IN a decimal(8,2), 4 IN b decimal(8,2), 5 OUT c decimal(8,2), 6 OUT d decimal(8,2) 7) 8BEGIN 9 set c=a+b; 10 set d=a*b; 11END
1CREATE DEFINER=`foxnic`@`%` FUNCTION `demo_func`( 2 a decimal(8,2), 3 b decimal(8,2) 4) RETURNS decimal(8,2) DETERMINISTIC 5BEGIN 6 RETURN a+b; 7END
<a name="vvk6z"></a>
调用函数
函数的调用相对比较简单,也就是传入参数返回结果,示例代码如下:
1/** 2* 数据库函数调用测试 3* */ 4@Test 5 public void test_func() { 6 // 通过 DBInstance 拿到 DAO 对象 7 DAO dao= DBInstance.DEFAULT.dao(); 8 // 从 dao 拿到存储函数对象 9 StoredFunction<BigDecimal> function =dao.getStoredFunction("demo_func",BigDecimal.class); 10 // 按顺序传入参数 11 BigDecimal result= function.execute(1.1,2.2); 12 // 检查结果 13 assertTrue(result.doubleValue()==3.30); 14}
针对 StoredFunction 类由于它只有一个返回值,Foxnic-SQL 使用了泛型的方式来简化参数定义。通过 DAO 拿到 StoredFunction 对象,通过 execute 方法按顺序传入参数,执行即可。 <a name="hBrtr"></a>
调用存储过程
由于存储过程可以是多入参、多出参,所以它的调用过程相对复杂一点。它需要有参数类型定义,map 参数传入并执行,返回多个结果值等几个步骤,示例代码如下:
1/** 2* 数据库存储过程调用测试 3* */ 4@Test 5 public void test_proc() { 6 // 通过 DBInstance 拿到 DAO 对象 7 DAO dao= DBInstance.DEFAULT.dao(); 8 // 从 dao 拿到存储过程对象 9 StoredProcedure procedure =dao.getStoredProcedure("demo_proc"); 10 // 定义参数 11 procedure.declareParameter("a", DBDataType.STRING); 12 procedure.declareParameter("b", DBDataType.DECIMAL); 13 procedure.declareOutParameter("c",DBDataType.DECIMAL); 14 procedure.declareOutParameter("d",DBDataType.DECIMAL); 15 // 传入 Map 类型参数 16 Map<String,Object> result= procedure.execute(MapUtil.asMap("a",1.1,"b",2.2)); 17 // 获得多个返回值 18 BigDecimal c=(BigDecimal) result.get("c"); 19 BigDecimal d=(BigDecimal) result.get("d"); 20 // 检查结果 21 assertTrue(c.doubleValue()==3.30); 22 assertTrue(d.doubleValue()==2.42); 23}
<a name="GOsQK"></a>
小结
本节主要介绍了在 Foxni-SQL 中如何调用数据库的存储过程与函数。存储过程与函数在传参的形式以及接收返回值的形式上有着比较明显的差异。 <a name="VZBg5"></a>
相关项目
https://gitee.com/LeeFJ/foxnic<br /> https://gitee.com/LeeFJ/foxnic-web<br /> https://gitee.com/lank/eam<br /> https://gitee.com/LeeFJ/foxnic-samples<br />
