您的位置:首页 > 数据库 > Oracle

关于Oracle ADF 11g的VO处理

2015-11-17 15:44 639 查看
在ADF框架中,绑定毫无疑问是最重要的特征之一,而ADF BC则是非常好的体现了绑定的好处。在Model层,尽可能的使用ADF BC来和底层DB进行交互也就成了ADF的一种非常高效的开发模式了。也就是使用AM(Application Model),VO(View Object),EO(Entity
Object)。

对于AM和VO,EO的关系很多资料都有讲述,这里主要总结下通过VO来和DB交互的几种方法。

第一,Insert Row。如果要把一行记录真正insert到底层DB中,那么这个VO可以是基于EO创建也可以是基于SQL创建的。基于EO创建的容易理解,但是为什么说也可以基于SQL创建呢,那是因为可以在SQL中可以把EO当做Table来使用,保证要Insert的字段是EO的属性那这些字段就能和DB真正交互了。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();

DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器

ViewObject vo = iter.getViewObject();//获取VO

TestEmpVORowImpl row = (TestEmpVORowImpl)vo.createRow();//获取VO的行

row.setEmpId("123");

row.setEmpCd("");

vo.insertRow(row);

am.getTransaction().commit(); //Transaction commit

第二,Delete Row。如果需要删除一行记录,获取VO的绑定,remove获取到的行就行了。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO
TestEmpVORowImpl row = (TestEmpVORowImpl)vo.getCurrentRow();
row.remove();
am.getTransaction().commit();

第三,Select Row。对于VO中记录的查询用的可能是最多的了,查询的VO一般有四种做法,对应的操作VO的语句也有四种类型了。(要注意VO参数的绑定值的清空。)
1.VO中没有与查询条件相关的where子句。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO

vo.setWhereClause(null);
vo.setWhereClauseParams(null);
vo.setWhereClause("EmpId like :empId");
vo.defineNamedWhereClauseParam("empId", null, null);
vo.setNamedWhereClauseParam("empId", String.valueOf(this.getEmpId().getValue()));
vo.executeQuery();
//清空where子句
vo.setWhereClauseParams(null);
vo.setWhereClause(null);

2.VO中有与查询条件相关的where子句。(例如:VO的SQL中EmpId = :varEmpId)

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO

vo.setNamedWhereClauseParam(“varEmpId”, String.valueOf(this.getEmpId().getValue()));
vo.executeQuery();
vo.setNamedWhereClauseParam("varEmpId", null);

3.VO中没有与查询条件相关的where子句,但是设置了查询基准Criteria,并创建一临时变量VarEmpId
与这个基准中的变量绑定。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO

vo.setAttribute("VarEmpId", String.valueOf(this.getEmpId().getValue()));
vo.executeQuery();

4.VO中没有与查询条件相关的where子句,也没有设置基准Criteria。如果不用上面的第一种方式的话,也可以用代码来添加基准。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO

ViewCriteria vc = vo.createViewCriteria();
ViewCriteriaRow vcr = vc.createViewCriteriaRow();
vcr.setAttribute("EmpId", " like " + String.valueOf(this.getEmpId().getValue()));
vc.add(vcr);
vo.applyViewCriteria(vc);
vo.executeQuery();

第四,Update Row。要更新VO中某条记录的字段,可以有两种方式:
1.将选择的当前行的字段显示到页面的控件中,然后直接改变这个空间中的值,再执行更新这个VO的attribute的方法。

DCBindingContainer dc = (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
DCIteratorBinding iter = dc.findIteratorBinding("TestEmpVOIterator");//获取VO的迭代器
ViewObject vo = iter.getViewObject();//获取VO

TestEmpVORowImpl row = (TestEmpVORowImpl)vo.getCurrentRow();
row.setEmpId(String.valueOf(this.getEmpId().getValue()));
am.getTransaction().commit();
2.可以将VO拖放在页面中显示为普通的table(如果是普通的table就可以将VO的字段显示为可输入的,如果是读取专用的table那VO的字段都只能是可显示的了)。将需要更新的字段改为可入力的控件就OK了。然后只需从dataController中拖Commit操作出来,使用这个Commit操作自带的方法就能搞定了。

绑定的使用时非常灵活的,我在这里举出来的并不是全部操作VO的方法,比如对于查询来说还有用VO的Execute with parameter的操作的,也是非常方便,代码量非常少。而且并不一定是拖放到页面上的VO才能够用上面的方法来操作,其实没有拖放的利用绑定也能够正常操作的,所以绑定也就成了ADF的一个非常重要的特点了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: