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

site.sorghum.anno.db.dao.AnnoBaseDao Maven / Gradle / Ivy

The newest version!
package site.sorghum.anno.db.dao;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import site.sorghum.anno._common.AnnoBeanUtils;
import site.sorghum.anno._common.util.GenericsUtil;
import site.sorghum.anno._metadata.AnEntity;
import site.sorghum.anno._metadata.MetadataManager;
import site.sorghum.anno.anno.entity.common.AnnoPage;
import site.sorghum.anno.db.DbCriteria;
import site.sorghum.anno.db.exception.AnnoDbException;
import site.sorghum.anno.db.service.DbService;
import site.sorghum.anno.db.service.context.AnnoDbContext;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Anno基准dao
 *
 * @author Sorghum
 * @since 2024/01/29
 */
public interface AnnoBaseDao {

    AtomicReference DB_SERVICE = new AtomicReference<>();

    AtomicReference METADATA_MANAGER = new AtomicReference<>();

    /**
     * 按id查找
     *
     * @param id 身份证件
     * @return {@link T}
     */
    default T findById(Serializable id) {
        return dbService().queryOne(
            DbCriteria.fromClass(entityClass()).eq(getPkDbFieldName(), id)
        );
    }

    /**
     * 按条件查找一个
     *
     * @param criteria 查询条件
     * @return {@link T}
     */
    default T findOne(DbCriteria criteria) {
        return dbService().queryOne(
            criteria
        );
    }

    /**
     * 按id查找选项
     *
     * @param id id
     * @return {@link Optional}<{@link T}>
     */
    default Optional findByIdOpt(Serializable id) {
        return Optional.ofNullable(dbService().queryOne(
            DbCriteria.fromClass(entityClass()).eq(getPkDbFieldName(), id)
        ));
    }

    /**
     * 按ID查找
     *
     * @param ids ids
     * @return {@link List}<{@link T}>
     */
    default List findByIds(List ids) {
        if (CollUtil.isEmpty(ids)) {
            return new LinkedList<>();
        }
        return list(DbCriteria.fromClass(entityClass()).in("id", ids.toArray()));
    }


    /**
     * 按id删除
     *
     * @param id 身份证件
     * @return int
     */
    default int deleteById(Serializable id) {
        return dbService().delete(
            DbCriteria.fromClass(entityClass()).eq(getPkDbFieldName(), id)
        );
    }

    /**
     * 删去
     *
     * @param dbCriteria db标准
     * @return int
     */
    default int delete(DbCriteria dbCriteria) {
        return dbService().delete(dbCriteria);
    }

    /**
     * 插入
     *
     * @param t t
     * @return long
     */
    default long insert(T t) {
        return dbService().insert(t);
    }

    /**
     * 插入列表
     *
     * @param list 列表
     * @return long
     */
    default long insertList(List list) {
        long num = 0;
        for (T t : list) {
            num = num + insert(t);
        }
        return num;
    }

    /**
     * 按id列表更新
     *
     * @param list 列表
     * @return long
     */
    default long updateByIdList(List list) {
        long num = 0;
        for (T t : list) {
            num = num + updateById(t);
        }
        return num;
    }

    /**
     * 按id更新
     *
     * @param t t
     * @return int
     */
    default int updateById(T t) {
        Object id = ReflectUtil.getFieldValue(t, getPkJavaFieldName());
        if (StrUtil.isEmptyIfStr(id)) {
            throw new AnnoDbException("UnKnow %s's id field or id field's value is empty.".formatted(entityClass()));
        }
        return dbService().update(t, DbCriteria.fromClass(entityClass()).eq(getPkDbFieldName(), id));
    }


    /**
     * 使现代化
     *
     * @param t          t
     * @param dbCriteria db标准
     * @return int
     */
    default int update(T t, DbCriteria dbCriteria) {
        return dbService().update(t, dbCriteria);
    }

    /**
     * 列表
     *
     * @return {@link List}<{@link T}>
     */
    default List list() {
        return dbService().list(DbCriteria.fromClass(entityClass()));
    }

    /**
     * 列表
     *
     * @param dbCriteria db标准
     * @return {@link List}<{@link T}>
     */
    default List list(DbCriteria dbCriteria) {
        return dbService().list(dbCriteria);
    }

    /**
     * 分页
     *
     * @param currentPage 当前页面
     * @param pageSize    页大小
     * @return {@link AnnoPage}<{@link T}>
     */
    default AnnoPage page(int currentPage, int pageSize) {
        DbCriteria dbCriteria = DbCriteria.fromClass(entityClass());
        dbCriteria.page(currentPage, pageSize);
        return dbService().page(dbCriteria);
    }

    /**
     * 分页
     *
     * @param dbCriteria db标准
     * @return {@link AnnoPage}<{@link T}>
     */
    default AnnoPage page(DbCriteria dbCriteria) {
        return dbService().page(dbCriteria);
    }


    /**
     * 插入或更新
     *
     * @param t t
     * @return int
     */
    default long insertOrUpdate(T t) {
        String pkJavaFieldName = getPkJavaFieldName();
        Object id = ReflectUtil.getFieldValue(t, pkJavaFieldName);
        if (id == null || StrUtil.isBlankIfStr(id)) {
            ReflectUtil.setFieldValue(t, pkJavaFieldName, IdUtil.getSnowflakeNextIdStr());
            return insert(t);
        } else {
            return updateById(t);
        }
    }

    /**
     * 保存或更新
     *
     * @param t t
     * @return int
     */
    default long saveOrUpdate(T t) {
        return insertOrUpdate(t);
    }

    /**
     * 计数
     *
     * @param dbCriteria db标准
     * @return long
     */
    default long count(DbCriteria dbCriteria) {
        return AnnoDbContext.dynamicDbContext(
            anEntity().dbName(),
            () -> {
                return dbService().count(dbCriteria);
            }
        );
    }

    /**
     * sql查询一个
     *
     * @param sql    sql
     * @param params params
     * @return {@link T}
     */
    default T sqlOne(String sql, Object... params) {
        return AnnoDbContext.dynamicDbContext(
            anEntity().dbName(),
            () -> {
                return dbService().sqlQueryOne(
                    entityClass(), sql, params
                );
            }
        );
    }

    /**
     * sql查询列表
     *
     * @param sql    sql
     * @param params params
     * @return {@link List}<{@link T}>
     */
    default List sqlList(String sql, Object... params) {
        return AnnoDbContext.dynamicDbContext(
            anEntity().dbName(),
            () -> {
                return dbService().sqlQueryList(
                    entityClass(), sql, params
                );
            }
        );
    }

    /**
     * db标准
     * 查询包装器
     *
     * @return {@link DbCriteria}
     */
    default DbCriteria dbCriteria(){
        return DbCriteria.fromClass(entityClass());
    }

    /**
     * 获取pk-db字段名
     *
     * @return {@link String}
     */
    default String getPkDbFieldName() {
        return metadataManager().getEntity(entityClass()).getPkField().getTableFieldName();
    }

    /**
     * 获取pk-java字段名
     *
     * @return {@link String}
     */
    default String getPkJavaFieldName() {
        return metadataManager().getEntity(entityClass()).getPkField().getJavaName();
    }



    /**
     * 数据库服务
     *
     * @return {@link DbService}
     */
    default DbService dbService(){
        if (DB_SERVICE.get() == null){
            DB_SERVICE.set(AnnoBeanUtils.getBean(DbService.class));
        }
        return DB_SERVICE.get();
    };

    /**
     * 元数据管理器
     *
     * @return {@link MetadataManager}
     */
    default MetadataManager metadataManager(){
        if (METADATA_MANAGER.get() == null){
            METADATA_MANAGER.set(AnnoBeanUtils.getBean(MetadataManager.class));
        }
        return METADATA_MANAGER.get();
    }

    default AnEntity anEntity(){
        return metadataManager().getEntity(this.entityClass());
    }

    /**
     * 实体类
     *
     * @return {@link Class}<{@link T}>
     */
    default Class entityClass(){
        Class nowClass = this.getClass();
        return (Class) GenericsUtil.getInterfaceGenericsType(nowClass, AnnoBaseDao.class, 0);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy