您的位置:首页 > 数据库 > Oracle

oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件

2014-08-01 15:27 911 查看
【本文介绍】

  学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作。也没考虑算法上的优化,查询速度要比hibernate只快了一点点,可能是不涉及多表查询的缘故吧,多表的情况下才更快。

  经非专业的测试,在有分页的情况下,在300万条数据里面查询的时间保持在0.1秒内。相同查询条件+分页的情况下,hibernate 用时0.3秒内。

  不分页的条件下,查出来的数据越多,时间越长,时间长的话,跟hibernate相相比就没什么优势了。

【思路】

  我的思路是从java传来”字段名,值,排序字段,升降序,分页“等 几个参数,都是字符串。然后在存储过程中 根据 标识符 切割字符串,最后拼接成一个SQL语句。

但也有不少值得改进的地方:

(1)PL/SQL语法的字符串最多只能传4000个字符,所以多于4000个字符的字符串可能会导致查询失败。

(2)日期的排序只能靠的是字符串的排序,所以数据库的日期 要 varchar类型。这样会引起不通用的问题。

(3)比较的符号要约定好,比如查询条件为包含什么什么,即contains,就要发送instr到数据库去拼接SQL语句,因为PL/SQL语言的instr 就相当于contians。这个问题有待改成常量的形式。具体约定如下:

大于:>

小于:<

大于等于:>=

小于等于:<=

不等于:!=

包含:instr

以什么开始:startWith

以什么结尾:endWith

是否为空:isNull

是否不为空:isNotNull

【第一步:在数据库中建立分割函数】

  oracle没有自带的”根据某标识“切割字符串的函数,所以我们要自己建立。

public static void main(String[] args) {
FindByProcedure f = new FindByProcedure();

String tableName = "";
List<String> keyList = new ArrayList<String>();
List<String> conditionList =new ArrayList<String>();;
List<String> valueList =new ArrayList<String>();
List<String> andOrList =new ArrayList<String>();
List<String> orderList =new ArrayList<String>();
List<String> orderSortList =new ArrayList<String>();
tableName = "T_AP_ZA_LYT_GNLK";

// key
keyList.add("ZA_LYT_LKBH");
keyList.add("ZA_LYT_TH");
keyList.add("ZA_LYT_XM");
keyList.add("ZA_LYT_MZ");
keyList.add("ZA_LYT_CSRQ");
keyList.add("ZA_LYT_RKSJ");
keyList.add("ZA_LYT_RKSJ");

// 比较符号
conditionList.add("<");
conditionList.add(">=");
conditionList.add("instr");
conditionList.add("<=");
conditionList.add("startWith");
conditionList.add(">=");
conditionList.add("<=");

// value
valueList.add("4500000000000000500049");
valueList.add("4600000000000000203771");
valueList.add("VA");
valueList.add("10");
valueList.add("F");
valueList.add("2014-12-24-08-29-38");
valueList.add("2014-12-24-21-37-22");

// 连接符
andOrList.add("and");
andOrList.add("and");
andOrList.add("and");
andOrList.add("and");
andOrList.add("and");
andOrList.add("and");
andOrList.add("and");

// 排序字段
orderList.add("ZA_LYT_XM");
orderList.add("ZA_LYT_XMPY");

// 排序顺序
orderSortList.add("ASC");
orderSortList.add("DESC");

List<T_AP_ZA_LYT_GNLK> list = new ArrayList<T_AP_ZA_LYT_GNLK>();

// 连接conn要从外部传进去
f.setConn(DBManager.getConnection());

// 开始调用
list = f.findByPropertList(tableName, keyList, conditionList, valueList, andOrList,orderList,orderSortList,5,1,T_AP_ZA_LYT_GNLK.class);

for(T_AP_ZA_LYT_GNLK o : list) {
System.out.println(o.getZa_lyt_xm());
}

System.out.println("总共拿出数据量:"+list.size());
System.out.println("sql语句:"+f.getSql());
System.out.println("查询用时:"+f.getUseTime().toString()+"s");
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐