`
weilJava
  • 浏览: 70014 次
  • 性别: 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...

    SQL拼接工具包API 支持Oracle/PostgreSQL/MySql

    简化sql拼接过程,提升开发效率,减少拼接错误。 可以拼接select、update、delete语句以及where条件语句。 拼接where条件可自动组织参数并返回。 支持andEq(), andGt(), andGe(),andLt(), andLe(), andEqDate(), ...

    hibernate实现动态SQL查询

    本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...

    仿valuelist式动态sql拼装

    标题“仿valuelist式动态sql拼装”指的是在编程中实现类似MyBatis的`&lt;foreach&gt;`标签功能,用于动态地拼接SQL语句,尤其是处理列表参数时的插入、更新或查询操作。这种技术常见于Java后端开发,尤其是在使用ORM(对象...

    分离valuelist的sql拼装

    本话题聚焦于“分离valuelist的SQL拼装”,这是一个常见的编程需求,尤其是在处理批量数据插入、更新或者查询时。在描述中提到的博文链接已经失效,无法直接获取详细内容,但我们可以根据这个主题进行深入的探讨。 ...

    SQL语句拼接工具,简化SQL语句拼写代码

    在IT行业中,SQL(Structured Query Language)是用于管理和操作关系型数据库的标准编程语言。随着数据库应用的日益复杂,编写和管理SQL语句变得越来越繁琐,尤其是在处理动态查询时,需要根据用户输入或业务条件...

    详解MyBatis直接执行SQL查询及数据批量插入

    MyBatis是一个强大的持久层框架,它允许开发者直接编写SQL语句,简化了数据库操作。在本文中,我们将深入探讨如何使用MyBatis直接执行SQL查询以及如何进行数据的批量插入。 **一、直接执行SQL查询** 在MyBatis中,...

    SqlUtils工具类,Sql IN 条件拼接工具类

    `SqlUtils`工具类是Java开发中用于处理SQL语句拼接的一个实用工具,特别是针对包含`IN`条件的查询。在数据库操作中,`IN`关键字常用于筛选满足特定集合条件的记录。例如,假设我们需要查找ID在一组值中的用户,我们...

    SQL组装工具类,轻松应对复杂查询条件的组装

    SQL组装复杂查询条件,SELECT .. FROM .. (LEFT|RIGHT|INNER) JOIN .. ON .. WHERE .... GROUP BY .. HAVING .. ORDER BY .. LIMIT ..

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,允许开发者通过Java对象来操作数据库,减少了对SQL的直接使用。 标题中的"spring+hibernate"表明这是一个将两者结合使用的项目。Spring和...

    Oracle实现动态SQL的拼装要领

    动态SQL的拼装是数据库编程中不可或缺的一部分,特别是在需要根据运行时条件构建SQL语句时。以下是对Oracle实现动态SQL拼装要领的详细说明: 1. **目标明确**: 在开始拼装SQL之前,首先明确最终要生成的SQL语句...

    泛型封装的sql语句

    本文将深入探讨如何利用泛型来实现灵活的SQL语句拼装,以实现“泛型封装的SQL语句”。 首先,我们要理解泛型的概念。泛型是.NET框架中的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而创建可以应用...

    TBM后配套管片拼装机建模及分析

    TBM后配套管片拼装机是一种用于隧道掘进机械(Tunnel Boring Machine, TBM)的配套设备,它主要用于隧道施工中管片的自动拼装。管片是隧道衬砌的重要组成部分,拼装机能够将预制的管片按照设计要求拼装成环状,以...

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

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

    Mybatis-04 动态SQL

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

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

    Java如何使用Query动态拼接SQL详解 Java动态拼接SQL是指在Java中使用Query语言来动态地构建和执行SQL语句,从而实现灵活的数据查询和处理。下面是关于Java如何使用Query动态拼接SQL的详细知识点: 1. 动态拼接SQL...

Global site tag (gtag.js) - Google Analytics