最近在写毕设,用到MyBatis,发现里面有个动态SQL的XML判定
但是,这里不是关于MyBatis后台实现的,呵呵,那个有机会再去看看后台实现
翻出去年实习写的一个半成品
需求:
有一系列从Oracle中导出多个txt数据文件,但是新的项目需要的是这几张表中某几个字段的组合,我写了个SQL语句生成器,半成品一直放着没时间完善。即使用XML进行配置,根据配置信息提取对应项的对应值,并过滤,最后组成插入新表的SQL语句
过滤这个环节用到了在XML中配置布尔表达式
例如:[这个是我当时定义的SW代表startsWith EW代表endWith EQ代表equals]
<Filter> <!-- fieldName唯一标识一个字段 --> <reserver value="("/> <field fieldName="BRH_ID" operation="SW" value="50"/> <reserver value="and"/> <field fieldName="BRH_ID" operation="EW" value="901"/> <reserver value=") or"/> <field fieldName="BRH_ID" operation="EQ" value="99999999"/> </Filter>
因为数据量是十分大的
我实现的思想是
1.根据配置文件信息生成布尔表达式组合
2.写一个解析判定组合true/false的算法
3.一个组合字符串对应一个布尔值
在文件输入时,根据判定拿到每个配置项的true/false
找到这种组合下是否通过过滤
通过,数据放入,否则,数据丢弃
首先,生成布尔情况组合
需求:输入XML中配置布尔判定的个数
输出:布尔组合
例如,输入2
输出 00
01
10
11
实现思想,
循环整数[0-pow(2,i)) 左闭右开 i为个数,例如输入2,有两个布尔
则循环 0 1 2 3
四个数的二进制组合刚好对应
00
01
10
11
以下是代码:
package filter; /** * 布尔组合生成器 * * @author ken * */ public class StatementConstructor { /** * 生成长度为i的所有boolean组合数组,存储于String二维数组中 * @param i 存在boolean * @return */ public static String[][] getAll(int i) { int row = new Double(Math.pow(2, i)).intValue(); String[][] result = new String[row][i]; for (int j = 0; j < row; j++) { //System.out.println( j+" "+fillWith(Integer.toBinaryString(j), '0', i) ); result[j] = toStringArray(fillWith(Integer.toBinaryString(j), '0', i).toCharArray()); } return result; } /** * 将字符数组转为字符串数组 * @param array * @return */ private static String[] toStringArray(char[] array) { String[] str = new String[array.length]; for (int i = 0; i < array.length; i++) { str[i] = array[i]+""; } return str; } /** * 长度补足为length,补足前面补相应个字符c * @param value 原来字符串 * @param c 填充字符 * @param length 目标字符串长度 * @return */ private static String fillWith(String value,char c,int length) { StringBuffer str = new StringBuffer(value); int valueLength = str.length(); for (int i = 0; i < length-valueLength; i++) { str.insert(0, c); } return str.toString(); } public static void main(String[] args) { //System.out.println(Integer.toBinaryString(2)); String[][] result = StatementConstructor.getAll(4); for (int i = 0; i < result.length; i++) { //System.out.println(result[i]); for (int j = 0; j < result[i].length; j++) { System.out.print(result[i][j]+" "); } System.out.println(); } } }
好了
生成各种组合之后,我们接下来需要写一个计算布尔表达式最终结果的算法
下一篇整理出来
本文介绍了一种使用XML配置文件来定义过滤条件的方法,通过生成布尔表达式的各种组合来筛选从Oracle导出的数据。文章详细展示了如何利用Java编程语言实现这一过程,包括生成所有可能的布尔组合。
1418

被折叠的 条评论
为什么被折叠?



