SpringBoot整合MongoDB

  • spring-dataMongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。

    • 有两种实现方式

      • dao层接口继承MongoRepository 和 Spring data jpa差不多

      • 通过MongoTemplate实现, 我用的就是这个

  • 导入依赖

    •     <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.1.0.RELEASE</version>
          </parent>
      
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-mongodb</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <groupId>org.mongodb</groupId>
                  <artifactId>mongodb-driver-sync</artifactId>
                  <version>3.9.1</version>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>4.12</version>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>1.18.4</version>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <!-- java编译插件 -->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.2</version>
                      <configuration>
                          <source>1.8</source>
                          <target>1.8</target>
                          <encoding>UTF-8</encoding>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      
      

       

  • 配置文件properties:

    • spring.data.mongodb.uri=mongodb://172.0.0.1:27017/testdb
      //多ip可以使用
      spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database
      

       

  • 定义一个dao层的公共接口

    • import java.io.Serializable;
      import java.util.List;
      import org.springframework.data.domain.Page;
      
      /**
       * 公共的dao接口
       */
      public interface IBaseDao<T> {
      
      	void save(T entity);
      
      	void update(T entity);
      
      	void delete(Serializable... ids);
      
      	T find(Serializable id);
      
      	List<T> findAll();
      
      	List<T> findAll(String order);
      
      	List<T> findByProp(String propName,Object value);
      
      	List<T> findByProp(String propName,Object value,String order);
      
      	List<T> findByProps(String[] propName,Object[] values);
      
      	List<T> findByProps(String[] propName,Object[] values,String order);
      
      	T uniqueByProp(String propName,Object value);
      
      	T uniqueByProps(String[] propName,Object[] values);
      
      	int countByCondition(String[] params,Object[] values);
      }

       

    • 后面的实体dao接口都要继承IBaseDao接口,并且把实体类传入

      • /**
         * 用户的操作接口
         */
        public interface UserDao extends IBaseDao<User>{
        
        }

         

    • 写BaseDaoImpl 实现IBaseDao接口

      • import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.data.annotation.Id;
        import org.springframework.data.domain.Sort;
        import org.springframework.data.domain.Sort.Direction;
        import org.springframework.data.domain.Sort.Order;
        import org.springframework.data.mongodb.core.MongoTemplate;
        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 java.io.Serializable;
        import java.lang.reflect.Field;
        import java.lang.reflect.Method;
        import java.lang.reflect.Modifier;
        import java.util.ArrayList;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;
        
        /**
        *抽象接口 继承类的类 需要重写getEntityClass方法.返还操作的class字节码
        */
        public abstract class BaseDaoImpl<T> implements IBaseDao<T> {
        
            protected abstract Class<T> getEntityClass();
        
            @Autowired
            protected MongoTemplate mongoTemplate;
        
            @Override
            public void save(T entity) {
                mongoTemplate.save(entity);
            }
        
            @Override
            public void update(T entity) {
                Map<String, Object> map = null;
                try {
                    map = parseEntity(entity);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                String id = null;
                Object value = null;
                Update update = new Update();
                if (map != null && map.size() > 0) {
                    for (String key : map.keySet()) {
                        if (key.startsWith("{")) {
                            id = key.substring(key.indexOf("{") + 1, key.indexOf("}"));
                            value = map.get(key);
                        } else {
                            update.set(key, map.get(key));
                        }
                    }
                }
                mongoTemplate.updateFirst(new Query().addCriteria(Criteria.where(id).is(value)), update, getEntityClass());
            }
        
            @Override
            public void delete(Serializable... ids) {
                if (ids != null && ids.length > 0) {
                    for (Serializable id : ids) {
                        mongoTemplate.remove(mongoTemplate.findById(id, getEntityClass()));
                    }
                }
        
            }
        
            @Override
            public T find(Serializable id) {
                return mongoTemplate.findById(id, getEntityClass());
            }
        
            @Override
            public List<T> findAll() {
                return mongoTemplate.findAll(getEntityClass());
            }
        
            @SuppressWarnings("deprecation")
            @Override
            public List<T> findAll(String order) {
                List<Order> orderlist = parseOrder(order);
                if (orderlist == null || orderlist.size() == 0) {
                    return findAll();
                }
        
                return mongoTemplate.find(new Query().with(new Sort(orderlist)), getEntityClass());
            }
        
            @Override
            public List<T> findByProp(String propName, Object value) {
                return findByProp(propName, value, null);
            }
        
            @SuppressWarnings("deprecation")
            @Override
            public List<T> findByProp(String propName, Object value, String order) {
                Query query = new Query();
                query.addCriteria(Criteria.where(propName).is(value));
                List<Order> orderlist = parseOrder(order);
                if (orderlist != null && orderlist.size() > 0) {
                    query.with(new Sort(orderlist));
                }
                return null;
            }
        
            @Override
            public List<T> findByProps(String[] propName, Object[] values) {
                return findByProps(propName, values, null);
            }
        
            @Override
            public List<T> findByProps(String[] propName, Object[] values, String order) {
                Query query = createQuery(propName, values, order);
                return mongoTemplate.find(query, getEntityClass());
            }
        
            @Override
            public T uniqueByProp(String propName, Object value) {
                return mongoTemplate.findOne(new Query().addCriteria(Criteria.where(propName).is(value)), getEntityClass());
            }
        
            @Override
            public T uniqueByProps(String[] propName, Object[] values) {
                Query query = createQuery(propName, values, null);
                return mongoTemplate.findOne(query, getEntityClass());
            }
        
            @Override
            public int countByCondition(String[] params, Object[] values) {
                Query query = createQuery(params, values, null);
                Long count = mongoTemplate.count(query, getEntityClass());
                return count.intValue();
            }
        
        
            protected Map<String, Object> parseEntity(T t) throws Exception {
                Map<String, Object> map = new HashMap<>();
                String id = "";
                Field[] declaredFields = getEntityClass().getDeclaredFields();
                for (Field field : declaredFields) {
                    if (field.isAnnotationPresent(Id.class)) {
                        field.setAccessible(true);
                        map.put("{" + field.getName() + "}", field.get(t));
                        id = field.getName();
                        break;
                    }
                }
        
                Method[] declaredMethods = getEntityClass().getDeclaredMethods();
                if (declaredFields != null && declaredFields.length > 0) {
                    for (Method method : declaredMethods) {
                        if (method.getName().startsWith("get") && method.getModifiers() == Modifier.PUBLIC) {
                            String fieldName = parse2FieldName(method.getName());
                            if (!fieldName.equals(id)) {
                                map.put(fieldName, method.invoke(t));
                            }
                        }
                    }
                }
                return map;
            }
        
            private String parse2FieldName(String method) {
                String name = method.replace("get", "");
                name = name.substring(0, 1).toLowerCase() + name.substring(1);
                return name;
            }
        
            @SuppressWarnings("deprecation")
            public Query createQuery(String[] propName, Object[] values, String order) {
                Query query = new Query();
                //where
                if (propName != null && values != null) {
                    for (int i = 0; i < propName.length; i++) {
                        query.addCriteria(Criteria.where(propName[i]).is(values[i]));
                    }
                }
        
                List<Order> orderlist = parseOrder(order);
                if (orderlist != null && orderlist.size() > 0) {
                    query.with(new Sort(orderlist));
                }
                return query;
            }
        
            public List<Order> parseOrder(String order) {
                List<Order> list = null;
                if (order != null && !"".equals(order)) {
                    list = new ArrayList<>();
                    String[] fields = order.split(",");
                    Order o = null;
                    String[] items = null;
                    for (int i = 0; i < fields.length; i++) {
                        if (fields[i] == null) {
                            continue;
                        }
                        items = fields[i].split(" ");
                        if (items.length == 1) {
                            o = new Order(Direction.ASC, items[0]);
                        } else if (items.length == 2) {
                            o = new Order("desc".equalsIgnoreCase(items[1]) ? Direction.DESC : Direction.ASC, items[0]);
                        } else {
                            throw new RuntimeException("order field parse error");
                        }
                        list.add(o);
                    }
                }
                return list;
            }
        }

         

      • UserDaoImpl 继承BaseDaoImpl 实现UserDao接口

        • @Repository
          public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{
          	@Override
          	protected Class<User> getEntityClass() {
          		return User.class;
          	}
          }

           

      • 然后就可以通过注入来dao接口来实现功能了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值