Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 359|回复: 0

[JDBC学习]利用正则表达式解析单句SQL的类

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:17:25 | 显示全部楼层 |阅读模式
    先看要解析的样例SQL语句:

       
         
        select
         
        *
         
        from
         dual

        SELECT
         
        *
         
        frOm
         dual

        Select
         C1,c2
        From
         tb

        select
         c1,c2
        from
         tb

        select
         
        count
        (
        *
        )
        from
         t1

        select
         c1,c2,c3
        from
         t1
        where
         condi1
        =
        1
         

        Select
         c1,c2,c3
        From
         t1
        Where
         condi1
        =
        1
         

        select
         c1,c2,c3
        from
         t1,t2
        where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        order
          
        by
         o1,o2

        Select
         c1,c2,c3
        from
         t1,t2
        Where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        Order
          
        by
         o1,o2

        select
         c1,c2,c3
        from
         t1,t2,t3
        where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        group
          
        by
         g1,g2

        Select
         c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2

        Select
         c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2,g3
        order
          
        by
         g2,g3

       
    解析效果之一(isSingleLine=false):

       
         
        原SQL为select
        *
         
        from
         dual
    解析后的SQL为

        select
       
          
        *
          

        from
       
          dual

    原SQL为SELECT
        *
         
        frOm
         dual
    解析后的SQL为

        select
       
          
        *
          

        from
       
          dual

    原SQL为Select C1,c2
        From
         tb
    解析后的SQL为

        select
       
          C1,c2  

        from
       
          tb

    原SQL为select c1,c2
        from
         tb
    解析后的SQL为

        select
       
          c1,c2  

        from
       
          tb

    原SQL为select
        count
        (
        *
        )
        from
         t1
    解析后的SQL为

        select
       
          
        count
        (
        *
        )  

        from
       
          t1

    原SQL为select c1,c2,c3
        from
         t1
        where
         condi1
        =
        1
       
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1  

        where
       
          condi1
        =
        1
       

    原SQL为Select c1,c2,c3
        From
         t1
        Where
         condi1
        =
        1
       
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1  

        where
       
          condi1
        =
        1
       

    原SQL为select c1,c2,c3
        from
         t1,t2
        where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        order
          
        by
         o1,o2
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1,t2  

        where
       
          condi3
        =
        3
         
        or
         condi4
        =
        5
          

        order
         
        by
       
          o1,o2

    原SQL为Select c1,c2,c3
        from
         t1,t2
        Where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        Order
          
        by
         o1,o2
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1,t2  

        where
       
          condi3
        =
        3
         
        or
         condi4
        =
        5
          

        order
         
        by
       
          o1,o2

    原SQL为select c1,c2,c3
        from
         t1,t2,t3
        where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        group
          
        by
         g1,g2
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1,t2,t3  

        where
       
          condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
          

        group
         
        by
       
          g1,g2

    原SQL为Select c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1,t2,t3  

        where
       
          condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
          

        group
         
        by
       
          g1,g2

    原SQL为Select c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2,g3
        order
          
        by
         g2,g3
    解析后的SQL为

        select
       
          c1,c2,c3  

        from
       
          t1,t2,t3  

        where
       
          condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
          

        group
         
        by
       
          g1,g2,g3  

        order
         
        by
       
          g2,g3


       
    解析效果之二(isSingleLine=true):

       
         
        原SQL为select
        *
         
        from
         dual
    解析后的SQL为

        select
       
          
        *
          

        from
       
          dual

    原SQL为SELECT
        *
         
        frOm
         dual
    解析后的SQL为

        select
       
          
        *
          

        from
       
          dual

    原SQL为Select C1,c2
        From
         tb
    解析后的SQL为

        select
       
          C1,
          c2  

        from
       
          tb

    原SQL为select c1,c2
        from
         tb
    解析后的SQL为

        select
       
          c1,
          c2  

        from
       
          tb

    原SQL为select
        count
        (
        *
        )
        from
         t1
    解析后的SQL为

        select
       
          
        count
        (
        *
        )  

        from
       
          t1

    原SQL为select c1,c2,c3
        from
         t1
        where
         condi1
        =
        1
       
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1  

        where
       
          condi1
        =
        1
       

    原SQL为Select c1,c2,c3
        From
         t1
        Where
         condi1
        =
        1
       
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1  

        where
       
          condi1
        =
        1
       

    原SQL为select c1,c2,c3
        from
         t1,t2
        where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        order
          
        by
         o1,o2
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1,
          t2  

        where
       
          condi3
        =
        3
         
        or
       
           condi4
        =
        5
          

        order
         
        by
       
          o1,
          o2

    原SQL为Select c1,c2,c3
        from
         t1,t2
        Where
         condi3
        =
        3
         
        or
         condi4
        =
        5
         
        Order
          
        by
         o1,o2
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1,
          t2  

        where
       
          condi3
        =
        3
         
        or
       
           condi4
        =
        5
          

        order
         
        by
       
          o1,
          o2

    原SQL为select c1,c2,c3
        from
         t1,t2,t3
        where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        group
          
        by
         g1,g2
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1,
          t2,
          t3  

        where
       
          condi1
        =
        5
         
        and
       
           condi6
        =
        6
         
        or
       
           condi7
        =
        7
          

        group
         
        by
       
          g1,
          g2

    原SQL为Select c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1,
          t2,
          t3  

        where
       
          condi1
        =
        5
         
        and
       
           condi6
        =
        6
         
        or
       
           condi7
        =
        7
          

        group
         
        by
       
          g1,
          g2

    原SQL为Select c1,c2,c3
        From
         t1,t2,t3
        Where
         condi1
        =
        5
         
        and
         condi6
        =
        6
         
        or
         condi7
        =
        7
         
        Group
          
        by
         g1,g2,g3
        order
          
        by
         g2,g3
    解析后的SQL为

        select
       
          c1,
          c2,
          c3  

        from
       
          t1,
          t2,
          t3  

        where
       
          condi1
        =
        5
         
        and
       
           condi6
        =
        6
         
        or
       
           condi7
        =
        7
          

        group
         
        by
       
          g1,
          g2,
          g3  

        order
         
        by
       
          g2,
          g3


       
    使用的类SqlParser,你可以拷贝下来使用之:

       
         
        package
         com.sitinspring.common.sqlFormatter;


        import
         java.util.ArrayList;

        import
         java.util.List;

        import
         java.util.regex.Matcher;

        import
         java.util.regex.Pattern;


        /**
       
      * SQL语句解析器类
      *
        @author
        : sitinspring(junglesong@gmail.com)
      * @date: 2008-3-12
      
        */
       

        public
         
        class
         SqlParser{
         
        /**
       
          * 逗号
          
        */
       
         
        private
         
        static
         
        final
         String Comma
        =
         
        "
        ,
        "
        ;
         
         
        /**
       
          * 四个空格
          
        */
       
         
        private
         
        static
         
        final
         String FourSpace
        =
         
        "
            
        "
        ;
         
         
        /**
       
          * 是否单行显示字段,表,条件的标识量
          
        */
       
         
        private
         
        static
         
        boolean
         isSingleLine
        =
        true
        ;
         
         
        /**
       
          * 待解析的SQL语句
          
        */
       
         
        private
         String sql;
         
         
        /**
       
          * SQL中选择的列
          
        */
       
         
        private
         String cols;
         
         
        /**
       
          * SQL中查找的表
          
        */
       
         
        private
         String tables;
         
         
        /**
       
          * 查找条件
          
        */
       
         
        private
         String conditions;
         
         
        /**
       
          * Group By的字段
          
        */
       
         
        private
         String groupCols;
         
         
        /**
       
          * Order by的字段
          
        */
       
         
        private
         String orderCols;
         
         
        /**
       
          * 构造函数
          * 功能:传入构造函数,解析成字段,表,条件等
          *
        @param
         sql:传入的SQL语句
          
        */
       
         
        public
         SqlParser(String sql){
             
        this
        .sql
        =
        sql.trim();
             
             parseCols();
             parseTables();
             parseConditions();
             parseGroupCols();
             parseOrderCols();
         }
         
         
        /**
       
          * 解析选择的列
          *
          
        */
       
         
        private
         
        void
         parseCols(){
             String regex
        =
        "
        (select)(.+)(from)
        "
        ;   
             cols
        =
        getMatchedString(regex,sql);
         }
         
         
        /**
       
          * 解析选择的表
          *
          
        */
       
         
        private
         
        void
         parseTables(){
             String regex
        =
        ""
        ;   
             
             
        if
        (isContains(sql,
        "
        \s+where\s+
        "
        )){
                 regex
        =
        "
        (from)(.+)(where)
        "
        ;   
             }
             
        else
        {
                 regex
        =
        "
        (from)(.+)($)
        "
        ;   
             }
             
             tables
        =
        getMatchedString(regex,sql);
         }
         
         
        /**
       
          * 解析查找条件
          *
          
        */
       
         
        private
         
        void
         parseConditions(){
             String regex
        =
        ""
        ;   
             
             
        if
        (isContains(sql,
        "
        \s+where\s+
        "
        )){
                
        //
         包括Where,有条件
       

                   
                
        if
        (isContains(sql,
        "
        group\s+by
        "
        )){
                     
        //
         条件在where和group by之间
       

                        regex
        =
        "
        (where)(.+)(group\s+by)
        "
        ;  
                 }
                
        else
         
        if
        (isContains(sql,
        "
        order\s+by
        "
        )){
                     
        //
         条件在where和order by之间
       

                        regex
        =
        "
        (where)(.+)(order\s+by)
        "
        ;  
                 }
                
        else
        {
                     
        //
         条件在where到字符串末尾
       

                        regex
        =
        "
        (where)(.+)($)
        "
        ;  
                 }            
             }
             
        else
        {
                
        //
         不包括where则条件无从谈起,返回即可
       

                   
        return
        ;
             }
             
             conditions
        =
        getMatchedString(regex,sql);
         }
         
         
        /**
       
          * 解析GroupBy的字段
          *
          
        */
       
         
        private
         
        void
         parseGroupCols(){
             String regex
        =
        ""
        ;   
             
             
        if
        (isContains(sql,
        "
        group\s+by
        "
        )){
                
        //
         包括GroupBy,有分组字段
       

       
                
        if
        (isContains(sql,
        "
        order\s+by
        "
        )){
                     
        //
         group by 后有order by
       

                        regex
        =
        "
        (group\s+by)(.+)(order\s+by)
        "
        ;  
                 }
                
        else
        {
                     
        //
         group by 后无order by
       

                        regex
        =
        "
        (group\s+by)(.+)($)
        "
        ;  
                 }           
             }
             
        else
        {
                
        //
         不包括GroupBy则分组字段无从谈起,返回即可
       

                   
        return
        ;
             }
             
             groupCols
        =
        getMatchedString(regex,sql);
         }
         
         
        /**
       
          * 解析OrderBy的字段
          *
          
        */
       
         
        private
         
        void
         parseOrderCols(){
             String regex
        =
        ""
        ;   
             
             
        if
        (isContains(sql,
        "
        order\s+by
        "
        )){
                
        //
         包括GroupBy,有分组字段
       

                    regex
        =
        "
        (order\s+by)(.+)($)
        "
        ;                           
             }
             
        else
        {
                
        //
         不包括GroupBy则分组字段无从谈起,返回即可
       

                   
        return
        ;
             }
                
             orderCols
        =
        getMatchedString(regex,sql);
         }
         
         
         
        /**
       
          * 从文本text中找到regex首次匹配的字符串,不区分大小写
          *
        @param
         regex: 正则表达式
          *
        @param
         text:欲查找的字符串
          *
        @return
         regex首次匹配的字符串,如未匹配返回空
          
        */
       
         
        private
         
        static
         String getMatchedString(String regex,String text){
             Pattern pattern
        =
        Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
             
             Matcher matcher
        =
        pattern.matcher(text);
      
             
        while
        (matcher.find()){
                
        return
         matcher.group(
        2
        );
             }
             
             
        return
         
        null
        ;
         }
         
         
        /**
       
          * 看word是否在lineText中存在,支持正则表达式
          *
        @param
         lineText
          *
        @param
         word
          *
        @return
       
          
        */
       
         
        private
         
        static
         
        boolean
         isContains(String lineText,String word){
             Pattern pattern
        =
        Pattern.compile(word,Pattern.CASE_INSENSITIVE);
             Matcher matcher
        =
        pattern.matcher(lineText);
             
        return
         matcher.find();
         }
         
         
         
        public
         String toString(){        
             
        //
         无法解析则原样返回
       

                
        if
        (cols
        ==
        null
         
        &&
         tables
        ==
        null
         
        &&
         conditions
        ==
        null
         
        &&
         groupCols
        ==
        null
         
        &&
         orderCols
        ==
        null
         ){
                
        return
         sql;
             }
             
             StringBuffer sb
        =
        new
         StringBuffer();
             sb.append(
        "
        原SQL为
        "
        +
        sql
        +
        "
       

        "
        );
             sb.append(
        "
        解析后的SQL为

        "
        );
             
             
             
        for
        (String str:getParsedSqlList()){
                 sb.append(str);
             }
             
             sb.append(
        "
       

        "
        );
             
             
        return
         sb.toString();
         }
         
         
        /**
       
          * 在分隔符后加上回车
          *
        @param
         str
          *
        @param
         splitStr
          *
        @return
       
          
        */
       
         
        private
         
        static
         String getAddEnterStr(String str,String splitStr){
             Pattern p
        =
         Pattern.compile(splitStr,Pattern.CASE_INSENSITIVE);

             
        //
         用Pattern类的matcher()方法生成一个Matcher对象
       

                Matcher m
        =
         p.matcher(str);
             StringBuffer sb
        =
         
        new
         StringBuffer();

             
        //
         使用find()方法查找第一个匹配的对象
       

                
        boolean
         result
        =
         m.find();

             
        //
         使用循环找出模式匹配的内容替换之,再将内容加到sb里
       

                
        while
         (result) {
                 m.appendReplacement(sb, m.group(
        0
        )
        +
         
        "
       
         
        "
        );
                 result
        =
         m.find();
             }
             
        //
         最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
       

                m.appendTail(sb);
             
             
        return
         FourSpace
        +
        sb.toString();
         }
         
         
        /**
       
          * 取得解析的SQL字符串列表
          *
        @return
       
          
        */
       
         
        public
         List
        <
        String
        >
         getParsedSqlList(){
             List
        <
        String
        >
         sqlList
        =
        new
         ArrayList
        <
        String
        >
        ();
             
             
        //
         无法解析则原样返回
       

                
        if
        (cols
        ==
        null
         
        &&
         tables
        ==
        null
         
        &&
         conditions
        ==
        null
         
        &&
         groupCols
        ==
        null
         
        &&
         orderCols
        ==
        null
         ){
                 sqlList.add(sql);
                
        return
         sqlList;
             }
             
             
        if
        (cols
        !=
        null
        ){
                 sqlList.add(
        "
        select

        "
        );
                
        if
        (isSingleLine){
                     sqlList.add(getAddEnterStr(cols,Comma));
                 }
                
        else
        {
                     sqlList.add(FourSpace
        +
        cols);
                 }
             }
             
             
        if
        (tables
        !=
        null
        ){
                 sqlList.add(
        "
         
    from

        "
        );

                
        if
        (isSingleLine){
                     sqlList.add(getAddEnterStr(tables,Comma));
                 }
                
        else
        {
                     sqlList.add(FourSpace
        +
        tables);
                 }
             }
             
             
        if
        (conditions
        !=
        null
        ){
                 sqlList.add(
        "
         
    where

        "
        );

                
        if
        (isSingleLine){
                     sqlList.add(getAddEnterStr(conditions,
        "
        (and|or)
        "
        ));
                 }
                
        else
        {
                     sqlList.add(FourSpace
        +
        conditions);
                 }
             }
             
             
        if
        (groupCols
        !=
        null
        ){
                 sqlList.add(
        "
         
    group by

        "
        );

                
        if
        (isSingleLine){
                     sqlList.add(getAddEnterStr(groupCols,Comma));
                 }
                
        else
        {
                     sqlList.add(FourSpace
        +
        groupCols);
                 }
             }
             
             
        if
        (orderCols
        !=
        null
        ){
                 sqlList.add(
        "
         
    order by

        "
        );

                
        if
        (isSingleLine){
                     sqlList.add(getAddEnterStr(orderCols,Comma));
                 }
                
        else
        {
                     sqlList.add(FourSpace
        +
        orderCols);
                 }
             }
             
             
        return
         sqlList;
         }
         
         
        /**
       
          * 设置是否单行显示表,字段,条件等
          *
        @param
         isSingleLine
          
        */
       
         
        public
         
        static
         
        void
         setSingleLine(
        boolean
         isSingleLine) {
             SqlParser.isSingleLine
        =
         isSingleLine;
         }
         
         
        /**
       
          * 测试
          *
        @param
         args
          
        */
       
         
        public
         
        static
         
        void
         main(String[] args){
             List
        <
        String
        >
         ls
        =
        new
         ArrayList
        <
        String
        >
        ();
             ls.add(
        "
        select * from dual
        "
        );   
             ls.add(
        "
        SELECT * frOm dual
        "
        );
             ls.add(
        "
        Select C1,c2 From tb
        "
        );
             ls.add(
        "
        select c1,c2 from tb
        "
        );
             ls.add(
        "
        select count(*) from t1
        "
        );
             ls.add(
        "
        select c1,c2,c3 from t1 where condi1=1
        "
        );
             ls.add(
        "
        Select c1,c2,c3 From t1 Where condi1=1
        "
        );
             ls.add(
        "
        select c1,c2,c3 from t1,t2 where condi3=3 or condi4=5 order   by o1,o2
        "
        );
             ls.add(
        "
        Select c1,c2,c3 from t1,t2 Where condi3=3 or condi4=5 Order   by o1,o2
        "
        );
             ls.add(
        "
        select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 group  by g1,g2
        "
        );
             ls.add(
        "
        Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2
        "
        );
             ls.add(
        "
        Select c1,c2,c3 From t1,t2,t3 Where condi1=5 and condi6=6 or condi7=7 Group  by g1,g2,g3 order  by g2,g3
        "
        );
             
             
        for
        (String sql:ls){
                 System.out.println(
        new
         SqlParser(sql));
                
        //
        System.out.println(sql);
       

                }
         }
    }
       



       
         
         
          
          

            
          

            
          
         
       


      


    源码下载:http://file.javaxxz.com/2014/10/11/051724359.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:17 , Processed in 0.494065 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表