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没有自带的”根据某标识“切割字符串的函数,所以我们要自己建立。
View Code
学了好几天,由于项目需要,忙活了两天,写出了个小组件,不过现在还只能支持单表操作。也没考虑算法上的优化,查询速度要比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
相关文章推荐
- 高效多表分页存储过程,可支持多表查询,任意排序
- 分页存储过程,可将查询条件作为参数传递的分页查询存储过程
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- [MSSQL]千万数量级分页存储过程,可支持多表查询,任意排序(来自百度文库)
- 多表查询千万数量级分页存储过程,可支持多表查询,任意排序
- 千万数量级分页存储过程2(可支持多表查询,任意排序)
- 分页存储过程,可将查询条件作为参数传递的分页查询存储过程
- 支持任意字段排序及多表关联查询的存储过程分页
- SQL分页存储过程(不支持多表联合查询,不支持多字段排序)
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- 千万数量级分页存储过程,可支持多表查询,任意排序
- 折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)
- Oracle多条件查询分页存储过程
- 千万数量级分页存储过程(可支持多表查询,任意排序)
- [MSSQL]千万数量级分页存储过程,可支持多表查询,任意排序(来自百度文库)
- 专用于SqlServer2005的高效分页存储过程(支持多字段任意排序,不要求排序字段唯一)
- 带排序的oracle分页存储过程
- 带排序的oracle分页存储过程
- 分页存储过程,可支持多表查询[转]