`
liyonghui160com
  • 浏览: 763361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQLQueryUtil

    博客分类:
  • java
阅读更多

 

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang3.StringUtils;


public class SQLQueryUtil {

    private static final long serialVersionUID = -4008847394285279230L;

    private static String USE_JDBC_DRIVER = "mysql";

    /**
     * main()
     *
     * @param args
     */
    public static void main(String[] args) {
        SQLQueryUtil util = new SQLQueryUtil();
        util.addTable("mydb.user","mydb.user");
        util.addTable("mydb.group", "mydb.group");

        util.addColumn("SUM(group.name)","sum_name");
        util.addColumn("COUNT(group.name)","count_name");
        util.addColumn("user.name", "user_name");

        util.addAndCondition("user.id", RelationalOperators.EQ, "123", ValueType.NUMBER);
        //util.addAndInCondition("user_age", "'x','x','x','x','x'");
        //util.addOrLikeCondition("like", "yyyy");
        util.addGroupBy("group.name");
        util.addAscOrderBy("create_time");
        util.addDescOrderBy("user.id");
        System.out.println(util.toSQL());
    }

    /**
     * 日期格式化字符串 如:2013-06-20
     */
    public static final String FMT_DATE = "yyyy-MM-dd";

    /**
     * 时间格式化字符串 如:13:01:01
     */
    public static final String FMT_TIME = "HH:mm:ss";

    /**
     * 日期时间格式化字符串 如:2013-06-20 13:01:01
     */
    public static final String FMT_DATETIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * 逻辑运算
     *
     * @author Vity
     *
     */
    public enum LogicalOperators {
        AND("AND"), OR("OR");
        private String value;

        private LogicalOperators(String value) {
            this.value = value;
        }

        public String toString() {
            return new String(this.value);
        }
    }

    /**
     * 关系运算
     *
     * <p>
     * EQ("="), NE("<>"), GT(">"), GE(">="), LT("<"), LE("<=")
     * </p>
     *
     * @author Vity
     *
     */
    public enum RelationalOperators {
        EQ("="), NE("<>"), GT(">"), GE(">="), LT("<"), LE("<=");
        private String value;

        private RelationalOperators(String value) {
            this.value = value;
        }

        public String toString() {
            return this.value;
        }
    }

    /**
     * 排序方式
     *
     * @author Vity
     *
     */
    public enum SortMethod {
        ASC("ASC"), DESC("DESC");
        private String value;

        private SortMethod(String value) {
            this.value = value;
        }

        public String toString() {
            return this.value;
        }
    }

    /**
     * 值类型
     *
     * @author Vity
     *
     */
    public enum ValueType {
        NUMBER, DATE, STRING, TIME, DATETIME
    }

    /**
     * 内置表别名前缀
     */
    private final String TABLE_ALIAS_NAME = "TEMP_TABLE_ALIAS_";

    /**
     * 内置表别名索引
     */
    private int TABLE_ALIAS_INDEX = 0;

    /**
     * 是否调试模式 非调试模式则不打印SQL语句
     */
    private boolean isDebug = true;

    /**
     * 是否去重
     */
    private boolean isDistinct = false;

    /**
     * 表名及别名集合 key : table & view name | value : alias name
     * <p>
     * <b>注意:</b>目前不支持重复表查询
     * </p>
     */
    private Map<String, String> tableMap = new HashMap<String, String>();

    /**
     * 待查列名集合 key : column name value : | alias name
     */
    private Map<String, String> columnMap = new HashMap<String, String>();

    /**
     * 查询条件集合 key : and & or | value 条件值
     */
    private Map<String, String> conditionMap = new IdentityHashMap<String, String>();

    /**
     * 排序条件集合
     */
    private Map<String, String> orderMap = new HashMap<String, String>();

    /**
     * 分组集合
     */
    private List<String> groupList = new ArrayList<String>();


    /**
     * sql生成结果
     */
    private StringBuilder sqlResult = new StringBuilder();

    /**
     * 追加字符串,在后面添加一个空格
     *
     * @param string
     * @return
     */
    private SQLQueryUtil append(String string) {
        sqlResult.append(string).append(" ");
        return this;
    }

    /**
     * 删除最后两位字符串
     *
     * @return
     */
    private SQLQueryUtil clearEndChar() {
        sqlResult.delete(sqlResult.length() - 2, sqlResult.length());
        return this;
    }

    /**
     * 生成SQL语句
     *
     * @return
     */
    public String toSQL() {
        if (tableMap.isEmpty()) {
            //throw new Exception("Failure", "未发现表或视图");
        }

        this.append("SELECT");

        if (isDistinct) {
            this.append("DISTINCT");
        }

        if (columnMap.isEmpty()) {
            this.append("*");
        } else {
            for (String key : columnMap.keySet()) {
                this.append(key);
                if (!StringUtils.isBlank(columnMap.get(key))) {
                    this.append("AS").append(columnMap.get(key));
                }
                this.append(",");
            }
            this.clearEndChar();
        }



        this.append("FROM");

        for (String key : tableMap.keySet()) {
            this.append(key);
            if (!StringUtils.isBlank(tableMap.get(key))) {
                this.append("AS").append(tableMap.get(key));
            }
            this.append(",");
        }
        this.clearEndChar().append(" ");

        if (!groupList.isEmpty()) {
            this.append("GROUP BY");
            for (String field : groupList) {
                this.append(field).append(",");
            }
            this.clearEndChar();
        }

        if (!conditionMap.isEmpty()) {
            if (!groupList.isEmpty()) {
                this.append("HAVING");
            } else {
                this.append("WHERE");
            }
            this.append("1 = 1");
            for (Entry<String, String> entry : conditionMap.entrySet()) {
                this.append(entry.getKey()).append(entry.getValue());
            }
        }

        if (!orderMap.isEmpty()) {
            this.append("ORDER BY");
            for (String key : orderMap.keySet()) {
                this.append(key).append(orderMap.get(key)).append(",");
            }
            this.clearEndChar();
        }

        if (isDebug) {
            //logger.trace(sqlResult.toString().replace(" ,", ",").replace("  ", " ").replace(" 1 = 1 AND", "").replace(" 1 = 1 OR", ""));
        }
        return sqlResult.toString().replace(" ,", ",").replace("  ", " ").replace(" 1 = 1 AND", "").replace(" 1 = 1 OR", "");
    }

    /**
     * 设置 是否Distinct查询
     *
     * @param isDistinct
     */
    public void setDistinct(boolean isDistinct) {
        this.isDistinct = isDistinct;
    }

    /**
     * 添加待查询的表或视图名称
     *
     * @param tableName
     * @return
     */
    public SQLQueryUtil addTable(String tableName) {
        tableMap.put(tableName, TABLE_ALIAS_NAME + TABLE_ALIAS_INDEX++);
        return this;
    }

    /**
     * 添加待查询的表或视图名称,并指定别名
     *
     * @param tableName
     * @param aliasName
     * @return
     */
    public SQLQueryUtil addTable(String tableName, String aliasName) {
        if (aliasName.contains(TABLE_ALIAS_NAME)) {
            //throw new AppException(ResultCode.Failure, "不能使用这个别名前缀:" + TABLE_ALIAS_NAME);
        }
        tableMap.put(tableName, aliasName);
        return this;
    }

    /**
     * 添加待查列
     *
     * @param columnName
     * @return
     */
    public SQLQueryUtil addColumn(String columnName) {
        return this.addColumn(columnName, "");
    }

    /**
     * 添加待查列,并指定别名
     *
     * @param columnName
     * @param aliasName
     * @return
     */
    public SQLQueryUtil addColumn(String columnName, String aliasName) {
        columnMap.put(columnName, aliasName);
        return this;
    }

    /**
     * 添加查询条件
     *
     * <p>
     * <span>针对日期类型查询的说明</span> <div>
     * 日期查询必须将查询值按照本类提供的格式化字符串进行格式化,并指定相应的ValueType </div>
     * </p>
     *
     * @param logicalOperators
     * @param cKey
     * @param relationalOperators
     * @param cValue
     * @param valueType
     * @return
     */
    private SQLQueryUtil addCondition(LogicalOperators logicalOperators, String cKey, RelationalOperators relationalOperators, String cValue,
                                      ValueType valueType) {
        switch (valueType) {
            case STRING:
                conditionMap.put(logicalOperators.toString(),
                        cKey.concat(" ").concat(relationalOperators.toString()).concat(" '").concat(cValue).concat("'"));
                break;
            case NUMBER:
                conditionMap.put(logicalOperators.toString(), cKey.concat(" ").concat(relationalOperators.toString()).concat(" ").concat(cValue));
                break;
            default:
                conditionMap.put(logicalOperators.toString(), this.getDateTimeQuery(cKey, relationalOperators, cValue, valueType));
                break;

        }
        return this;
    }

    /**
     * 目前仅支持 Oracle, MySQL ; 日期查询生成 其他数据库方式请根据需要自行扩展
     */
    private String getDateTimeQuery(String cKey, RelationalOperators ro, String cValue, ValueType vt) {
        if (USE_JDBC_DRIVER.toLowerCase().contains("oracle")) {
            switch (vt) {
                case DATE:
                    return "to_char(".concat(cKey).concat(",'yyyy-mm-dd')").concat(ro.toString()).concat("'").concat(cValue).concat("'");
                case TIME:
                    return "to_char(".concat(cKey).concat(",'hh24:mi:ss')").concat(ro.toString()).concat("'").concat(cValue).concat("'");
                case DATETIME:
                    return "to_char(".concat(cKey).concat(",'yyyy-mm-dd hh24:mi:ss')").concat(ro.toString()).concat("'").concat(cValue).concat("'");
                default:
                    break;
            }
        } else if (USE_JDBC_DRIVER.toLowerCase().contains("mysql")) {
            switch (vt) {
                case DATE:
                    return cKey.concat(ro.toString()).concat("UNIX_TIMESTAMP('").concat(cValue).concat(" 00:00:00')");
                case TIME:
                    //throw new AppException(ResultCode.Failure, "暂不支持MySQL某段时间内查询,请确认日期后使用 ValueType.DATETIME 查询");
                case DATETIME:
                    return cKey.concat(ro.toString()).concat("UNIX_TIMESTAMP('").concat(cValue).concat("')");
                default:
                    break;
            }
        }
        return cKey.concat(" ").concat(ro.toString()).concat(" \"").concat(cValue).concat("\"");
    }

    private SQLQueryUtil addLikeCondition(LogicalOperators logicalOperators, String cKey, String cValue) {
        if (cValue.contains("%")) {
            conditionMap.put(logicalOperators.toString(), cKey.concat(" LIKE \"").concat(cValue).concat("\""));
        } else {
            conditionMap.put(logicalOperators.toString(), cKey.concat(" LIKE \"%").concat(cValue).concat("%\""));
        }
        return this;
    }

    private SQLQueryUtil addInCondition(LogicalOperators logicalOperators, String cKey, String cValue) {
        conditionMap.put(logicalOperators.toString(), cKey.concat(" IN ( ").concat(cValue).concat(" )"));
        return this;
    }

    private SQLQueryUtil addNotInCondition(LogicalOperators logicalOperators, String cKey, String cValue) {
        conditionMap.put(logicalOperators.toString(), cKey.concat(" NOT IN ( ").concat(cValue).concat(" )"));
        return this;
    }

    private SQLQueryUtil addOrderBy(String orderField, SortMethod sortMethod) {
        orderMap.put(orderField, sortMethod.toString());
        return this;
    }

    /**
     * 添加分组字段
     *
     * @param groupField
     * @return
     */
    public SQLQueryUtil addGroupBy(String groupField) {
        groupList.add(groupField);
        return this;
    }



    /**
     * 添加 AND查询条件
     *
     * @param cKey
     * @param relationalOperators
     * @param cValue
     * @param valueType
     * @return
     */
    public SQLQueryUtil addAndCondition(String cKey, RelationalOperators relationalOperators, String cValue, ValueType valueType) {
        return this.addCondition(LogicalOperators.AND, cKey, relationalOperators, cValue, valueType);
    }

    /**
     * 添加 OR查询条件
     *
     * @param cKey
     * @param relationalOperators
     * @param cValue
     * @param valueType
     * @return
     */
    public SQLQueryUtil addOrCondition(String cKey, RelationalOperators relationalOperators, String cValue, ValueType valueType) {
        return this.addCondition(LogicalOperators.OR, cKey, relationalOperators, cValue, valueType);
    }

    /**
     * 添加 AND LIKE 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addAndLikeCondition(String cKey, String cValue) {
        return this.addLikeCondition(LogicalOperators.AND, cKey, cValue);
    }

    /**
     * 添加 OR LIKE 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addOrLikeCondition(String cKey, String cValue) {
        return this.addLikeCondition(LogicalOperators.OR, cKey, cValue);
    }

    /**
     * 添加 AND IN 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addAndInCondition(String cKey, String cValue) {
        return this.addInCondition(LogicalOperators.AND, cKey, cValue);
    }

    /**
     * 添加 OR IN 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addOrInCondition(String cKey, String cValue) {
        return this.addInCondition(LogicalOperators.OR, cKey, cValue);
    }

    /**
     * 添加 AND NOT IN 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addAndNotInCondition(String cKey, String cValue) {
        return this.addNotInCondition(LogicalOperators.AND, cKey, cValue);
    }

    /**
     * 添加 OR NOT IN 查询条件
     *
     * @param cKey
     * @param cValue
     * @return
     */
    public SQLQueryUtil addOrNotInCondition(String cKey, String cValue) {
        return this.addNotInCondition(LogicalOperators.OR, cKey, cValue);
    }

    /**
     * 添加正向排序字段
     *
     * @param orderField
     * @return
     */
    public SQLQueryUtil addAscOrderBy(String orderField) {
        return this.addOrderBy(orderField, SortMethod.ASC);
    }

    /*
     * 添加逆向排序字段
     */
    public SQLQueryUtil addDescOrderBy(String orderField) {
        return this.addOrderBy(orderField, SortMethod.DESC);
    }

    /**
     * 清除待查表和视图
     *
     * @return
     */
    public SQLQueryUtil clearTable() {
        tableMap.clear();
        return this;
    }

    /**
     * 清除待查列
     *
     * @return
     */
    public SQLQueryUtil clearColumn() {
        columnMap.clear();
        return this;
    }

    /**
     * 清除查询条件
     *
     * @return
     */
    public SQLQueryUtil clearCondition() {
        conditionMap.clear();
        return this;
    }

    /**
     * 清除排序条件
     *
     * @return
     */
    public SQLQueryUtil clearOrder() {
        orderMap.clear();
        return this;
    }

    /**
     * 清除分组列
     *
     * @return
     */
    public SQLQueryUtil clearGroup() {
        groupList.clear();
        return this;
    }
}

 

分享到:
评论

相关推荐

    06_QLibrary.zip

    06_QLibrary.zip

    毕业设计: 基于Densenet + CTC技术的文字检测识别的技术研究

    本毕设课题是属于计算机视觉下的目标检测与识别,对象为自然场景下的各种文本信息,通俗的说就是检测识别图片中的文本信息。由于文本的特殊性,本毕设将整个提取信息的过程可以分为检测、识别两个部分。 论文对用到的相关技术概念有一定的介绍分析,如机器学习,深度学习,以及各种的网络模型及其工作原理过程。 检测部分采用水平检测文本线方式进行文本检测,主要参考了乔宇老师团队的 CTPN 方法,并在正文部分从模型的制作到神经网络的设计实现对系统进行了较为详细的分析介绍。 识别部分则采用的是 Densenet + CTC,对于印刷体的文字有较好的识别。

    毕业设计 基于javaweb的在线答题平台

    毕业设计 基于javaweb的在线答题平台

    numpy安装 python get-pip.py

    numpy安装 numpy安装 python get-pip.py

    基于用户、物品的协同过滤算法.zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    strcmp函数应用.zip

    strcmp函数应用.zip

    2.py

    2.py

    解读MIT-BIH数据的MATLAB代码.zip

    解读MIT-BIH数据的MATLAB代码.zip

    医保基本药品耗材目录查询2.0.exe

    可以查询各种医保内的药物,包括规格厂家和详细的相关资料,种类很齐全,方便大家查询,和了解药物价格等方面。

    使用Numpy将类保存到npz文件并读取文件,然后绘制图形的Python代码示例

    npz文件 代码中,我们首先定义了一个数据类Data,其中包含x和y两个成员变量。 然后,我们创建了数据对象,并将其保存到文件中。我们使用np.savez函数将数据字典保存到文件中,其中字典的键为变量名,值为对应的数据数组。 接下来,我们使用load_from_file方法从文件中加载数据,并创建一个新的数据对象。 最后,我们使用Matplotlib库绘制出新数据对象的图形。通过plot函数,我们将x和y作为横纵轴数据进行绘制。然后,我们添加坐标轴标签、标题,并显示网格线。 运行代码后,将显示一个绘制出的数据图形。 数据保存: def save_to_file(self, filename): data_dict = { 'x': self.x, 'y': self.y } np.savez(filename, **data_dict) # 将数据保存到文件 filename = 'data.npz' data.save_to_file(filename)

    matlab矩阵的生成.zip

    matlab矩阵的生成.zip

    模拟器非常好用,赶紧来下载

    模拟器非常好用,赶紧来下载

    常用进制转换器16进制10进制2进制转换计算器..exe

    大家好呀!今天来介绍一款常用进制转换器,也就是 16 进制、10 进制、2 进制转换计算器。有了它,你可以轻松实现不同进制之间的快速转换。无论是将 16 进制转换为 10 进制或 2 进制,还是从其他进制转换过来,它都能准确而高效地完成。无论是在计算机编程、数字电路等领域,还是日常对进制转换有需求的时候,它都能成为你的得力小助手,让进制转换不再麻烦,快来试试吧!

    GIMP完整指南GIMP完整指南

    GIMP完整指南

    IMG_20240519_155556.jpg

    IMG_20240519_155556.jpg

    java spring boot集成minio文件上传下载

    资源内容为java操作minio文件上传下载,也涉及到加密操作,主要是minio的SSE-C模式,具体内容在Sprintboot01ApplicationTests.MinioTest()中。 包含以下内容: //1.测试数据上传 testUploadString(); //2.测试数据下载 testDownLoadString(); //3..测试数据加密上传 testUploadStringEncryt(); //4.测试加密数据下载 testDownLoadStringEncryt(); //5.测试文件上传 testUploadFile(); //6.测试文件加密上传 testUploadFileEnctry(); //7.测试文件加密下载 testDownLoadFileEncryt();

    web期末大作业基于HTML+CSS实现的品优购购物网站静态网页源码(仿京东-期末大作业).rar

    品优购购物网站静态网页源码是基于HTML+CSS实现的一款仿京东风格的购物网站项目。该项目旨在帮助计算机相关专业的在校学生、老师以及企业员工更好地学习和掌握HTML+CSS技术,提升网页设计与制作的实践能力。 该源码经过精心设计和编码,实现了良好的页面布局和视觉效果,同时保证了代码的易读性和可维护性。通过下载和使用该源码,用户可以快速搭建起一个具有完整功能的购物网站静态页面,为后续动态交互功能的实现打下坚实基础。 此外,该源码还提供了详细的注释说明,方便初学者快速上手,理解并掌握网页制作的关键技术。对于有一定基础的学员来说,更可以在源码的基础上进行二次开发,实现更多个性化功能,满足实际项目需求。 经过运行测试,该源码表现稳定,无兼容性问题。无论是作为课程设计的参考资源,还是毕业设计的实践项目,品优购购物网站静态网页源码都将为您提供一个高质量的起点,助您在学习和实践中取得优异成绩。放心下载使用,开启您的网页制作之旅吧!

    【一键平仓ea 】一键平仓ea ,一键全部平仓mt5面板ea

    包含一键全平 一键平盈利单 一键平亏损但 只平多单 只平空单 盈利单平二分之一仓位 盈利单平三分之一 亏损单平二分之一仓位 亏损单平三分之一 适用于 mt5 平台

    JAVA文件传输(lw+源代码).zip

    FTP(File Transfer Protocol)是文件传输协议的简称。 FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。 目前FTP服务器软件都为国外作品,例如Server_U、IIS,国内成熟的FTP服务器软件很少,有一些如(Crob FTP Server),但从功能上看来远不能和那些流行的服务器软件媲美。

    Java项目毕业设计-航空订票系统(前台订票+后台票务管理)基于SSM开发+数据库(详细源码)-期末大作业.rar

    本项目为Java项目毕业设计-航空订票系统,基于SSM框架开发,结合前台订票与后台票务管理功能,满足现代航空票务需求。系统采用三层架构,包括表现层、业务逻辑层和数据访问层,确保高效稳定运行。数据库设计考虑数据完整性和安全性,采用MySQL数据库存储关键数据。 经过运行测试,系统性能良好,满足设计要求。界面简洁直观,用户友好;后台管理功能强大,方便管理员管理。系统安全性高,有效防止SQL注入、跨站脚本等攻击。 本资源适合计算机相关专业学生和从业者下载学习。对初学者,可快速掌握SSM框架和航空订票系统开发流程;对有一定基础者,可作为参考,拓宽思路,提升技能。此外,也适用于毕业设计、课程设计、项目立项等场景,展现项目基本框架和功能。 请放心下载使用,相信能助您顺利完成学习和项目任务。期待在您的努力下,系统不断完善,功能更加丰富,为航空事业发展贡献力量。

Global site tag (gtag.js) - Google Analytics