关于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的一个非常重要的特点了。

相关文章推荐

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

1.获取request public HttpServletRequest getHttpRequest() { FacesContext context = FacesCont...
  • zq_00
  • zq_00
  • 2016-06-05 11:43
  • 512

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

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

ORACLE_ADF_11g讲解

  • 2012-11-16 16:01
  • 4.73MB
  • 下载

ADF11g:将Application Module中的方法发布为webservice

由于步骤比较简单,这里直接写图文步骤 1.编写AM代码 public class AppModuleImpl extends ApplicationModuleImpl {     /**      ...

Oracle ADF 11g资料大全

  • 2011-08-31 09:29
  • 4.73MB
  • 下载

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

介绍 ADF中的多选组件多种多样,有,, ,等,各组件使用起来都大同小异,都以数组来存储选中的值。 selectManyShuttle组件提供了用户的良好体验,本文简单介绍selectManySh...
  • ygj26
  • ygj26
  • 2013-04-19 10:01
  • 2397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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