com.kqinfo.universal.comdao.core.CommonDaoWrap Maven / Gradle / Ivy
The newest version!
package com.kqinfo.universal.comdao.core;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.NonTransientDataAccessResourceException;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ReflectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import static com.kqinfo.universal.comdao.core.SqlBuilder.UP_COMMA;
/**
*
* @author zpj
* @date 2016/10/19
*/
@Slf4j
public class CommonDaoWrap {
private final static String KEY_SELF_SQL = "selfSQL";
@Resource
private CommonDao dao;
/**
* 插入一个实体,主键必须为空,其它属性为空时,插入时忽略该属性
*
* @param params 实体对象
*/
public int insert(T params) {
int insert = dao.insert(params);
if(insert > 0){
ReflectionUtils.doWithFields(params.getClass(), field -> {
field.setAccessible(true);
try {
if (field.get(params) == null) {
if (field.getType() == Long.class) {
field.set(params, selectCountBySQL("select LAST_INSERT_ID()", null));
}
if (field.getType() == Integer.class) {
field.set(params, (int) selectCountBySQL("select LAST_INSERT_ID()", null));
}
}
} catch (IllegalAccessException e) {
log.error(e.getMessage(), e);
}
}, field -> field.isAnnotationPresent(TableId.class));
}
return insert;
}
/**
* 插入一组数据
* 注意这是全字段的插入,如果对应属性为空,在数据库中也会置空。
*
* @param list 需要保存进数据库的实体对象列表
* @return 实际保存的数量
*/
public int insertBatch(List list) {
if (CollectionUtils.isEmpty(list)) {
throw new NonTransientDataAccessResourceException("The list cannot be empty !!!");
}
return dao.insertBatch(list);
}
/**
* 删除一个实体
*
* @param id 主键
* @param cls 实体类型
*/
public int delete(@Param("id") T id, Class> cls) {
return dao.delete(id, cls);
}
/**
* 传入一组实体主键,然后一次性删除
*
* @param ids 主键数组,可以用steam操作完成比如map后得到数组,当然还是new T[]{x1,x2,x3}来得快
* @param cls 实体类型
* @return 实际删除数
*/
public int deleteBatch(T[] ids, Class> cls) {
return dao.deleteBatch(ids, cls);
}
/**
* 修改一个实体,必须有主键,为空的属性将不做更改
*
* @param params 实体对象
* @return 实际更新数
*/
public int update(T params) {
return dao.update(params);
}
/**
* 修改一个实体,必须有主键,实体需要置空的属性可以通过参数nullFieldNams 传入。
* 比如传入 {"name", "age"},那么实体对象中的name和age属性就可以强制为null
*
* @param params 对象
* @param nullFieldNames 空属性名
* @return 实际更新数
*/
public long update(T params, String[] nullFieldNames) {
// 检查是否有错误的字段名
SqlBuilder sbr = new SqlBuilder();
StringBuilder sql = new StringBuilder(sbr.update(params));
int idx = sql.indexOf("SET");
if (nullFieldNames != null) {
final StringBuilder nullSql = new StringBuilder();
Stream.of(nullFieldNames).forEach(n -> nullSql.append(UP_COMMA).append(n).append(UP_COMMA).append(" = null, "));
sql.insert(idx + 4, nullSql);
}
return updateSql(sql.toString(), BeanUtil.beanToMap(params));
}
/**
* 根据实体的主键,找到实体
*
* @param id 主键
* @param cls 实体类型
* @return 满足主键的实体对象
*/
public R select(@Param("id") T id, Class cls) {
Map,?> rs = dao.select(id, cls);
return BeanUtil.mapToBean(rs, cls, false, CopyOptions.create());
}
/**
* 根据实体条件进行查询,
*
* @param params 实体参数,只能等于
* @return 不会返回空,请放心使用
*/
public List selectList(T params) {
List