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);
}
}
分享到:
相关推荐
写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。 跟前一版本比较,增加了前缀和空格位置的自定义,并增加了一个配置文件,保存自定义项 例如将 select a, b, c from abc where a like('3') ...
于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库。制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在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拼接过程,提升开发效率,减少拼接错误。 可以拼接select、update、delete语句以及where条件语句。 拼接where条件可自动组织参数并返回。 支持andEq(), andGt(), andGe(),andLt(), andLe(), andEqDate(), ...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
标题“仿valuelist式动态sql拼装”指的是在编程中实现类似MyBatis的`<foreach>`标签功能,用于动态地拼接SQL语句,尤其是处理列表参数时的插入、更新或查询操作。这种技术常见于Java后端开发,尤其是在使用ORM(对象...
本话题聚焦于“分离valuelist的SQL拼装”,这是一个常见的编程需求,尤其是在处理批量数据插入、更新或者查询时。在描述中提到的博文链接已经失效,无法直接获取详细内容,但我们可以根据这个主题进行深入的探讨。 ...
在IT行业中,SQL(Structured Query Language)是用于管理和操作关系型数据库的标准编程语言。随着数据库应用的日益复杂,编写和管理SQL语句变得越来越繁琐,尤其是在处理动态查询时,需要根据用户输入或业务条件...
MyBatis是一个强大的持久层框架,它允许开发者直接编写SQL语句,简化了数据库操作。在本文中,我们将深入探讨如何使用MyBatis直接执行SQL查询以及如何进行数据的批量插入。 **一、直接执行SQL查询** 在MyBatis中,...
`SqlUtils`工具类是Java开发中用于处理SQL语句拼接的一个实用工具,特别是针对包含`IN`条件的查询。在数据库操作中,`IN`关键字常用于筛选满足特定集合条件的记录。例如,假设我们需要查找ID在一组值中的用户,我们...
SQL组装复杂查询条件,SELECT .. FROM .. (LEFT|RIGHT|INNER) JOIN .. ON .. WHERE .... GROUP BY .. HAVING .. ORDER BY .. LIMIT ..
而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,允许开发者通过Java对象来操作数据库,减少了对SQL的直接使用。 标题中的"spring+hibernate"表明这是一个将两者结合使用的项目。Spring和...
动态SQL的拼装是数据库编程中不可或缺的一部分,特别是在需要根据运行时条件构建SQL语句时。以下是对Oracle实现动态SQL拼装要领的详细说明: 1. **目标明确**: 在开始拼装SQL之前,首先明确最终要生成的SQL语句...
本文将深入探讨如何利用泛型来实现灵活的SQL语句拼装,以实现“泛型封装的SQL语句”。 首先,我们要理解泛型的概念。泛型是.NET框架中的一项重要特性,它允许在定义类、接口和方法时使用类型参数,从而创建可以应用...
TBM后配套管片拼装机是一种用于隧道掘进机械(Tunnel Boring Machine, TBM)的配套设备,它主要用于隧道施工中管片的自动拼装。管片是隧道衬砌的重要组成部分,拼装机能够将预制的管片按照设计要求拼装成环状,以...
于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库 制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...
2. where标签查询时如果某些条件没带可能导致SQL拼装有问题,比如多出一个and 3. Trim标签 4. choose标签:分支选择,只会进入其中一个 5. set标签:封装修改条件 6. foreach标签:遍历集合 7. foreach标签:批量...
Java如何使用Query动态拼接SQL详解 Java动态拼接SQL是指在Java中使用Query语言来动态地构建和执行SQL语句,从而实现灵活的数据查询和处理。下面是关于Java如何使用Query动态拼接SQL的详细知识点: 1. 动态拼接SQL...