| 4.???BM??2012-01-05 13:40:52by SeaCat 对于复杂的业务场景,框架自动创建的SQL如果不能满足业务需求,可通过自定义SQL的方式来替代标准的SQL。和自定义查询类似,自定义insert,update,delete的SQL语句,也是通过在BM的operations标记下面新建对应名字的operation来实现的。例如: <bm:model xmlns:bm="http://www.aurora-framework.org/schema/bm" needAccessControl="false"> <bm:operations> <bm:operation name="insert"> <bm:parameters> <bm:parameter name="new_name" required="true"/> <bm:parameter name="source_empno" dataType="java.lang.Long" required="true"/> <bm:parameter name="new_empno" dataType="java.lang.Long" output="true" input="false" /> </bm:parameters> <bm:update-sql> declare v_id number; begin select emp_s.nextval into v_id from dual; insert into emp t ( empno, ename, job, mgr, hiredate, sal) select v_id, ${@new_name}, e.job, e.mgr, trunc(sysdate), sal from emp e where empno = ${@source_empno}; ${@new_empno} := v_id; end; </bm:update-sql> </bm:operation> <bm:operation name="delete"> <bm:parameters> <bm:parameter name="emp_id" dataType="java.lang.Long" required="true"/> </bm:parameters> <bm:update-sql> begin emp_maintain_pkg.delete_employee(${@emp_id}); end; </bm:update-sql> </bm:operation> </bm:operations> </bm:model> 在这个BM中,我们在operations部分,分别定义了两个insert,delete两个操作,并通过下面包含的update-sql标记,定义这两个操作各自对应的SQL语句。这样,对该BM执行insert或delete操作时,就会执行对应的自定义SQL语句。 对于自定义操作需要的输入或输出参数,必需通过parameters部分进行定义,如上面的insert操作,定义了名为new_name,source_empno,new_empno三个参数,前两个用于输入,第三个用于输出,获取新创建的emp记录id。 如果参数是直接来自于客户端提交的参数,可以通过name属性来定义参数的名称,否则,需要通过inputPath属性定义参数的XPath路径,如inputPath="/session/@user_id"。 如果是必需的参数,应设置require="true"。如果参数的数据类型不是字符串,这样,如果客户端没有传递该参数,框架会直接返回错误信息,避免产生脏数据的可能。 如果参数的数据类型不是字符串,应通过dataType属性设置实际的数据类型。如果客户端提交的参数格式不正确,框架也会返回错误信息。 如果参数是用于获取SQL语句的输出值,需要设置属性input="false",output="true"。缺省情况下,输出参数放置在数据容器的/parameter/@[参数名]路径。如果希望放置在其他指定的路径,可以通过outputPath属性设置期望的路径,例如outputPath="/session/@role_id"。
在一个BM中,对于不同的操作,自定义SQL可以和框架自动生成的SQL混用。例如,可以定义fields,primary-key和relations,再定义一个名为update的operation,让框架自动生成query,insert的sql,并在执行update操作时使用自定义sql。 调用数据库中的存储过程,实现方式也是一样的,只是对于存储过程,我们约定其operation的名称一般为execute。例如: <bm:model xmlns:bm="http://www.aurora-framework.org/schema/bm"> <bm:operations> <bm:operation name="execute"> <bm:update-sql> begin sys_notify_pkg.update_notify ( ${@notify_id}, ${@description}, ${@message_title}, ${@message_content}, ${@send_method}, ${@send_mode}, ${@delay_time}, ${@delay_time_unit}, ${@content_sql}, ${@msg_send_check_proc}, ${@msg_create_proc}, ${@enabled_flag}, ${/session/@user_id} ); end; </bm:update-sql> <bm:parameters> <bm:parameter name="notify_id"/> <bm:parameter name="description"/> <bm:parameter name="message_title"/> <bm:parameter name="message_content"/> <bm:parameter name="send_method"/> <bm:parameter name="send_mode"/> <bm:parameter name="delay_time"/> <bm:parameter name="delay_time_unit"/> <bm:parameter name="content_sql"/> <bm:parameter name="msg_send_check_proc"/> <bm:parameter name="msg_create_proc"/> <bm:parameter name="enabled_flag"/> <bm:parameter inputpath="/session/@user_id"/> </bm:parameters> </bm:operation> </bm:operations> </bm:model> Demo Attachments |
Comments
1 Responses to the article