`
weilJava
  • 浏览: 68990 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

拼装getTotalCount的sql

阅读更多
v1.3

package testsql;

/**
 * Created by dinghw on 2015/5/4.
 *
 * @desc 优化了第一版包含group by查询效率低的问题
 * 此类只支持特定的场景使用,
 * 并且存在写法上的要求:group by 后的参数必须不能存在空格,并且最后一个参数后需要保留一个空格,
 * 例:group by t.app_id,t.channel_id  (channel_id后必须得有空格)
 * <p/>
 * v1.3 修复group by  后面存在order by时sql拼接错误
 * 修复两层select查询 sql拼接错误
 */
public class SqlUtil {
    private static final String SELECT = "SELECT ";
    private static final String FROM = " FROM ";
    private static final String WHERE = " WHERE ";
    private static final String GROUP = " GROUP BY ";
    private static final String ORDER = " ORDER BY ";
    private static final String AS = "\\) AS ";

    public static StringBuffer getCountSql(String sql) throws Exception {
        StringBuffer countSql = new StringBuffer();
        sql = sql.replaceAll(FROM, " from ").replaceAll(GROUP, " group by ").replaceAll(WHERE, " where ").replaceAll(ORDER, " order by ").replaceAll(AS, ") as ");
        int indexFrom = sql.indexOf(" from ");
        if (indexFrom > 0) {
            //判断有几层from,并获取内层的sql
            sql = getInnerFrom(sql);
            indexFrom = sql.indexOf(" from ");
            int indexGroupBy = sql.indexOf(" group by ");
            if (indexGroupBy > 0) {
                countSql.append("select count(distinct ");
                countSql.append(getDistinctParameter(sql));
                countSql.append(") num");
                countSql.append(" from ").append(sql.substring(indexFrom + 6, indexGroupBy));
            } else {
                countSql.append("select count(*) num ");
                countSql.append(sql.substring(sql.indexOf(" from ")));
            }
        } else {
            throw new Exception("error sql");
        }
        System.out.println("getTotalCount sql:" + countSql.toString());
        return countSql;
    }

    private static String getInnerFrom(String sql) {
        int indexFrom = sql.indexOf(" from ");
        int lastFrom = sql.lastIndexOf(" from ");
        if (indexFrom < lastFrom) {
            sql = sql.substring(lastFrom, sql.indexOf(") as "));
        }
        return sql;
    }

    private static String getDistinctParameter(String sql) {
        int indexGroupBy = sql.indexOf(" group by ");
        int indexIterator = sql.indexOf(" ", indexGroupBy + 10);
        return sql.substring(indexGroupBy + 10, indexIterator);
    }

}
分享到:
评论

相关推荐

    SQL语句拼装工具V2

    写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。 跟前一版本比较,增加了前缀和空格位置的自定义,并增加了一个配置文件,保存自定义项 例如将 select a, b, c from abc where a like('3') ...

    易语言SQL拼装1.1 链式编程, 拼装SQL方法

    于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库。制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...

    SQL语句拼装工具

    写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。例如将 select a, b, c from abc where a like('3') 转换为: sql.append("select "); sql.append(" a, "); sql.append(" b, "); sql.append...

    hibernate实现动态SQL查询

    hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL

    泛型封装的sql语句

    灵活的运用范型对sql语句进行拼装,达到简洁sql语句的作用,让繁琐的sql语句见鬼去吧

    仿valuelist式动态sql拼装

    NULL 博文链接:https://relive123-yahoo-com-cn.iteye.com/blog/848414

    分离valuelist的sql拼装

    NULL 博文链接:https://c297186864.iteye.com/blog/1977611

    易语言-易语言SQL拼装1.1 链式编程, 拼装SQL方法

    于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库 制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...

    MySQL查询把多列返回结果集拼装成一个字段

    使用场景 mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级...执行的SQL如下 SELECT template.temple

    Mybatis-04 动态SQL

    2. where标签查询时如果某些条件没带可能导致SQL拼装有问题,比如多出一个and 3. Trim标签 4. choose标签:分支选择,只会进入其中一个 5. set标签:封装修改条件 6. foreach标签:遍历集合 7. foreach标签:批量...

    Oracle实现动态SQL的拼装要领

    主要介绍了Oracle实现动态SQL的拼装要领,对于Oracle的进一步学习来说非常重要,需要的朋友可以参考下

    钢网架结构拼装工程交底记录.doc

    钢网架结构拼装工程交底记录.doc

    基于java的企业级应用开发:动态SQL.ppt

    8.1 动态SQL中的元素 开发人员在使用JDBC或其他类似的框架进行数据库开发时,通常都要根据需求去手动拼装SQL,这是一个非常麻烦且痛苦的工作,而MyBatis提供的对SQL语句动态组装的功能,恰能很好的解决这一麻烦工作...

    Java如何使用Query动态拼接SQL详解

    主要给大家介绍了关于Java如何使用Query动态拼接SQL的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    盾构管片拼装机举升机构优化设计

    分析了管片拼装机垂直升降油缸举升机构和平行四边形举升机构的异同,得出采用平行四边形举升机构在空间的布置以及结构性能方面都优于采用垂直升降油缸举升机构。通过对管片拼装机的平行四边形举升机构进行建模分析,并...

    小颗粒积木拼装积木图纸免费电子说明书7款

    小颗粒积木拼装积木图纸免费电子说明书7款

    SQL拼装1.1 链式编程-易语言

    于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库 制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...

    Solidworks优化液压支架焊接拼装工艺

    在制作焊接工艺的过程中,利用Solidworks的三维建模功能,模拟复杂大型焊件的拼装过程。进而检测拼装过程中存在的问题:各个零件的焊缝是否干涉、焊缝的焊接位置、焊接的难易程度,最后合理地安排焊接顺序、焊接位置,...

Global site tag (gtag.js) - Google Analytics