在做数据库统计分析开发过程中,我们经常会碰到复杂条件组合查询的问题,其特点是:检索字段是固定(就是显示结果集的字段),但查询的条件是多变的,体现在各个字段的条件任意自由组合。如果为每一次组合情况编写一个SQL查询语句的话,显然是一件费时费力的乏味活。BJAF框架为了解决这样一个问题,实现了一个复杂条件组合查询器CompositeQueryOperator。它支持查询条件的任意组合,动态构建SQL语句,让你乏味而啰嗦的复杂条件查询开发过程解脱出来。
CompositeQueryOperator的类图如下:
从图可见,CompositeQueryOperator继承自QueryOperator查询器,所以它使用方式基本上与QueryOperator保持一致。它只是多了一个addParameter方法来构建各种组合的条件。示例如下:
以图2-6的EMP表为例,从图可知表EMP的字段有(EMPNO、ENAME、JOB、MGR、 HIREDATE、SAL、COMM 和DEPTNO)假设需要按以上各个字段自由组合来查询EMP表的数据。
典型的条件组合界面类似下图所示:
如果按照传统作法,对上面的每种组合编写一个SQL语句,显然会脑瘫的:-),复杂组合查询器CompositeQueryOperator的引入,只要下面简单代码即可解决问题:
package test.persistence; import java.math.BigDecimal; import java.sql.Timestamp; import com.beetle.framework.persistence.access.operator.RsDataSet; import com.beetle.framework.persistence.composite.CompositeQueryOperator; public class TestSQL { public static void main(String[] args) { String EMPNO = null;// 设置参数(从页面获取输入参数) String ENAME = null; String JOB = null; BigDecimal MGR = null; Timestamp HIREDATE = null; BigDecimal SAL_1 = null; BigDecimal SAL_2 = null; BigDecimal COMM = null; BigDecimal DEPTNO = null; CompositeQueryOperator cqo = new CompositeQueryOperator(); cqo.setDataSourceName("SYSDATASOURCE_DEFAULT");// 数据数据源 cqo.setSql("select * from emp");// 数据查询语句(只填显示字段select部分,无需写where子句) cqo.addParameter("EMPNO", "=", EMPNO);// 添加各种组合条件字段 cqo.addParameter("ENAME", "=", ENAME); cqo.addParameter("JOB", "=", JOB); cqo.addParameter("MGR", "=", MGR); cqo.addParameter("HIREDATE", ">", HIREDATE); cqo.addParameter("SAL", ">=", SAL_1); cqo.addParameter("SAL", "<=", SAL_2); cqo.addParameter("COMM", "=", COMM); cqo.addParameter("DEPTNO", "=", DEPTNO); cqo.access();// 执行查询 if (cqo.resultSetAvailable()) {// 处理结果,处理结果请参考QueryOperator,这里只是打印出来 RsDataSet rs = new RsDataSet(cqo.getSqlResultSet()); for (int i = 0; i < rs.rowCount; i++) { for (int j = 0; j < rs.colCount; j++) { System.out.println(rs.getFieldValue(j)); } rs.next(); System.out.println("--"); } } } }
可见,一切变得很简单。
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->
值得注意的是,当某个条件参数不参与检索查询,则此参数应设置为null而不是空字符””,当然,你也可以把这个参数注释掉。
<!--EndFragment--> <!--EndFragment-->