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

com.easycodebox.jdbc.support.AbstractService Maven / Gradle / Ivy

package com.easycodebox.jdbc.support;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.beanutils.PropertyUtils;

import com.easycodebox.common.enums.DetailEnum;
import com.easycodebox.common.error.BaseException;
import com.easycodebox.common.generator.Generators;
import com.easycodebox.common.lang.StringUtils;
import com.easycodebox.common.lang.dto.DataPage;
import com.easycodebox.common.lang.reflect.ClassUtils;
import com.easycodebox.common.log.slf4j.Logger;
import com.easycodebox.common.log.slf4j.LoggerFactory;
import com.easycodebox.jdbc.LockMode;
import com.easycodebox.jdbc.PkColumn;
import com.easycodebox.jdbc.Property;
import com.easycodebox.jdbc.entity.Entity;
import com.easycodebox.jdbc.grammar.SqlGrammar;
import com.easycodebox.jdbc.util.AnnotateUtils;
import com.easycodebox.jdbc.util.SqlUtils;

/**
 * @author WangXiaoJin
 *
 */
public abstract class AbstractService {
	
	protected final Logger LOG = LoggerFactory.getLogger(getClass());

	@Resource
	private JdbcPreHandler jdbcPreHandler;
	
	@Resource
	private JdbcProcessor jdbcProcessor;
	
	private Class entityClass;
	
	@SuppressWarnings("unchecked")
	public AbstractService() {
		entityClass = ClassUtils.getSuperClassGenricType(getClass());
	}
	
	/**
	 * 实例化SqlGrammar
	 * @return
	 */
	protected  SqlGrammar sql() {
		return sql(entityClass, null);
	}
	
	/**
	 * 实例化SqlGrammar
	 * @return
	 */
	protected  SqlGrammar sql(Class entityClass) {
		return sql(entityClass, null);
	}
	
	/**
	 * 实例化SqlGrammar
	 * @return
	 */
	protected  SqlGrammar sql(Class entityClass, String alias) {
		return StringUtils.isBlank(alias) ? jdbcProcessor.instanceSqlGrammar(entityClass)
				: jdbcProcessor.instanceSqlGrammar(entityClass, alias);
	}
	
	protected int save(T entity) {
		return save(entity, entityClass);
	}
	
	/**
	 * 在这里加上entityClass参数,不是无意义的乱加。而是为了后期修改项目代码时,方便全局搜索定位用的
	 * @param entity
	 * @param entityClass
	 * @return
	 */
	protected  int save(K entity, Class entityClass) {
		try {
			if (jdbcPreHandler != null)
				jdbcPreHandler.beforeSave(entity);
			List pks = AnnotateUtils.getPrimaryKeys(entityClass);
			boolean sqlIncludePk = true;
			for(PkColumn c : pks) {
				Object data = PropertyUtils.getSimpleProperty(entity, c.getName());
				if(data == null) {
					if(c.getGeneratorType() != null) {
						Object pkVal = Generators.getGeneratorNextVal(c.getGeneratorType());
						PropertyUtils.setSimpleProperty(entity, c.getName(), pkVal);
					}else {
						sqlIncludePk = false;
						break;
					}
				}
			}
			String sql = SqlUtils.getInsertSql(entity, 
					com.easycodebox.jdbc.config.Configuration.getTable(entityClass), 
					sqlIncludePk);
			return jdbcProcessor.insert(sql(entityClass), sql, null, int.class);
		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
			throw new BaseException("Execute save entity error.", e);
		}
	}
	
	protected long count(SqlGrammar sqlGrammar) {
		sqlGrammar.countSql(true);
		return get(sqlGrammar, long.class);
	}
	
	/**
	 * 
	 * @param idVal  可以是java中任意数据类型,因为list,set,数组都实现了Serializable接口
	 * @param status
	 * @return
	 * @throws Exception
	 */
	@SafeVarargs
	protected final > int delete(Serializable idVal, V... status) {
		return this.delete(idVal, entityClass, status);
	}
	
	/**
	 * 
	 * @param idVal  可以是java中任意数据类型,因为list,set,数组都实现了Serializable接口
	 * @param status
	 * @return
	 * @throws Exception
	 */
	@SafeVarargs
	protected final > int delete(Serializable idVal, Class entityClass, V... status) {
		List pks = AnnotateUtils.getPrimaryKeys(entityClass);
		SqlGrammar sqlGrammar = sql(entityClass);
		if(status != null && status.length > 0) {
			if(status.length > 1)
				sqlGrammar.in(Property.instance("status", entityClass, false), status);
			else
				sqlGrammar.eq(Property.instance("status", entityClass, false), status[0]);
		}
		if (idVal.getClass().isArray()) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Object[])idVal);
		}else if(idVal instanceof Collection) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Collection)idVal);
		}else {
			sqlGrammar.eq(Property.instance(pks.get(0).getName(), entityClass, false), idVal);
		}
		return delete(sqlGrammar);
	}
	
	protected int delete(SqlGrammar sqlGrammar) {
		return jdbcProcessor.delete(sqlGrammar, null, null, int.class);
	}
	
	/**
	 * 用到此功能时,不能事务回滚
	 * @return
	 */
	protected int truncate() {
		return truncate(entityClass);
	}
	
	/**
	 * 用到此功能时,不能事务回滚
	 * @return
	 */
	protected  int truncate(Class entityClass) {
		String tableName = com.easycodebox.jdbc.config.Configuration.dialect.wrapQuote(
				com.easycodebox.jdbc.config.Configuration.getTable(entityClass).getName());
		return jdbcProcessor.delete(sql(entityClass), "TRUNCATE TABLE " + tableName , null, int.class);
	}
	
	@SafeVarargs
	protected final > boolean exist(Serializable idVal,  V... status) {
		return this.exist(idVal, entityClass, status);
	}
	
	@SafeVarargs
	protected final > boolean exist(Serializable idVal, Class entityClass, V... status) {
		List pks = AnnotateUtils.getPrimaryKeys(entityClass);
		SqlGrammar sqlGrammar = sql(entityClass);
		int valCount = 1;
		if(status != null && status.length > 0) {
			if(status.length > 1)
				sqlGrammar.in(Property.instance("status", entityClass, false), status);
			else
				sqlGrammar.eq(Property.instance("status", entityClass, false), status[0]);
		}
		if (idVal.getClass().isArray()) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Object[])idVal);
			valCount = ((Object[])idVal).length;
		}else if(idVal instanceof Collection) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Collection)idVal);
			valCount = ((Collection)idVal).size();
		}else {
			sqlGrammar.eq(Property.instance(pks.get(0).getName(), entityClass, false), idVal);
		}
		if(count(sqlGrammar) < valCount)
			return false;
		else
			return true;
	}
	
	protected boolean exist(SqlGrammar sqlGrammar) {
		if(count(sqlGrammar) > 0)
			return true;
		else
			return false;
	}
	
	@SafeVarargs
	protected final > T get(Serializable id, V... status) {
		return get(id, (LockMode)null, status);
	}
	
	@SafeVarargs
	protected final > K get(Serializable id, Class entityClass, V... status) {
		return get(id, entityClass, null, status);
	}
	
	@SafeVarargs
	protected final > T get(Serializable id, LockMode lockMode, V... status) {
		return this.get(id, entityClass, lockMode, status);
	}
	
	@SafeVarargs
	protected final > K get(Serializable id, Class entityClass, LockMode lockMode, V... status) {
		List pks = AnnotateUtils.getPrimaryKeys(entityClass);
		SqlGrammar sqlGrammar = sql(entityClass)
				.eq(Property.instance(pks.get(0).getName(), entityClass, false), id);
		if(status != null && status.length > 0) {
			if(status.length > 1)
				sqlGrammar.in(Property.instance("status", entityClass, false), status);
			else
				sqlGrammar.eq(Property.instance("status", entityClass, false), status[0]);
		}
		return get(sqlGrammar.lockMode(lockMode), entityClass);
	}
	
	protected T get(SqlGrammar sqlGrammar) {
		return get(sqlGrammar, entityClass);
	}
	
	protected  K get(SqlGrammar sqlGrammar, Class resultClass) {
		return jdbcProcessor.selectOne(sqlGrammar, null, null, resultClass);
	}
	
	protected List list(SqlGrammar sqlGrammar) {
		return list(sqlGrammar, entityClass);
	}
	
	@SuppressWarnings("unchecked")
	protected  List list(SqlGrammar sqlGrammar, Class resultClass) {
		List result = jdbcProcessor.selectList(sqlGrammar, null, null, resultClass);
		return result == null ? Collections.EMPTY_LIST : result;
	}
	
	protected DataPage page(SqlGrammar sqlGrammar) {
		return page(sqlGrammar, entityClass);
	}
	
	protected  DataPage page(SqlGrammar sg, Class resultClass) {
		//Assert.notNull(sqlGrammar.getPageNo(), "PageNo cant not be null.");
		//Assert.notNull(sqlGrammar.getPageSize(), "PageSize cant not be null.");
		List data = list(sg, resultClass);
		long count = sg.getPageNo() != null && sg.getPageSize() != null ? count(sg) : data.size();
		return new DataPage(sg.getPageNo(), sg.getPageSize(), 
				sg.getPartIndex(), sg.getPartSize(), 
				count, data);
	}
	
	protected int update(SqlGrammar sqlGrammar) {
		if (jdbcPreHandler != null)
			jdbcPreHandler.beforeUpdate(sqlGrammar);
		return jdbcProcessor.update(sqlGrammar, null, null, int.class);
	}
	
	protected int update(T entity) {
		return update(entity, entityClass);
	}
	
	/**
	 * 在这里加上entityClass参数,不是无意义的乱加。而是为了后期修改项目代码时,方便全局搜索定位用的
	 * @param entity
	 * @param entityClass
	 * @return
	 */
	protected  int update(K entity, Class entityClass) {
		try {
			if (jdbcPreHandler != null)
				jdbcPreHandler.beforeUpdate(entity);
			
			String sql = SqlUtils.getUpdateSql(entity, 
					com.easycodebox.jdbc.config.Configuration.getTable(entityClass));
			return jdbcProcessor.update(sql(entityClass), sql, null, int.class);
		} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
			throw new BaseException("Execute update entity error.", e);
		}
	}
	
	protected > int updateStatus(Serializable idVal, V status) {
		return updateStatus(idVal, status, entityClass);
	}
	
	protected > int updateStatus(Serializable idVal, 
			V status, Class entityClass) {
		List pks = AnnotateUtils.getPrimaryKeys(entityClass);
		SqlGrammar sqlGrammar = sql(entityClass)
				.update(Property.instance("status", entityClass, false), status);
		if (idVal.getClass().isArray()) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Object[])idVal);
		}else if(idVal instanceof Collection) {
			sqlGrammar.in(Property.instance(pks.get(0).getName(), entityClass, false), (Collection)idVal);
		}else {
			sqlGrammar.eq(Property.instance(pks.get(0).getName(), entityClass, false), idVal);
		}
		return update(sqlGrammar);
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy