转载自:http://www.aichengxu.com/view/48965
简单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:这可能是对于单个项目定制的,你完全可以通过自己想象的空间,去创建更多优秀的代码的。。。