带条件查询工具类Query

本文介绍了一个用于构建Java SQL查询的实用工具类。该类支持根据表名创建查询实例,并可通过添加不同类型的条件来构建复杂的SQL语句。支持等于、模糊匹配、范围查询等多种条件类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.rzy.api.db;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Query
{
	private static Query query = null;
	private String table = null;
	private String baseSQL = null;
	private Map<String, String> condMap = new HashMap<String, String>();

	private Query(String tableName)
	{
		this.table = tableName.toUpperCase();
		baseSQL = String.format("SELECT * FROM %s T", this.table);
	}

	/**
	 * 根据表名创建Query单例对象
	 * 
	 * @return Query单例对象
	 */
	public static Query Create(String tableName)
	{
		query = new Query(tableName);
		return query;
	}

	/**
	 * 根据条件MAP得到条件SQL语句
	 * 
	 * @return
	 */
	private StringBuffer getWHERE()
	{
		StringBuffer where = new StringBuffer();
		for (Map.Entry<String, String> entry : this.condMap.entrySet())
		{
			String field = entry.getKey();
			String[] arr = entry.getValue().split("\\|");
			if ("=".equals(arr[0]))
			{
				if (where.length() != 0)
				{
					where.append(" AND ");
				}
				where.append(field).append(arr[0]).append("\'").append(arr[1])
						.append("\'");
			}
			else if ("LIKE".equalsIgnoreCase(arr[0]))
			{
				if (where.length() != 0)
				{
					where.append(" AND ");
				}
				where.append(field).append(" LIKE \'%").append(arr[1]).append(
						"%\'");
			}
			else if ("BETWEEN".equalsIgnoreCase(arr[0]))
			{
				if (where.length() != 0)
				{
					where.append(" AND ");
				}
				where.append("(").append(field).append(" BETWEEN \'").append(
						arr[1]).append("\' AND \'").append(arr[2])
						.append("\')");
			}
			else if ("IN".equalsIgnoreCase(arr[0]))
			{
				if (where.length() != 0)
				{
					where.append(" AND ");
				}
				where.append(field).append(" IN(").append(arr[1]).append(")");
			}
			else if ("ORDER".equalsIgnoreCase(arr[0]))
			{
				if (where.length() != 0)
				{
					where.append(" ORDER BY ");
				}
				else
				{
					where.append("ORDER BY ");
				}
				where.append(field).append(" ").append(arr[1]);
			}
			else
			{
				if (where.length() != 0)
				{
					where.append(" AND ");
				}
				where.append(field).append(arr[0]).append(arr[1]);
			}
		}
		boolean isOnlyOrder = where.toString().startsWith("ORDER BY");
		if (!isOnlyOrder)
		{
			where.insert(0, "WHERE ");
		}
		return where;
	}

	/**
	 * 根据条件MAP得到SQL语句
	 * 
	 * @return SQL语句
	 */
	private String SQL()
	{
		StringBuffer ret = new StringBuffer(baseSQL);
		if (this.condMap != null && this.condMap.size() != 0)
		{
			ret.append(" ").append(getWHERE());
		}
		return ret.toString();
	}

	/**
	 * 查询
	 * 
	 * @return 数据集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> list()
			throws SQLException
	{
		String sql = SQL().toString();
		List<Map<String, Object>> list = DBHelper.query(sql);
		return list;
	}

	/**
	 * 分页查询
	 *
	 * @param start
	 *            开始记录数
	 * @param limit
	 *            查询条数
	 * @return 数据集合List<Map<k,v>> 其中k:字段名小写,v:字段值
	 * @throws SQLException
	 */
	public List<Map<String, Object>> list(int start, int limit) throws SQLException
	{
		StringBuffer ret = new StringBuffer("SELECT * FROM(");
		ret.append(SQL().replace("*", "ROWNUM AS RM ,T.*")).append(
				") WHERE RM BETWEEN ").append(start + 1).append(" AND ")
				.append(start + limit);
		List<Map<String, Object>> list = DBHelper.query(ret.toString());
		return list;
	}

	/**
	 * 得到总记录数
	 * 
	 * 
	 * @return 总记录数
	 */
	public int count() throws SQLException
	{
		String sql = SQL().replace("*", "COUNT(*)");
		return Integer.parseInt(DBHelper.scalar(sql).toString());
	}

	/**
	 * 添加条件
	 * 
	 * @param field 字段 如:"name"
	 * @param opVal 操作符和值 如:"like|aaa","=|001","between|20|70","order|desc"
	 * @return Query 
	 */
	public Query add(String field,String opVal)
	{
		this.condMap.put(field,opVal);
		return this;
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值