Java基于MongoDB Template封装Dao层

mongoDB Template 提供了许多直接操作Mongo的方法, 在此基础上在进行一层封装, 用起来更顺手

1.Dao层的抽象类, 封装了常用的几个方法
tips: 对实体有要求, 属性不同, 一些私有方法请自行修改

/**
 * @author Lynn
 * @version 2022/08/15
 */
@SuppressWarnings(value = {"unchecked"})
public abstract class AbstractMongoDaoImpl<T extends BaseFeedEntity> {

    @Autowired
    MongoTemplate mongoTemplate;

    /**
     * 分页查询
     *
     * @param entity {@link T}
     * @return {@link PageInfo<T>}
     */
    public PageInfo<T> queryPage(T entity) {
        Query query = this.buildQueryCriteria(entity);
        long total = mongoTemplate.count(query, entity.getClass());
        if (total == 0) {
            return PageInfo.of(Lists.newArrayList());
        }
        List<T> pageList = (List<T>) mongoTemplate.find(query.limit(entity.getPageSize()).skip((entity.getPageNum() - 1) * entity.getPageSize()), entity.getClass());
        PageInfo<T> pageInfo = PageInfo.of(pageList);
        pageInfo.setTotal(total);
        pageInfo.setPageNum(entity.getPageNum());
        pageInfo.setPageSize(entity.getPageSize());
        pageInfo.setPages((int) (total / entity.getPageSize() + (total % entity.getPageSize() != 0 ? 1 : 0)));
        return pageInfo;
    }

    /**
     * 列表查询
     *
     * @param entity {@link T}
     * @return {@link List<T>}
     */
    public List<T> queryList(T entity) {
        return (List<T>) mongoTemplate.find(this.buildQueryCriteria(entity), entity.getClass());
    }

    /**
     * 查询记录条数
     *
     * @param entity {@link T}
     * @return 记录条数
     */
    public long count(T entity) {
        return mongoTemplate.count(this.buildQueryCriteria(entity), entity.getClass());
    }

    /**
     * 详情查询
     *
     * @param entity {@link T}
     * @return {@link T}
     */
    public T findOne(T entity) {
        return (T) mongoTemplate.findOne(this.buildQueryCriteria(entity), entity.getClass());
    }

    /**
     * 根据主键查询详情
     *
     * @param entity {@link T}
     * @return {@link T}
     */
    public T findById(T entity) {
        return (T) mongoTemplate.findById(entity.getId(), entity.getClass());
    }

    /**
     * 新增
     *
     * @param entity {@link T}
     * @return ObjectId
     */
    public String insert(T entity) {
        this.handleInsertInfo(entity);
        T ins = mongoTemplate.insert(entity);
        return ins.getId();
    }

    /**
     * 根据主键更新
     *
     * @param entity {@link T}
     * @return {@link Boolean}
     */
    public boolean save(T entity) {
        T originEntity = findById(entity);
        if (null != originEntity) {
            BeanUtil.copyProperties(entity, originEntity, CopyOptions.create().setIgnoreNullValue(true));
            this.handleUpdateInfo(originEntity);
            mongoTemplate.save(originEntity);
            return true;
        }
        return false;
    }

    /**
     * 根据主键删除
     *
     * @param entity {@link T}
     * @return {@link Boolean}
     */
    public boolean deleteById(T entity) {
        T originEntity = findById(entity);
        if (null != originEntity) {
            this.handleDeleteInfo(originEntity);
            mongoTemplate.save(originEntity);
            return true;
        }
        return false;
    }

    /**
     * 组装查询条件
     *
     * @param entity {@link T}
     * @return {@link Query}
     */
    abstract Query buildQueryCriteria(T entity);

    /**
     * 组装更新基础参数
     *
     * @param entity {@link T}
     */
    private void handleUpdateInfo(T entity) {
        if (Objects.isNull(entity)) {
            return;
        }
        entity.setUpdateTime(new Date());
        entity.setUpdateBy(IAuthService.getUserId());
    }

    /**
     * 组装新增基础参数
     *
     * @param entity {@link T}
     */
    private void handleInsertInfo(T entity) {
        this.handleUpdateInfo(entity);
        entity.setCreateTime(new Date());
        entity.setCreatedBy(IAuthService.getUserId());
    }

    /**
     * 组装删除基础参数
     *
     * @param entity {@link T}
     */
    private void handleDeleteInfo(T entity) {
        this.handleUpdateInfo(entity);
        entity.setDelFlag(true);
    }
}
  1. 通用Dao层接口
    和抽象类里暴露的方法是对应的
/**
 * @author Lynn
 * @date 2022/08/15
 */
public interface CommonMongoDao<T> {

    /**
     * 分页查询
     *
     * @param entity {@link T}
     * @return {@link PageInfo <T>}
     */
    PageInfo<T> queryPage(T entity);

    /**
     * 列表查询
     *
     * @param entity {@link T}
     * @return {@link List<T>}
     */
    List<T> queryList(T entity);

    /**
     * 查询记录条数
     *
     * @param entity {@link T}
     * @return 记录条数
     */
    long count(T entity);

    /**
     * 详情查询
     *
     * @param entity {@link T}
     * @return {@link T}
     */
    T findOne(T entity);

    /**
     * 根据主键查询详情
     *
     * @param entity {@link T}
     * @return {@link T}
     */
    T findById(T entity);

    /**
     * 新增
     *
     * @param entity {@link T}
     * @return ObjectId
     */
    String insert(T entity);

    /**
     * 根据主键更新
     *
     * @param entity {@link T}
     * @return {@link Boolean}
     */
    boolean save(T entity);

    /**
     * 根据主键删除
     *
     * @param entity {@link T}
     * @return {@link Boolean}
     */
    boolean deleteById(T entity);
}
  1. 子类Dao层接口
    子类Dao层接口继承通用Dao层接口, 内部只需写自己独有的方法即可
/**
 * @author Lynn
 * @date 2022/08/15
 */
interface ReserveOrderDao extends CommonMongoDao<ReserveOrderEntity> {

    /**
     * 统计免费单数量
     *
     * @param entity {@link ReserveOrderEntity}
     * @return {@link Long}
     */
    long countFreeOrders(ReserveOrderEntity entity);
}
  1. 子类Dao层实现
    子类Dao层实现只需要实现独有的方法, 以及实现抽象类中抽象方法即可
/**
 * @author Lynn
 * @version 2022/08/15
 */
@Repository("reserveOrderDao")
public class ReserveOrderDaoImpl extends AbstractMongoDaoImpl<ReserveOrderEntity> implements ReserveOrderDao {

    @Override
    public long countFreeOrders(ReserveOrderEntity entity) {
        return super.mongoTemplate.count(this.buildCountFreeOrderCriteria(entity), ReserveOrderEntity.class);
    }

    @Override
    public Query buildQueryCriteria(ReserveOrderEntity entity) {
        Criteria criteria = new Criteria();
        criteria.and("delFlag").is(false);

        if (StringUtils.isNotBlank(entity.getFeedId())) {
            criteria.and("feedInfos.feedId").is(entity.getFeedId());
        }
        if (StringUtils.isNotBlank(entity.getIdentityNo())) {
            criteria.and("reserveCustomer.idNo").is(entity.getIdentityNo());
        }
        if (StringUtils.isNotBlank(entity.getTenantId())) {
            criteria.and("tenantId").is(entity.getTenantId());
        }
        if (StringUtils.isNotBlank(entity.getOrgId())) {
            criteria.and("orgId").is(entity.getOrgId());
        }
        if (StringUtils.isBlank(entity.getOrgId()) && CollectionUtils.isNotEmpty(entity.getOrgIds())) {
            criteria.and("orgId").in(entity.getOrgIds());
        }
        if (entity.getServeTimeMin() != null) {
            criteria.and("serveTime").gte(entity.getServeTimeMin());
        }
        if (entity.getServeTimeMax() != null) {
            criteria.and("serveTime").lte(entity.getServeTimeMax());
        }
        Query query = new Query(criteria);
        query.with(Sort.by(Sort.Direction.DESC, "createTime"));
        return query;
    }

    private Query buildCountFreeOrderCriteria(ReserveOrderEntity entity) {
        Criteria criteria = new Criteria();
        criteria.and("delFlag").is(false);

        if (StringUtils.isNotBlank(entity.getFeedId())) {
            criteria.and("feedInfos.feedId").is(entity.getFeedId());
        }
        if (StringUtils.isNotBlank(entity.getIdentityNo())) {
            criteria.and("reserveCustomer.idNo").is(entity.getIdentityNo());
        }
        criteria.and("status").ne(OrderStatusEnum.CANCEL.getState());
        criteria.and("freeOrder").is(true);
        if (entity.getStartTime() != null && entity.getEndTime() != null) {
            criteria.and("createTime").gte(entity.getStartTime()).lte(entity.getEndTime());
        }
        if (StringUtils.isNotBlank(entity.getTenantId())) {
            criteria.and("tenantId").is(entity.getTenantId());
        }
        if (StringUtils.isNotBlank(entity.getOrgId())) {
            criteria.and("orgId").is(entity.getOrgId());
        }
        return new Query(criteria);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于MongoDB实现的图书管理系统是一个使用Java语言开发的应用程序,它帮助图书馆或书店管理图书馆藏和借还记录等相关业务。 首先,该系统使用MongoDB作为数据库,因为MongoDB是一个非关系型数据库,它具有高扩展性、高性能和灵活的数据模型。与传统的关系型数据库相比,MongoDB更适合存储大量数据,并且可以轻松处理图书馆所需的不同类型的数据。 该系统的源代码包括以下几个主要模块: 1. 登录和权限管理模块:用户可以通过登录验证身份,并且根据其权限级别访问不同的功能。例如,管理员可以管理图书库存和使用者记录,而普通用户只能查看图书信息并进行借阅操作。 2. 图书数据管理模块:该模块用于管理图书的基本信息,例如书名、作者、出版社等。管理员可以添加、编辑和删除图书信息,并将其存储在MongoDB数据库中。同时,该模块还提供了搜索和过滤功能,以方便用户查找特定图书。 3. 借还管理模块:该模块用于记录图书的借阅和归还情况。用户可以通过扫描图书的条形码或输入图书编号进行借阅操作,并在归还时确认归还图书。该模块还会生成借阅记录,并根据规定的借阅期限和规则发送提醒。 4. 统计和报表模块:该模块用于生成图书馆的统计数据和报表,如借阅率、图书馆藏量、常借图书排行榜等。管理员可以通过该模块了解图书馆的使用情况,并做出相应的决策。 总之,这个基于MongoDB的图书管理系统源码是一个功能完善且易于使用的应用程序,它能够有效地帮助图书馆管理图书馆藏和借还记录,并提供了统计和报表功能,以支持图书馆的决策制定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值