4.???BM??

2012-01-05 13:40:52by SeaCat

自定义BM操作

用自定义SQL实现CRUD操作

对于复杂的业务场景,框架自动创建的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
      1. [email protected] 留言于:2017年06月06日 13:19
        好东西。
      发表评论