当前位置:   article > 正文

SpringBoot MongoRepository封装自己的BaseDao_java mongobasedao class clazz

java mongobasedao class clazz

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

 

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

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

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

  1. @NoRepositoryBean
  2. public interface MongoRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
  3. <S extends T> List<S> save(Iterable<S> var1);
  4. List<T> findAll();
  5. List<T> findAll(Sort var1);
  6. <S extends T> S insert(S var1);
  7. <S extends T> List<S> insert(Iterable<S> var1);
  8. <S extends T> List<S> findAll(Example<S> var1);
  9. <S extends T> List<S> findAll(Example<S> var1, Sort var2);
  10. }

三、创建BaseDao 接口

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

这边添加三个update方法

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

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

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

  1. import org.springframework.data.mongodb.repository.MongoRepository;
  2. import org.springframework.data.repository.NoRepositoryBean;
  3. import java.io.Serializable;
  4. import java.util.Map;
  5. /**
  6. * @Author chepeiqing
  7. * @Description mongodb BaseDao
  8. * @Date 2018/7/12
  9. * @Time 下午3:01
  10. * @Version V1.0.0
  11. */
  12. @NoRepositoryBean
  13. public interface BaseDao<T, ID extends Serializable> extends MongoRepository<T,ID> {
  14. /**
  15. * 根据传入的对象 修改
  16. * @param id
  17. * @param t
  18. */
  19. void update(ID id, T t);
  20. /**
  21. * 根据id修改
  22. * @param id 更新主键
  23. * @param updateFieldMap key:需要更新的属性 value:对应的属性值
  24. */
  25. void update(ID id, Map<String, Object> updateFieldMap);
  26. /**
  27. * 根据传入值修改
  28. * @param queryFieldMap key:查询条件的属性 value:对应的属性值
  29. * @param updateFieldMap key:需要更新的属性 value:对应的属性值
  30. */
  31. void update(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap);
  32. }

四、BaseDao实现类BaseDaoImpl

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

  1. import org.springframework.data.mongodb.core.MongoOperations;
  2. import org.springframework.data.mongodb.core.query.Criteria;
  3. import org.springframework.data.mongodb.core.query.Query;
  4. import org.springframework.data.mongodb.core.query.Update;
  5. import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
  6. import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
  7. import java.io.Serializable;
  8. import java.lang.reflect.Field;
  9. import java.util.Map;
  10. /**
  11. * @Author chepeiqing
  12. * @Description 类说明
  13. * @Date 2018/7/12
  14. * @Time 下午3:04
  15. * @Version V1.0.0
  16. */
  17. public class BaseDaoImpl<T, ID extends Serializable> extends SimpleMongoRepository<T, ID> implements BaseDao<T, ID> {
  18. protected final MongoOperations mongoTemplate;
  19. protected final MongoEntityInformation<T, ID> entityInformation;
  20. private Class<T> clazz;
  21. public BaseDaoImpl(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
  22. super(metadata, mongoOperations);
  23. this.mongoTemplate = mongoOperations;
  24. this.entityInformation = metadata;
  25. clazz = entityInformation.getJavaType();
  26. }
  27. /**
  28. * 修改
  29. * @param id
  30. * @param t
  31. **/
  32. @Override
  33. public void update(ID id, T t) {
  34. Update update = new Update();
  35. // 获取实体类的所有属性,返回Field数组
  36. Query query = new Query();
  37. query.addCriteria(new Criteria("_id").is(id));
  38. // 利用反射获取部位空的属性值
  39. Field[] field = clazz.getDeclaredFields();
  40. for (int i = 0; i < field.length; i++) {
  41. Field f = field[i];
  42. // 设置些属性是可以访问的
  43. f.setAccessible(true);
  44. try {
  45. Object object = f.get(t);
  46. if (object != null) {
  47. update.set(f.getName(), object);
  48. }
  49. } catch (IllegalAccessException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. this.mongoTemplate.updateFirst(query, update, clazz);
  54. }
  55. /**
  56. * @param id 更新主键
  57. * @param updateFieldMap key:需要更新的属性 value:对应的属性值
  58. */
  59. @Override
  60. public void update(ID id, Map<String, Object> updateFieldMap) {
  61. if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
  62. Criteria criteria = new Criteria("_id").is(id);
  63. Update update = new Update();
  64. updateFieldMap.forEach(update::set);
  65. mongoTemplate.updateFirst(new Query(criteria), update, clazz);
  66. }
  67. }
  68. /**
  69. * @param queryFieldMap 字段名
  70. * @param updateFieldMap key:需要更新的属性 value:对应的属性值
  71. */
  72. @Override
  73. public void update(Map<String, Object> queryFieldMap, Map<String, Object> updateFieldMap) {
  74. Criteria criteria = new Criteria();
  75. if (null != queryFieldMap && !queryFieldMap.isEmpty()) {
  76. queryFieldMap.forEach((key, value) -> criteria.and(key).is(value));
  77. }
  78. if (updateFieldMap != null && !updateFieldMap.isEmpty()) {
  79. Update update = new Update();
  80. updateFieldMap.forEach(update::set);
  81. mongoTemplate.updateFirst(new Query(criteria), update, clazz);
  82. }
  83. }
  84. }

五、怎么使用

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

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

 

六、调用

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

  1. @Resource
  2. private ImagesDao imagesDao;
  3. public void updateImage(Images images){
  4. imagesDao.update(images.getId(),images);
  5. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/55979
推荐阅读
相关标签
  

闽ICP备14008679号