简单SQL查询组件(整理)
Posted microhex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单SQL查询组件(整理)相关的知识,希望对你有一定的参考价值。
相信大家在业务非常复杂,客户要求非常头疼的情况下写的查询SQL语句也是一种非常痛苦事了,还好我跟老师做的项目中要求不是很多,差不多就5,6个样子,但是就是这5,6个样子也把我累得像狗。刚开始的时候想到的方案是写if/else语句,条件少点还过得去,但是条件多了就不行。因此,这次介绍一个简单查询组件的编写(所编写的HQL语句应用于hibernate中,当然你可以改一下用到sql语句中)。
作为一条完整的HQL语句,应该包括 SELECT [condition] FROM ClassName alias where [....] ORDER BY [....].那么我们可以将HQL语句简单分解为三个部分fromClause,whereClause和orderClause三个组成部分。我们需要做的是就是拼接fromClause+whereClause+orderClause.好了,上代码:
/**
* 简单查询组件
* @author Administrator
*/
public class QueryHelper
//form子句
private StringBuffer fromClause = new StringBuffer();
//where子句
private StringBuffer whereClause = new StringBuffer();
//oderby子句
private StringBuffer orderByClause = new StringBuffer() ;
//获取参数代码
private List<Object> listObject = new ArrayList<Object>() ;
/**
* 初始化,构建from字句,注意空格!!!
* @param clazz
* @param alias
*/
public QueryHelper(Class<?> clazz , String alias)
fromClause.append(" FROM " + clazz.getSimpleName()+" "+alias) ;
/**
* 添加where字句,注意空格!!
* @param condition
* @param paramters
*/
public QueryHelper addWhereCondition(String condition , Object...paramters)
if(whereClause.toString().length() == 0)
whereClause.append(" WHERE " + condition) ;
else
whereClause.append(" AND " +condition);
//添加参数
for(Object obj : paramters)
listObject.add(obj);
return this ;
public QueryHelper addWhereCondition(boolean isWhere , String condition , Object...paramters)
if(isWhere)
addWhereCondition(condition,paramters);
return this ;
/**
*添加orderby参数,注意空格
* @param orderBy
* @param order true为升序 false为降序
*/
public QueryHelper addOrderByCondition(String orderBy , boolean order)
if(orderByClause.toString().length() == 0)
orderByClause.append(" ORDER BY "+orderBy + (order ? " ASC " : " DESC ")) ;
else
orderByClause.append(" , " + orderBy+ (order ? " ASC " : " DESC ")) ;
return this ;
//计算记录的条数,这是基本上是需求中要求最多的。
public String getTotalCount()
return "SELECT COUNT(*) " + fromClause + whereClause ;
public QueryHelper addOrderByCondition(boolean isOrder , String orderBy , boolean order)
if(isOrder)
addOrderByCondition(orderBy,order);
return this ;
public List<Object> getListObject()
return listObject;
public String getQuery()
return fromClause.toString() + whereClause.toString() + orderByClause.toString() ;
以上就是分页代码了,好了,怎么使用呢,来看下面的例子:
假设存在一个User用户,需要查找一个姓zhang的,成绩(抱歉我还是学生,只能这么幼稚啊)大于90分的,按照id升序,然后name降序的查询语句:
@Test
public void testUser()
QueryHelper query = new QueryHelper(User.class ,"user") ;
query.addWhereCondition("user.name like ?", "'%zhang%'");
//前面的Boolean变量是判断是否加入条件,这只是模拟一般性,
//因为实际项目中我们不知道该条件是否存在
query.addWhereCondition((2 > 1), "user.grade > ?", 90);
query.addOrderByCondition("user.id", true) ;
//同理前一个Boolean是为了增加一般性,
//实际项目中要判断是否存在该条件
query.addOrderByCondition(true, "user.name", false) ;
//HQL一般查询语句
System.out.println(query.getQuery());
//HQL满足条件总数
System.out.println(query.getTotalCount());
//HQL需要参数
System.out.println(query.getListObject());
那么输出结果可以看到:
FROM User user WHERE user.name like ? AND user.grade > ? ORDER BY user.id ASC , user.name DESC
SELECT COUNT(*) FROM User user WHERE user.name like ? AND user.grade > ?
['%zhang%', 90]
呵呵,我们非常不爽的代码就完全通过工具实现了。这样就可以少点抱怨多用心学习了啊。
ps:这可能是对于单个项目定制的,你完全可以通过自己想象的空间,去创建更多优秀的代码的。。。
以上是关于简单SQL查询组件(整理)的主要内容,如果未能解决你的问题,请参考以下文章