用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
wallimn的公告
我是一名编程爱好者,写过一些软件,VC、Delphi、Java都会一些,Oracle数据库也懂一点。这几年一直在同这些东西打交道。在此记录一些我编程过程中遇到的问题及解决方法,希望对遇到类似问题的朋友有所帮助。欢迎交流,邮件:wallimn@sohu.com;QQ:54871876 注:这个博客暂时停止维护,重点维护http://wallimn.javaeye.com
文章分类
友情链拉
我的主博客(javaeye)
我的网络硬盘
存档

原创  JAVA正则表达式根据查询SQL自动生成统计SQL 收藏

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn

网络硬盘:http://wallimn.ys168.com
时间:2009-02-05
/***********文章发表请与本人联系,作者保留所有权利*************/


  JAVA的JDBC,对于取出的来结果集好象不能直接取到结果集的数量,要使用一个计数器,不停的next(),一直到结束。这样才得到数量。
  这样的效率对于大量记录而言显然是不能忍受的。显然使用select count(*) from tableName可以获得最好的效率。那么,当有查询语句时,如何能方便、快捷的得到统计语句呢?这个需要在WEB项目上分页显示数据记录的时候用得比较多。

  最近用了几次正则表达式,让我想到一个办法,可以使用正则表达式动态的根据查询SQL语句,自动的将形如select name,sex from tableName的查询SQL语句转换成select count(*) from tableName这样的统计SQL语句。大家知道,正则表达式有查找、替换功能,这正是完成这样任务所需要的。

  做这样一个小任务的时候,先要理解正则表达式的贪心模式(也有叫贪婪模式)与非贪婪模式。
  所谓贪婪模式,就是对于这样的SQL查询语句:
  select name from (select name from tableName)
  当使用正则表达式:(^select)(.*)( from .*) 进行匹配时,中间的(.*)部分,
  在贪心模式下,中间部分会尽可能多的匹配,其结果就是: name from (select name
  在非贪心模式下,中间部分会尽可能少的匹配,其结果就是: name

  显然对于我的小任务而言,需要的是非贪心模式,那么如何让正则表达式切换到非贪心模式下呢?很简单,正则表达式写成这样就可以了:(^select)(.*?)( from .*)。这样就达到了预定的目的。
  完整的java函数如下:
    public String getCountSql(String sql) {
        String regex = "(^select)(.*?)( from .*)";
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(sql);
        boolean rs = m.find();
        if (rs == false || m.groupCount() != 3) {
            return "";
        } else
            return m.group(1) + " count(*) " + m.group(3);
    }


后记
  这个小小的函数,有个BUG,不知大家想到没有,就是处理这样的SQL语句会有问题:
  select (select max(id) from tableName)+1 id, name from tableName,
  这时应该用到括号的匹配来去除干扰,不过正则表达式该怎么写,我还没有想出来,欢迎知道的朋友留言告知。

/***********文章发表请与本人联系,作者保留所有权利*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://blog.csdn.net/wallimn

网络硬盘:http://wallimn.ys168.com
时间:2009-02-05
/***********本人原创,欢迎转载,转载请保留本人信息*************/

发表于 @ 2009年02月05日 13:12:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:自己动手用JAVA编写JSON工具类 | 新一篇:博客转移至:wallimn.javaeye.com,欢迎新老朋友支持

  • 发表评论
  • 评论内容:
  •  
Copyright © wallimn
Powered by CSDN Blog