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

com.yuweix.tripod.dao.mybatis.provider.SelectSqlProvider Maven / Gradle / Ivy

package com.yuweix.tripod.dao.mybatis.provider;


import com.yuweix.tripod.dao.mybatis.order.OrderBy;
import com.yuweix.tripod.dao.mybatis.where.Criteria;
import com.yuweix.tripod.dao.sharding.Sharding;
import org.apache.ibatis.jdbc.SQL;

import javax.persistence.Id;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;


/**
 * @author yuwei
 */
public class SelectSqlProvider extends AbstractProvider {
	@SuppressWarnings("unchecked")
	public String selectOneById(Map param) throws IllegalAccessException {
//		PK id = (PK) param.get("id");
		Class entityClass = (Class) param.get("clz");
		StringBuilder tableNameBuilder = new StringBuilder(getTableName(entityClass));
		
		List fcList = getPersistFieldList(entityClass);
		return new SQL() {{
			boolean hasSharding = false;
			boolean whereSet = false;
			for (FieldColumn fc: fcList) {
				Field field = fc.getField();

				Sharding sharding = field.getAnnotation(Sharding.class);
				if (sharding != null) {
					hasSharding = true;
					break;
				}

				SELECT(fc.getColumnName() + " as " + field.getName());
				
				Id idAnn = field.getAnnotation(Id.class);
				if (idAnn != null) {
					WHERE(fc.getColumnName() + " = #{id}");
					whereSet = true;
				}
			}
			if (hasSharding) {
				throw new IllegalAccessException("'Sharding Value' is required.");
			}
			if (!whereSet) {
				throw new IllegalAccessException("'where' is required.");
			}
			FROM(tableNameBuilder.toString());
		}}.toString();
	}

	@SuppressWarnings("unchecked")
	public String selectOneByIdSharding(Map param) throws IllegalAccessException {
//		PK id = (PK) param.get("id");
		Class entityClass = (Class) param.get("clz");
		Object shardingVal = param.get("shardingVal");
		String tbName = getTableName(entityClass);
		StringBuilder tableNameBuilder = new StringBuilder(tbName);

		List fcList = getPersistFieldList(entityClass);
		return new SQL() {{
			boolean whereSet = false;
			for (FieldColumn fc: fcList) {
				Field field = fc.getField();
				SELECT(fc.getColumnName() + " as " + field.getName());

				String shardingIndex = getShardingIndex(field.getAnnotation(Sharding.class), tbName, shardingVal);
				Id idAnn = field.getAnnotation(Id.class);
				if (shardingIndex != null) {
					tableNameBuilder.append("_").append(shardingIndex);
					/**
					 * 分片字段,必须放在where子句中
					 */
					WHERE("`" + fc.getColumnName() + "` = #{shardingVal}");
					if (idAnn != null) {
						whereSet = true;
					}
					continue;
				}

				if (idAnn != null) {
					WHERE(fc.getColumnName() + " = #{id}");
					whereSet = true;
				}
			}
			if (!whereSet) {
				throw new IllegalAccessException("'where' is required.");
			}
			FROM(tableNameBuilder.toString());
		}}.toString();
	}

	@SuppressWarnings("unchecked")
	public String findCount(Map param) throws IllegalAccessException {
		Criteria criteria = (Criteria) param.get("criteria");
		Class entityClass = (Class) param.get("clazz");
		String tbName = getTableName(entityClass);
		StringBuilder tableNameBuilder = new StringBuilder(tbName);

		Object shardingVal = criteria == null ? null : criteria.getShardingVal();
		List fcList = getPersistFieldList(entityClass);

		String shardingWhere = null;
		for (FieldColumn fc: fcList) {
			Field field = fc.getField();
			Sharding sharding = field.getAnnotation(Sharding.class);
			if (sharding != null) {
				if (shardingVal == null) {
					throw new IllegalAccessException("'Sharding Value' is required.");
				}
				String shardingIndex = getShardingIndex(sharding, tbName, shardingVal);
				if (shardingIndex != null) {
					tableNameBuilder.append("_").append(shardingIndex);
					/**
					 * 分片字段,必须放在where子句中
					 */
					shardingWhere = "`" + fc.getColumnName() + "` = #{criteria.shardingVal} ";
				}
			}
		}

		StringBuilder builder = new StringBuilder("");
		builder.append(" select count(1) as cnt ");
		builder.append(" from ").append(tableNameBuilder.toString()).append("  ");
		if (shardingWhere == null) {
			builder.append(" where 1 = 1 ");
		} else {
			builder.append(" where ").append(shardingWhere);
		}

		if (criteria != null) {
			String criteriaSql = criteria.toSql();
			if (criteriaSql != null && !"".equals(criteriaSql.trim())) {
				builder.append(" and ").append(criteriaSql).append(" ");
			}
		}

		return builder.toString();
	}

	@SuppressWarnings("unchecked")
	public String findList(Map param) throws IllegalAccessException {
		Criteria criteria = (Criteria) param.get("criteria");
		OrderBy orderBy = (OrderBy) param.get("orderBy");
		Class entityClass = (Class) param.get("clazz");
		Integer pageNo0 = null;
		if (param.containsKey("pageNo")) {
			pageNo0 = (Integer) param.get("pageNo");
		}
		Integer pageSize0 = null;
		if (param.containsKey("pageSize")) {
			pageSize0 = (Integer) param.get("pageSize");
		}
		String tbName = getTableName(entityClass);
		StringBuilder tableNameBuilder = new StringBuilder(tbName);

		Object shardingVal = criteria == null ? null : criteria.getShardingVal();
		List fcList = getPersistFieldList(entityClass);

		String shardingWhere = null;
		for (FieldColumn fc: fcList) {
			Field field = fc.getField();
			Sharding sharding = field.getAnnotation(Sharding.class);
			if (sharding != null) {
				if (shardingVal == null) {
					throw new IllegalAccessException("'Sharding Value' is required.");
				}
				String shardingIndex = getShardingIndex(sharding, tbName, shardingVal);
				if (shardingIndex != null) {
					tableNameBuilder.append("_").append(shardingIndex);
					/**
					 * 分片字段,必须放在where子句中
					 */
					shardingWhere = "`" + fc.getColumnName() + "` = #{criteria.shardingVal} ";
				}
			}
		}

		StringBuilder builder = new StringBuilder("");
		builder.append(" select ").append(getAllColumnSql(entityClass));
		builder.append(" from ").append(tableNameBuilder.toString()).append("  ");
		if (shardingWhere == null) {
			builder.append(" where 1 = 1 ");
		} else {
			builder.append(" where ").append(shardingWhere);
		}

		if (criteria != null) {
			String criteriaSql = criteria.toSql();
			if (criteriaSql != null && !"".equals(criteriaSql.trim())) {
				builder.append(" and ").append(criteriaSql).append(" ");
			}
		}

		if (orderBy != null) {
			String orderBySql = orderBy.toSql();
			if (orderBySql != null && !"".equals(orderBySql.trim())) {
				builder.append(" order by ").append(orderBySql.trim()).append(" ");
			}
		}

		if (pageNo0 != null && pageSize0 != null) {
			int pageNo = pageNo0 <= 0 ? 1 : pageNo0;
			int pageSize = pageSize0 <= 0 ? 10 : pageSize0;

			builder.append(" limit ").append((pageNo - 1) * pageSize).append(", ").append(pageSize);
		}
		return builder.toString();
	}
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy