1.集成简介

spring-data-mongodb,提供了MongoTemplate与 MongoRepository,两种方式访问mongodb,MongoRepository,操作简单,MongoTemplate,操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,
MongoTemplate 正好可以弥补不足。

2.搭建开发环境

  • 初始化工程
    使用Spring Initaalizr 快速初始化一个Spring Boot工程
    Group :com.zhoujk
    Artifact:mongodb
  • 引入依赖
    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-data-mongodb</artifactId>
    8. </dependency>
    9. <dependency>
    10. <groupId>org.springframework.boot</groupId>
    11. <artifactId>spring-boot-starter-web</artifactId>
    12. </dependency>
    13. <dependency>
    14. <groupId>org.projectlombok</groupId>
    15. <artifactId>lombok</artifactId>
    16. <optional>true</optional>
    17. </dependency>
    18. <dependency>
    19. <groupId>joda-time</groupId>
    20. <artifactId>joda-time</artifactId>
    21. <version>2.10.1</version>
    22. </dependency>
    23. <dependency>
    24. <groupId>org.springframework.boot</groupId>
    25. <artifactId>spring-boot-starter-test</artifactId>
    26. <scope>test</scope>
    27. <exclusions>
    28. <exclusion>
    29. <groupId>org.junit.vintage</groupId>
    30. <artifactId>junit-vintage-engine</artifactId>
    31. </exclusion>
    32. </exclusions>
    33. </dependency>
  • 添加配置
    spring.data.mongodb.uri=mongodb://localhost:27017/test
    

3.基于MongoBDTeplate开发

  • 添加实体
@Data
@Document("User")
public class User {
    @Id
    private String id;
    private String name;
    private Integer age;
    private String email;
    private String createDate;
}
  • 实现mongoTemplate
    //注入mongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;
  • 添加测试类
//添加操作
    @Test
    public void create() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(20);
        user.setEmail("1348571853@qq.com");
        User user1 = mongoTemplate.insert(user);
        System.out.println(user1);
    }


    //查询所有的数据
    @Test
    public void findAll() {
        List<User> all = mongoTemplate.findAll(User.class);
        System.out.println(all);
    }

    //id查询
    @Test
    public void findId() {
        User user = mongoTemplate.findById("622747932ea3370da71930fd", User.class);
        System.out.println(user);
    }

    //条件查询
    @Test
    public void findUserList() {
        //查询  name=zhangsan and  age =20
        Criteria criteria = Criteria.where("name").is("zhangsan").and("age").is(20);
        Query query = new Query(criteria);
        List<User> users = (List<User>) mongoTemplate.find(query, User.class);
        System.out.println(users);
    }

    //模糊查询
    @Test
    public void findLikeUserList() {
        //    查询名字以"zhang"开头的
        String name = "zhang";
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Criteria criteria = Criteria.where("name").regex(pattern);
        Query query = new Query(criteria);
        List<User> users = (List<User>) mongoTemplate.find(query, User.class);
        System.out.println(users);
    }

    //分页查询
    @Test
    public void findPageUserList() {
        int PageNo = 1;
        int PageSize = 2;
        String name = "zhang";
        String regex = String.format("%s%s%s", "^.*", name, ".*$");
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Criteria criteria = Criteria.where("name").regex(pattern);
        Query query = new Query(criteria);

        //分页构建

        //查询记录数
        long count = mongoTemplate.count(query, User.class);
        //分页
        List<User> users = mongoTemplate.find(query.skip((PageNo - 1) * PageSize).limit(PageSize), User.class);
        System.out.println(count);
        System.out.println(users);

    }

    //修改
    @Test
    public void updateUser() {
        //根据Id查询
        User user = mongoTemplate.findById("622747932ea3370da71930fd", User.class);

        //设置修改值
        user.setName("zhangsanfeng");
        user.setEmail("123456789@qq.com");
        user.setAge(60);

        //调用方法实现修改
        Criteria criteria = Criteria.where("_id").is(user.getId());
        Query query = new Query(criteria);
        Update update = new Update();
        update.set("name", user.getName());
        update.set("age", user.getAge());
        update.set("email", user.getEmail());

        UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
        long modifiedCount = upsert.getModifiedCount();
        System.out.println(modifiedCount);

    }

    //删除操作
    @Test
    public void daleteUser() {
        Criteria criteria  = Criteria.where("_Id").is("622747932ea3370da71930fd");
        Query query = new Query(criteria);
        DeleteResult remove = mongoTemplate.remove(query, User.class);
        long deleteCount = remove.getDeletedCount();
        System.out.println(deleteCount);

    }

4.基于MongoDBRepository开发

  • 实体类
同上
  • 添加Repository类
  //注入userRepository
@Autowired
    private UserRepository userRepository;
  • 实现类
//实现方法的源码
public long count() {
    return this.mongoOperations.getCollection(this.entityInformation.getCollectionName()).count();
}

//返回值是long类型,功能:统计表中的数据条数
@Service
public class UserServiceImpl {
    @Autowired
    private UserRepository userRepository;

    public long getCOuntofUser(){
        return userRepository.count();
    } 
}
//实现方法的源码
public <S extends T> long count(Example<S> example) {
    Assert.notNull(example, "Sample must not be null!");
    Query q = new Query((new Criteria()).alike(example));
    return this.mongoOperations.count(q, example.getProbeType(), this.entityInformation.getCollectionName());
}

//返回值是long类型,功能:有条件的统计表中的数据条数
@Service
public class UserServiceImpl {
    @Autowired
    private UserRepository userRepository;

    public long getCOuntofUser(User user){
        Example<User> example = Example.of(user);
        return userRepository.count();
    } 
}
//实现方法的源码,底层还是通过id删除
 public void delete(T entity) {
    Assert.notNull(entity, "The given entity must not be null!");
    this.delete(this.entityInformation.getId(entity));
 }

 //返回值是void类型,功能:删除表中一条数据
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public void deleteOneUser(User user){
        userRepository.delete(user);
     } 
 }
 //实现方法的源码,底层还是通过id删除
 public void delete(ID id) {
     Assert.notNull(id, "The given id must not be null!");
    this.mongoOperations.remove(this.getIdQuery(id), this.entityInformation.getJavaType(), this.entityInformation.getCollectionName());
 }

 //返回值是void类型,功能:删除表中一条数据
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public void deleteOneUser(String id){
        userRepository.delete(user);
     } 
 }
 //实现方法的源码,批量删除,底层还是通过id删除
public void delete(Iterable<? extends T> entities) {
    Assert.notNull(entities, "The given Iterable of entities not be null!");
    Iterator var2 = entities.iterator();
    while(var2.hasNext()) {
        T entity = var2.next();
        this.delete(entity);
    }
}

 //返回值是void类型,功能:批量删除
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public void deleteUsers(List<User> users){
        userRepository.delete(users);
     } 
 }
 //实现方法的源码
public void deleteAll() {
    this.mongoOperations.remove(new Query(), this.entityInformation.getCollectionName());
}

 //返回值是void类型,功能:情空表中所有的数据
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public void deleteAll(){
        userRepository.deleteAll();
     } 
 }
 //实现方法的源码
public boolean exists(ID id) {
    Assert.notNull(id, "The given id must not be null!");
    return this.mongoOperations.exists(this.getIdQuery(id), this.entityInformation.getJavaType(), this.entityInformation.getCollectionName());
}

 //返回值是boolean 类型,功能:判断数据是否存在
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public boolean isExist(String id){
        return userRepository.exists(id);
     } 
 }
 //实现方法的源码
public <S extends T> boolean exists(Example<S> example) {
    Assert.notNull(example, "Sample must not be null!");
    Query q = new Query((new Criteria()).alike(example));
    return this.mongoOperations.exists(q, example.getProbeType(),     this.entityInformation.getCollectionName());
}

 //返回值是boolean类型,功能:判断某特定数据是否存在
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public boolean isExist(User user){
         Example example = Example.of(user);
        return userRepository.exists(example);
     } 
 }
 //实现方法的源码
public List<T> findAll() {
    return this.findAll(new Query());
}

 //返回值是List<User>类型,功能:获取表中所有的数据
 @Service
 public class UserServiceImpl {
     @Autowired
     private UserRepository userRepository;

     public List<User> findAll(){
        return userRepository.findAll();
     } 
 }

仅展示部分实现类,在实际Spring Boot与MongoDB的整合中,应用情况更加复杂,多样。