关于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的一个非常重要的特点了。
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 clob 存储大于4000字符的字符串
- Oracle外键级联删除和级联更新
- Oracle 中 decode 函数用法
- oracle中判断"非"
- Linux 下Oracle 手工create database 脚本和步骤
- Java笔记oracle--SQL基础篇(一)
- 查看及修改Oracle编码格式方法
- Oracle使用DBSTART开机启动
- Oracle 常用命令
- Oracle中执行update语句时卡住的解决方法
- oracle中in和exists区别
- oracle用户创建及权限设置
- Oracle中的COALESCE,NVL,NVL2,NULLIF函数
- 在线迁移oracle数据文件 20
- oracle In和exists对比
- .net导入Oracle数据优化小记
- Oracle的取整函数
- Oracle SQL性能优化
- ORACLE ROWNUM详解
- oracle统计sql