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 SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...
SQL组装复杂查询条件,SELECT .. FROM .. (LEFT|RIGHT|INNER) JOIN .. ON .. WHERE .... GROUP BY .. HAVING .. ORDER BY .. LIMIT ..
java连接SqlServer完整代码,工具类,jdbc JDBC工具类的构建 1.资源释放 见https://mp.csdn.net/postedit/86577443 2.驱动防二次注册 ``` Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //...
NULL 博文链接:https://fanshuyao.iteye.com/blog/2425817
动态拼接sql语句工具类,拼接where后面语句 配合原生jdbc仿动态sql注入 if (ObjectUtil.isNotEmpty(maxLat)&&ObjectUtil.isNotEmpty(minLat)){ sqlParamList.add(new SqlParam("lat",minLat, SqlOpEnum.GE)); ...
SQL查询Java工具类
sql 转 java 代码工具类
很好用的一个sql查询分析器工具 很好用的一个sql查询分析器工具
SQL查询小工具,方便易用
生成SQL的工具类
用户自己定义动态组织sql查询条件,对于用户来说相当方便的啦。可以自由选择查询字段、条件条件、条件值,选择与或关系,包括括号优先的使用。根据查询字段不同,查询条件值的动态改变,如日期控件、下拉框、可输入...
SQL查询处理工具,简单的查询工具,支持mysql、SQLserver等
SqlServer数据库,事务工具类
C# 访问sqlserver工具类 提供访问接口
Sqlplus developer 的sql格式化工具提取。及使用教程。
SQL2005查询工具 SQLServer2005_SSMSEE,简单安装SQL软件可以下载使用
项目中已使用的一个比较简单的SQL语句查询字段解析工具类
NULL 博文链接:https://kaka100.iteye.com/blog/1004594
schemaless的类sql分布式查询系统 schemaless的类sql分布式查询系统 schemaless的类sql分布式查询系统 schemaless的类sql分布式查询系统 schemaless的类sql分布式查询系统 schemaless的类sql分布式查询系统 ...
SQL多条件查询.SQL多条件查询.SQL多条件查询.