
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