SpringBoot MongoRepository封装自己的BaseDao

目的:扩展 MongoRepository 提供MongoDB的 update 方法

 

一、SpringBoot 集成MongoDB 引用 spring-boot-starter-data-mongodb 包

<!-- MongoDB 依赖包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

二、spring-boot-starter-data-mongodb包提供的 MongoRepository 提供了各种查询方法和保存方法

@NoRepositoryBean
public interface MongoRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
  <S extends T> List<S> save(Iterable<S> var1);

  List<T> findAll();

  List<T> findAll(Sort var1);

  <S extends T> S insert(S var1);

  <S extends T> List<S> insert(Iterable<S> var1);

  <S extends T> List<S> findAll(Example<S> var1);

  <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

三、创建BaseDao 接口

注意:接口上加上 @NoRepositoryBean注解,避免Spring 扫描

这边添加三个update方法

第一个update方法根据传入的实体Bean中不为空的属性修改MongoDB 数据库

第二个update方法根据ID修改传入的map中的键值对修改MongoDB 数据库

第三个update方法传入修改的条件和修改的值修改MongoDB 数据库

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.Map;

/**
 * @Author chepeiqing
 * @Description mongodb BaseDao
 * @Date 2018/7/12
 * @Time 下午3:01
 * @Version V1.0.0
 */
@NoRepositoryBean
public interface BaseDao<T, ID extends Serializable> extends MongoRepository<T,ID> {

  /**
   * 根据传入的对象 修改
   * @param id
   * @param t
   */
  void update(ID id, T t);

  /**
   * 根据id修改
   * @param id 更新主键
   * @param updateFieldMap  key:需要更新的属性  value:对应的属性值
   */
  void update(ID id, Map<String, Object> updateFieldMap);

  /**
   * 根据传入值修改
   * @param queryFieldMap  key:查询条件的属性  value:对应的属性值
   * @param updateFieldMap  key:需要更新的属性  value:对应的属性值
   */
  void update(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap);
}

四、BaseDao实现类BaseDaoImpl

此处继承 MongoRepository 类的实现方法 SimpleMongoRepository 并实现BaseDao



import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Map;

/**
 * @Author chepeiqing
 * @Description 类说明
 * @Date 2018/7/12
 * @Time 下午3:04
 * @Version V1.0.0
 */
public class BaseDaoImpl<T, ID extends Serializable> extends SimpleMongoRepository<T, ID> implements BaseDao<T, ID> {

  protected final MongoOperations mongoTemplate;

  protected final MongoEntityInformation<T, ID> entityInformation;

  private Class<T> clazz;

  public BaseDaoImpl(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
    super(metadata, mongoOperations);
    this.mongoTemplate = mongoOperations;
    this.entityInformation = metadata;
    clazz = entityInformation.getJavaType();
  }

  /**
   * 修改
   * @param id
   * @param t
   **/
  @Override
  public void update(ID id, T t) {
    Update update = new Update();
    // 获取实体类的所有属性,返回Field数组
    Query query = new Query();
    query.addCriteria(new Criteria("_id").is(id));
    // 利用反射获取部位空的属性值
    Field[] field = clazz.getDeclaredFields();
    for (int i = 0; i < field.length; i++) {
      Field f = field[i];
      // 设置些属性是可以访问的
      f.setAccessible(true);
      try {
        Object object = f.get(t);
        if (object != null) {
          update.set(f.getName(), object);
        }
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      }
    }
    this.mongoTemplate.updateFirst(query, update, clazz);
  }

  /**
   * @param id  更新主键
   * @param updateFieldMap  key:需要更新的属性  value:对应的属性值
   */
  @Override
  public void update(ID id, Map<String, Object> updateFieldMap) {
    if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
      Criteria criteria = new Criteria("_id").is(id);
      Update update = new Update();
      updateFieldMap.forEach(update::set);
      mongoTemplate.updateFirst(new Query(criteria), update, clazz);
    }
  }

  /**
   * @param queryFieldMap  字段名
   * @param updateFieldMap  key:需要更新的属性  value:对应的属性值
   */
  @Override
  public void update(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap) {
    Criteria criteria = new Criteria();
    if (null != queryFieldMap && !queryFieldMap.isEmpty()) {
      queryFieldMap.forEach((key, value) -> criteria.and(key).is(value));
    }

    if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
      Update update = new Update();
      updateFieldMap.forEach(update::set);
      mongoTemplate.updateFirst(new Query(criteria), update, clazz);
    }
  }
}

五、怎么使用

所有的Dao接口继承 BaseDao,不需要写实现类

/**
 * @Author chepeiqing
 * @Description 接口说明
 * @Date 2018/7/16
 * @Time 下午3:33
 * @Version V1.0.0
 */
public interface ImagesDao extends BaseDao<Images, String> {

}

 

六、调用

注入ImagesDao 就可以直接调用 update方法


  @Resource
  private ImagesDao imagesDao;

  public void updateImage(Images images){
    imagesDao.update(images.getId(),images);
  }

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值