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

SQL查询条件拼凑工具类

阅读更多
package com.xxx.common.util; 

import static StringUtil.*; 

import java.util.Date; 

/**
* MySQL/HQL 查询条件构建器(只支持and查询), 支持 like 通配符查询和忽略 NULL 参数.
* 
* 智能拼参数: 当参数为空时, 会忽略此 and 条件. 调用方式见 main 方法的DEMO.
* 
*/
public class SQLCondition {
    public final static String LIKE = "like";
//    public final static String GT = ">";
//    public final static String LT = "<";
//    public final static String EQ = "=";
//    public final static String EQIGCASE = "EC";
//    public final static String GTE = ">=";
//    public final static String LTE = "<="; 

    public final static String ParamType_Number = "NUM";//数字类型
    public final static String ParamType_String = "STR";//字符串类型
    public final static String ParamType_Datetime = "DATE";//日期类型
    private String condition = "";//查询条件
    private String table;// 表名
    // 此方法演示了如何调用
    public static void main(String[] args) {
        SQLCondition cond = new SQLCondition();
        cond.setTable("表1 bill");// 可选设置, 用于生成 FROM 和 COUNT 语句
        cond.add("bill.providername", "like", "value");
        cond.add("bill.2", "=", "value2");
        cond.add("bill.3", "=", null);// 被忽略
        cond.add("bill.4", "=", "");// 被忽略
        cond.addNum("数字列", "=", "3");
        cond.addNum("数字列", ">", "4");
        cond.addDate("日期列", "<=", "2009", "2");
        System.out.println(cond.getCondition());// 条件语句
        System.out.println(cond.getFromSQL());//生成的 FROM 语句
        System.out.println(cond.getCountSQL());// 生成的 COUNT 语句
        /* 输出为:
WHERE bill.providername LIKE '%value%' AND bill.2 = 'value2' AND 数字列 = 3 AND 数字列 > 4 AND 日期列 <= '2009-02' 
FROM 表1 bill WHERE bill.providername LIKE '%value%' AND bill.2 = 'value2' AND 数字列 = 3 AND 数字列 > 4 AND 日期列 <= '2009-02' 
SELECT COUNT(*) FROM 表1 bill WHERE bill.providername LIKE '%value%' AND bill.2 = 'value2' AND 数字列 = 3 AND 数字列 > 4 AND 日期列 <= '2009-02' 

         */
        cond.clear();// 清空现有参数列表, 然后可重用此对象 

    }
    /**
     * 添加比较条件, 指定所有参数.
     * @param column 列名
     * @param operator 操作符
     * @param value 参数值
     * @param type 类型
     * @param allowEmpty 是否允许为空
     */
    public void add(String column, String operator, Object value, String type, boolean allowEmpty) {
        if(!allowEmpty && ( value == null || "".equals(value))) {
            return;
        }
        if(type.equals(ParamType_String) || type.equals(ParamType_Datetime)) {
            if(value instanceof String) {
                value = replaceSql((String)value);
            }
            if(LIKE.equalsIgnoreCase(operator)) {
                if(type.equals(ParamType_Datetime)) {
                    condition += column  + " LIKE '"+ value +"%' AND ";// 缩小查询范围
                } else {
                    condition += column  + " LIKE '%"+ value +"%' AND ";
                }
            } else {
                // TODO 更多查询操作符支持
                condition += column  + " " + operator + " '"+ value +"' AND ";
            }
        }
        // 数字类型
        else if(type.equals(ParamType_Number)) {
            if(LIKE.equalsIgnoreCase(operator)) {
                condition += column  + " = "+ " " + value +" AND ";
            } else {
                condition += column  + " " + operator + " " + value +" AND ";
            }
        }
    }
    /**
     * 添加字符串比较条件
     * @param column 列名
     * @param operator 操作符
     * @param value 取值
     */
    public void add(String column, String operator, String value) {
        add(column, operator, value, ParamType_String, false);
    }
    /**
     * 添加数字比较条件
     * @param column 列名
     * @param operator 操作符
     * @param value 取值
     */
    public void addNum(String column, String operator, String value) {
        if(!isNumeric(value)) {
            return;
        }
        add(column, operator, value, ParamType_Number, false);
    }
    /**
     * 将给定的日期字符串作为日期参与比较.
     * @param column 列名
     * @param operator 操作符
     * @param value 日期字符串
     */
    public void addDate(String column, String operator, String value) {
        add(column, operator, value, ParamType_Datetime, false);
    }
    /**
     * 将年月格式的日期格式化后作为比较字符串.
     * @param column 列名
     * @param operator 操作符
     * @param year 年
     * @param month 月
     */
    public void addDate(String column, String operator, String year, String month) {
        if(isEmpty(year) || isEmpty(month)) {
            return;
        }
        // 日期匹配, 月份统一显示为2位
        if(month.length() == 1) {
            month = "0" + month;
        }
        add(column, operator, year + "-" + month, ParamType_Datetime, false);
    }
    /**
     * 将日期固定格式化后作为比较字符串.
     * @param column 列名
     * @param operator 操作符
     * @param date
     * @param datePattern 日期格式化字符串
     */
    public void addDate(String column, String operator, Date date, String datePattern) {
        if(date == null) {
            return;
        }
        String value = formatDate(date, datePattern);
        addDate(column, operator, value);
    }
    /**
     * 将日期作为 YYYY-MM-dd 的格式加入比较字符串.
     * @param column 列名
     * @param operator 操作符
     * @param date
     */
    public void addDate(String column, String operator, Date date) {
        if(date == null) {
            return;
        }
        addDate(column, operator, date, "YYYY-MM-dd");
    }
    /**
     * 得到 From 语句和条件.
     * @return FROM ${table} where ....
     */
    public String getFromSQL() {
        return "FROM " + getTable() + getCondition();
    }
    /**
     * 得到计算 COUNT 语句和条件.
     * @return SELECT COUNT(*) FROM ${table} where ....
     */
    public String getCountSQL() {
        return "SELECT COUNT(*) FROM " + getTable() + getCondition();
    }
    /**
     * 获得查询条件.
     * @return 包含 Where 条件的语句
     */
    public String getCondition() {
        // 防止多次调用出现多个where
        if(condition.indexOf("WHERE") != -1) {
            return condition;
        }
        // 去掉末尾的"and "并加入where语句
        if(!isEmpty(condition)) {
            if(condition.substring(condition.length()-4, condition.length()).equals("AND ") ){
                condition = condition.substring(0, condition.length()-4);
            }
            condition = " WHERE " + condition;
        } 

        return condition;
    }
    /** 清空查询条件 */
    public void clear() {
        condition = "";
    }
    /** 返回查询条件作为对象描述 */
    public String toString() {
        return getCondition();
    } 

    /**
     * 得到表名
     * @return
     */
    public String getTable() {
        return table;
    } 

    /**
     * 设置表名/实体名
     * @param table
     */
    public void setTable(String table) {
        this.table = table;
    } 

}

 转自 http://www.blogjava.net/beansoft/archive/2009/09/17/295465.html

分享到:
评论

相关推荐

    ORACLE,mysql,sqlserver,sybase数据库装文本软件

    自己写的数据库装载工具,平时工作中用于装载大文本文件到数据库表,也能直接装载excel,不过excel只能使用第一个sheet,且不支持合并的单元格。 jdk要求版本1.6及以上。 使用方法: java -jar lynload.jar,即可看到...

    电梯广告发布管理系统.pdf

    VBA(Visual Basic for Applications)通常在Excel和Access这类应用程序中用于编写宏和自动化任务。 5. 文档中反复提到了Excel。这暗示系统可能有与Excel紧密相关的功能,如数据导入导出、报表生成等,使用Excel...

    wordlists:香港专业教育学院的单词表的集合被糊涂在一起

    最好与FFUF之类的工具配合使用,因为该列表没有/在开始时包含扩展名est,所以请记住这一点。 这确实有一些垃圾字符串,所以过滤输出将有很大帮助webapp / sql-injection / sqli-everything.txt 这是所有SQL单词表中...

    PyQt5 快速开发与实战

    除了Widgets模块,PyQt5还包括QtMultimedia用于处理多媒体内容,QtSql用于数据库操作,以及QtWebEngine用于嵌入Web内容等高级功能模块。这些模块使得PyQt5不仅仅局限于简单的桌面程序,也能处理复杂的应用场景。 在...

    数据库设计说明书.docx

    - **SQL**:Structured Query Language(结构化查询语言) 综上所述,该文档全面覆盖了甬江人才创新中心智慧园区综合管理服务平台的数据库设计工作,从命名规则、物理设计、安全性考虑等多个方面提供了详尽的指导。...

    二十三种设计模式【PDF版】

    关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...

Global site tag (gtag.js) - Google Analytics