关于Oracle ADF 11g的VO处理

转载 2015年11月17日 15:44:03
在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的一个非常重要的特点了。

ADF VO排序及VO的三种查询模式(转)

常规应用中,当需要使用Table向终端用户展示数据时,Table中数据的显示排序一致性极大程度的影响到了客户体验。通常希望诸如多次查询结果显示顺序相同、插入数据在原数据上方等的实现。 ADF为开发人...

ADF VO知识

1 获取VO中标签,tip等信息,参考EO知识 2 在VO 执行查询前设置查询参数: 在VO的实现类中override一个方法:          @Override protected...

使用ADF-BC 实现查询功能之四:通过代码动态设置Where条件参数

开发环境:JDevloper 11.1.2.1.0+ Oracle Database 10g Express Edition 10.2.0.1。 在VO上设置Where条件子句并绑定一个参数后,...
  • Beckben
  • Beckben
  • 2014年08月20日 19:20
  • 698

Oracle ADF 11g后台常用方法(2)

1.获取request public HttpServletRequest getHttpRequest() { FacesContext context = FacesCont...
  • zq_00
  • zq_00
  • 2016年06月05日 11:43
  • 588

Oracle ADF faces rich client 11g 开发文档

  • 2009年06月27日 22:24
  • 9.21MB
  • 下载

Oracle_JDeveloper_11g_ADF_Sample学习啦

  • 2012年11月08日 13:39
  • 4.53MB
  • 下载

ADF11g-035: 隐藏panelCollection工具栏上的自带的按钮或菜单

在做ADF开发时,用到table或者tree table的时候,我们经常会在table或者tree table外面加一层标签,方便在table控件上添加一些工具按钮等,似乎客户不太乐意接受自带的一些其...
  • ygj26
  • ygj26
  • 2013年07月31日 11:24
  • 2520

Oracle ADF 11g回车键执行Action JS

  • 2013年05月05日 23:06
  • 257KB
  • 下载

ORACLE_ADF_11g讲解

  • 2012年11月16日 16:01
  • 4.73MB
  • 下载

ADF11g-032: SelectManyShuttle组件的简单使用

介绍 ADF中的多选组件多种多样,有,, ,等,各组件使用起来都大同小异,都以数组来存储选中的值。 selectManyShuttle组件提供了用户的良好体验,本文简单介绍selectManySh...
  • ygj26
  • ygj26
  • 2013年04月19日 10:01
  • 2470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Oracle ADF 11g的VO处理
举报原因:
原因补充:

(最多只允许输入30个字)