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

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

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


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 DeleteSqlProvider extends AbstractProvider {

	public String delete(T t) throws IllegalAccessException {
		Class entityClass = t.getClass();
		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();

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

				/**
				 * ID字段,必须放在where子句中
				 */
				if (idAnn != null) {
					WHERE("`" + fc.getColumnName() + "` = #{" + field.getName() + "}");
					whereSet = true;
				}
			}
			if (!whereSet) {
				throw new IllegalAccessException("'where' is required.");
			}
			DELETE_FROM(tableNameBuilder.toString());
		}}.toString();
	}

	@SuppressWarnings("unchecked")
	public String deleteByKey(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;
				}

				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.");
			}
			DELETE_FROM(tableNameBuilder.toString());
		}}.toString();
	}

	@SuppressWarnings("unchecked")
	public String deleteByKeySharding(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();

				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.");
			}
			DELETE_FROM(tableNameBuilder.toString());
		}}.toString();
	}

	@SuppressWarnings("unchecked")
	public String deleteByCriteria(Map param) throws IllegalAccessException {
		Class entityClass = (Class) param.get("clz");
		String tbName = getTableName(entityClass);
		StringBuilder tableNameBuilder = new StringBuilder(tbName);
		Criteria criteria = (Criteria) param.get("criteria");
		if (criteria == null || criteria.getParams() == null || criteria.getParams().size() <= 0) {
			throw new IllegalAccessException("'where' is required.");
		}

		Object shardingVal = criteria.getShardingVal();
		List fcList = getPersistFieldList(entityClass);
		return new SQL() {{
			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子句中
						 */
						WHERE("`" + fc.getColumnName() + "` = #{criteria.shardingVal} ");
					}
				}
			}

			WHERE(criteria.toSql());
			DELETE_FROM(tableNameBuilder.toString());
		}}.toString();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy