在做数据库统计分析开发过程中,我们经常会碰到复杂条件组合查询的问题,其特点是:检索字段是固定(就是显示结果集的字段),但查询的条件是多变的,体现在各个字段的条件任意自由组合。如果为每一次组合情况编写一个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-->