All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.oschina.durcframework.easymybatis.query.Query Maven / Gradle / Ivy

/*
 * Copyright 2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.oschina.durcframework.easymybatis.query;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.oschina.durcframework.easymybatis.SqlConsts;
import net.oschina.durcframework.easymybatis.query.expression.Expression;
import net.oschina.durcframework.easymybatis.query.expression.ExpressionJoinable;
import net.oschina.durcframework.easymybatis.query.expression.ExpressionListable;
import net.oschina.durcframework.easymybatis.query.expression.ExpressionSqlable;
import net.oschina.durcframework.easymybatis.query.expression.ExpressionValueable;
import net.oschina.durcframework.easymybatis.query.expression.Expressional;
import net.oschina.durcframework.easymybatis.query.expression.JoinExpression;
import net.oschina.durcframework.easymybatis.query.expression.ListExpression;
import net.oschina.durcframework.easymybatis.query.expression.SqlExpression;
import net.oschina.durcframework.easymybatis.query.expression.ValueConvert;
import net.oschina.durcframework.easymybatis.query.expression.ValueExpression;
import net.oschina.durcframework.easymybatis.query.expression.builder.ConditionBuilder;
import net.oschina.durcframework.easymybatis.query.param.BaseParam;
import net.oschina.durcframework.easymybatis.query.param.SchPageableParam;
import net.oschina.durcframework.easymybatis.query.param.SchSortableParam;

/**
 * 查询类
 * 
查询姓名为张三的用户
@GetMapping("sch")
public List sch(String username) {
	Query query = new Query();
	query.eq("username", username); 
	List list = dao.find(query);
	return list;
}

查询姓名为张三并且拥有的钱大于100块
@GetMapping("sch2")
public List sch2(String username) {
	Query query = new Query();
	query.eq("username", username).gt("money", 100);
	List list = dao.find(query);
	return list;
}

查询姓名为张三并带分页
@GetMapping("sch3")
public List sch3(String username,PageParam param) {
	Query query = param.toQuery();
	query.eq("username", username);
	List list = dao.find(query);
	return list;
}

// 根据添加时间倒序
Query query = new Query();
query.addSort("create_time",Sort.DESC);
dao.find(query);
 * 
* @author tanghc * */ public class Query implements Queryable { private static final String REG_SQL_INJECT = "([';*--|])+"; private int start; private int limit = 10; // 排序信息 private Set orderInfo; // 是否查询全部 private boolean queryAll; private Map paramMap; private List valueExpressions; private List joinExpressions; private List listExpressions; private List sqlExpressions; private List columns = Collections.emptyList(); private List otherTableColumns; /** * 将bean中的字段转换成条件,字段名会统一转换成下划线形式.已废弃,改用Query.buind(bean) *

	 * User user = new User();
	 * user.setUserName("jim");
	 * Query query = Query.buildFromBean(user);
	 * 
	 * 这样会组装成一个条件:where user_name='jim'
	 * 更多功能可查看开发文档.
	 * 
* @param bean * @return */ @Deprecated public static Query buildFromBean(Object bean) { Query query = new Query(); bindExpressionsFromBean(bean, query); return query; } private static void bindExpressionsFromBean(Object bean,Query query) { List expresList = ConditionBuilder.getUnderlineFieldBuilder().buildExpressions(bean); for (Expression expression : expresList) { query.addExpression(expression); } } /** * 将bean中的字段转换成条件,不会将字段名转换成下划线形式. *

	 * User user = new User();
	 * user.setUserName("jim");
	 * Query query = Query.buildFromBeanByProperty(user);
	 * 
	 * 这样会组装成一个条件:where userName='jim'
	 * 更多功能可查看开发文档.
	 * 
* @param bean * @return */ public static Query buildFromBeanByProperty(Object bean) { Query query = new Query(); List expresList = ConditionBuilder.getCamelFieldBuilder().buildExpressions(bean); for (Expression expression : expresList) { query.addExpression(expression); } return query; } public static Query build() { return new Query(); } /** * 添加其它表的字段 query.addOtherColumn("t2.username as name"); * * @param column * @return */ public Query addOtherColumn(String column) { if (otherTableColumns == null) { otherTableColumns = new ArrayList<>(); } otherTableColumns.add(column); return this; } /** * 批量添加其它字段. * * query.addOtherColumns( * "t2.username" * ,"t2.userage as age" * ) * * @param columns * @return */ public Query addOtherColumns(String... columns) { for (String column : columns) { this.addOtherColumn(column); } return this; } @Override public List getOtherTableColumns() { return otherTableColumns; } // ------ 设置分页信息 ------ /** * 设置分页信息 * * @param pageIndex * 当前第几页,从1开始 * @param pageSize * 每页结果集大小 * @return 返回自身对象 */ public Query page(int pageIndex, int pageSize) { this.setPage(pageIndex, pageSize); return this; } /** * 设置分页信息,针对不规则分页。对应mysql分页语句:limit {start},{offset} * * @param start * 记录起始位置 * @param offset * 偏移量 * @return 返回自身对象 */ public Query limit(int start, int offset) { if(start < 0) { throw new IllegalArgumentException("public Query limit(int start, int offset)方法start必须大于等于0"); } if(offset < 1) { throw new IllegalArgumentException("public Query limit(int start, int offset)方法offset必须大于等于1"); } this.start = start; this.limit = offset; return this; } /** * 设置分页信息。已废弃,改用query.limit(start,offset) * * @param start * 记录索引 * @return 返回自身对象 */ @Deprecated public Query setStart(int start) { this.start = start; return this; } /** * 设置分页信息。已废弃,改用query.limit(start,offset) * * @param limit * 记录条数 * @return 返回自身对象 */ @Deprecated public Query setLimit(int limit) { this.limit = limit; return this; } /** * 设置分页信息。已废弃,改用query.page(pageIndex,pageSize); * * @param pageIndex * 当前第几页,从1开始 * @param pageSize * 每页结果集大小 * @return 返回自身对象 */ @Deprecated public Query setPage(int pageIndex, int pageSize) { if (pageIndex < 1) { throw new IllegalArgumentException("pageIndex必须大于等于1"); } if (pageSize < 1) { throw new IllegalArgumentException("pageSize必须大于等于1"); } int start = (int) ((pageIndex - 1) * pageSize); int offset = pageSize; return this.limit(start, offset); } @Override public int getStart() { return this.start; } @Override public int getLimit() { return this.limit; } /** * * 同getStart() * * @return */ public int getFirstResult() { return this.getStart(); } /** * 同getLimit() * * @return */ public int getPageSize() { return this.getLimit(); } // ------ 设置分页信息 end ------ /** * 构建查询全部的表达式对象 * * @return */ public static Query buildQueryAll() { Query query = new Query(); query.queryAll = true; return query; } /** * 添加注解查询条件 * * @param searchEntity * @return */ public Query addAnnotionExpression(Object searchEntity) { bindExpressionsFromBean(searchEntity, this); return this; } /** * 添加分页信息 */ public Query addPaginationInfo(SchPageableParam searchEntity) { int start = searchEntity.getStart(); int limit = searchEntity.getLimit(); return this.limit(start, limit); } public Query addSortInfo(SchSortableParam searchEntity) { this.addSort(searchEntity.getDBSortname(), searchEntity.getSortorder()); return this; } /** * 构建查询条件. * * @param searchEntity * @return */ public static Query build(Object searchEntity) { if(searchEntity instanceof BaseParam) { return ((BaseParam)searchEntity).toQuery(); }else { return buildFromBean(searchEntity); } } @Override public Expressional addExpression(Expression expression) { if (expression instanceof ExpressionValueable) { if(valueExpressions == null) {valueExpressions = new ArrayList<>();} valueExpressions.add((ExpressionValueable) expression); } else if (expression instanceof ExpressionListable) { if(listExpressions == null) {listExpressions = new ArrayList<>();} listExpressions.add((ExpressionListable) expression); } else if (expression instanceof ExpressionJoinable) { if(joinExpressions == null) {joinExpressions = new ArrayList<>();} joinExpressions.add((ExpressionJoinable) expression); } else if (expression instanceof ExpressionSqlable) { if(sqlExpressions == null) {sqlExpressions = new ArrayList<>();} sqlExpressions.add((ExpressionSqlable) expression); } return this; } public void addAll(List expressions) { if (expressions != null) { for (Expression expression : expressions) { this.addExpression(expression); } } } public Query addParam(String name, Object value) { if (this.paramMap == null) { this.paramMap = new HashMap<>(); } this.paramMap.put(name, value); return this; } @Override public Map getParam() { return this.paramMap; } @Override public boolean getIsQueryAll() { return queryAll; } public void setQueryAll(boolean queryAll) { this.queryAll = queryAll; } @Override public List getValueExpressions() { return this.valueExpressions; } @Override public List getJoinExpressions() { return this.joinExpressions; } @Override public List getListExpressions() { return this.listExpressions; } @Override public List getSqlExpressions() { return this.sqlExpressions; } /** * 字段排序 * @param sortname 数据库字段名 * @param sort 排序类型 * @return */ public Query orderby(String sortname, Sort sort) { return this.addSort(sortname, sort); } /** * 添加ASC排序字段, * * @param sortname * 数据库字段名 * @return 返回自身对象 */ public Query addSort(String sortname) { return this.addSort(sortname, SqlConsts.ASC); } /** * 字段排序 * @param sortname 数据库字段名 * @param sort 排序类型 * @return */ public Query addSort(String sortname, Sort sort) { return this.addSort(sortname, sort.name()); } /** * 添加排序字段。 * 已废弃,推荐用:public Query addSort(String sortname, Sort sort) * @param sortname * 数据库字段名 * @param sortorder * 排序方式,ASC,DESC * @return 返回自身对象 */ @Deprecated public Query addSort(String sortname, String sortorder) { if (sortname != null && sortname.length() > 0) { if (this.orderInfo == null) { orderInfo = new LinkedHashSet(); } // 简单防止SQL注入 sortname = sortname.replace(REG_SQL_INJECT, SqlConsts.EMPTY); if (!SqlConsts.DESC.equalsIgnoreCase(sortorder)) { sortorder = SqlConsts.ASC; } orderInfo.add(sortname + SqlConsts.BLANK + sortorder); } return this; } @Override public boolean getOrderable() { return orderInfo != null; } @Override public String getOrder() { if(orderInfo == null) { throw new NullPointerException("orderInfo为空,必须设置排序字段."); } StringBuilder sb = new StringBuilder(); for (String order : this.orderInfo) { sb.append(",").append(order); } if (sb.length() > 0) { return sb.toString().substring(1); } else { return ""; } } @Override public List getColumns() { return columns; } public void setColumns(List columns) { this.columns = columns; } // /** * 添加关联条件 * * @param joinSql * @return */ public Query join(String joinSql) { this.addExpression(new JoinExpression(joinSql)); return this; } /** * 使用key/value进行多个等于的比对,相当于多个eq的效果 * @param map * @return */ public Query allEq(LinkedHashMap map) { Set keys = map.keySet(); for (String columnName : keys) { this.eq(columnName, map.get(columnName)); } return this; } /** * 添加等于条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query eq(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, value)); return this; } /** * 添加不等于条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query notEq(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, "<>", value)); return this; } /** * 添加大于条件,> * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query gt(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, ">", value)); return this; } /** * 大于等于,>= * @param columnName * @param value * @return */ public Query ge(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, ">=", value)); return this; } /** * 添加小于条件,< * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query lt(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, "<", value)); return this; } /** * 小于等于,<= * @param columnName * @param value * @return */ public Query le(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, "<=", value)); return this; } /** * 添加模糊查询条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query like(String columnName, Object value) { this.addExpression(new ValueExpression(columnName, SqlConsts.LIKE, value)); return this; } /** * 添加IN条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query in(String columnName, Collection value) { return this.in(columnName, value, null); } /** * 添加IN条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query in(String columnName, Collection value, ValueConvert valueConvert) { if (value == null || value.size() == 0) { throw new RuntimeException("查询条件:[" + columnName + " in(...)]" + "至少要有一个值."); } Expression expression = valueConvert == null ? new ListExpression(columnName, value) : new ListExpression(columnName, value, valueConvert); this.addExpression(expression); return this; } /** * 添加IN条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query in(String columnName, Object[] value) { if (value == null || value.length == 0) { throw new RuntimeException("查询条件:[" + columnName + " in(...)]" + "至少要有一个值."); } this.addExpression(new ListExpression(columnName, value)); return this; } /** * 添加not in条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query notIn(String columnName, Collection value) { this.addExpression(new ListExpression(columnName, "NOT IN", value)); return this; } /** * 添加not in条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query notIn(String columnName, Collection value, ValueConvert valueConvert) { this.addExpression(new ListExpression(columnName, "NOT IN", value, valueConvert)); return this; } /** * 添加not in条件 * * @param columnName * 数据库字段名 * @param value * 值 * @return */ public Query notIn(String columnName, Object[] value) { this.addExpression(new ListExpression(columnName, "NOT IN", value)); return this; } /** * 添加自定义sql条件 * * @param sql * 自定义sql * @return */ public Query sql(String sql) { this.addExpression(new SqlExpression(sql)); return this; } public Query notNull(String column) { return this.sql(column + " IS NOT NULL"); } public Query isNull(String column) { return this.sql(column + " IS NULL"); } public Query notEmpty(String column) { return this.sql(column + " IS NOT NULL AND " + column + " <> '' "); } public Query isEmpty(String column) { return this.sql(column + " IS NULL OR " + column + " = '' "); } public Query notEq() { return this.sql("1=2"); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy