Spring boot集成mongodb使用MongoRepository完成CURD和复杂查询

Spring Data简介

Spring Data 是spring的组件之一,主要目的是为了让开发者再工作中能更加轻松的完成CURD,简化代码应该是所有框架的目的吧。今天介绍的Spring-data-mongodb只是其中的一个模块而已,Spring团队的强大不言而喻,有兴趣的请移步官网查看更多模块。
Spring-Data

Spring Data Jpa 方法定义规范

网上的博文关于这部分大同小异,这里只贴部分内容,详细规则可以参考官方文档。这些方法只是在特定情况下才用的到,比如MongoRepository不能完成的工作,但是在本人实际工作中MongoRepository已经覆盖了9成以上的需求,如果你感觉有什么需求它完成不了,很有可能是没有找对方法。
Spring-Data-Jpa

在这里插入图片描述在这里插入图片描述

MongoRepository实战操作

  1. 新建测试项目,spring boot新建项目可以选择访问官网,并添加Web和Mongodb依赖即可。如下图所示
    在这里插入图片描述
  2. 打开项目,并修改application.properties文件添加数据源,如下所示:
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=testmongodb
  1. 分别新建实体类User/Repository接口UserRespository/控制器UserController
public class User {
   private String id;
   private String userName;
   private String password;
   private int age;
   private long createTime;
   public String getId() {
      return id;
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getUserName() {
      return userName;
   }
   public void setUserName(String userName) {
      this.userName = userName;
   }
   public String getPassword() {
      return password;
   }
   public void setPassword(String password) {
      this.password = password;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public long getCreateTime() {
      return createTime;
   }
   public void setCreateTime(long createTime) {
      this.createTime = createTime;
   }  
}
package com.ppw.mongoexample.repository;

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

import com.ppw.mongoexample.model.User;

public interface UserRepository extends MongoRepository<User, String>{
	public Page<User> findByUserNameLike(String userName, Pageable pageable);
}
package com.ppw.mongoexample.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;
import com.ppw.mongoexample.model.User;
import com.ppw.mongoexample.repository.UserRepository;

@RestController
@RequestMapping("/v1/user")
public class UserController {

   @Autowired
   private UserRepository userRepository;
   
   @ResponseStatus(HttpStatus.CREATED)
   @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
   public User createUser(@RequestBody User user) {
      return userRepository.save(user);
   }
   
   /**
    * 根据id查询
    * @param id
    * @return
    */
   @GetMapping(value="/{id}")
   public User readUserById(@PathVariable("id") String id){
      return userRepository.findOne(id);
   }
   
   /**
    * 根据一个或者多个属性查询单个结果
    * @param name
    * @return
    */
   @GetMapping(value="/name/{name}")
   public User readUserByName(@PathVariable("name") String name){
      User user = new User();
      user.setUserName(name);
      ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      return userRepository.findOne(example);
   }
   
   /**
    * 根据一个或者多个属性分页查询 
    * @param pageNumber
    * @param pageSize
    * @return
    */
   @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/name/{name}")
   public Page<User> readUsersByPage(@PathVariable("pageNumber") int pageNumber,
         @PathVariable("pageSize") int pageSize,@PathVariable("name") String name) {
      User user = new User();
      user.setUserName(name);
      ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      if (pageNumber < 1) {
         pageNumber = 1;
      } else if (pageSize == 0) {
         pageSize = 20;
      }
      
      PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
      return userRepository.findAll(example, pageable);
   }
   
   /**
    * 根据用户年龄升序排序
    * @return
    */
   @GetMapping
   public List<User> readUsers(){
      
      Order order = new Order(Direction.ASC,"age");
      Sort sort = new Sort(order);
      return userRepository.findAll(sort);
   }
   
   /**
    * 模糊查询带分页
    * @param pageNumber
    * @param pageSize
    * @param keyWords
    * @return
    */
   @GetMapping(value = "/page/{pageNumber}/pagesize/{pageSize}/keyword/{keyWords}")
   public Page<User> readUsersByKeywords(@PathVariable("pageNumber") int pageNumber,
         @PathVariable("pageSize") int pageSize,@PathVariable("keyWords") String keyWords) {
      if (keyWords == null) {
         keyWords = "";
      }
      if (pageNumber < 1) {
         pageNumber = 1;
      } else if (pageSize == 0) {
         pageSize = 20;
      }
      PageRequest pageable = new PageRequest(pageNumber - 1, pageSize);
      return userRepository.findByUserNameLike(keyWords, pageable);
   }
   
   @ResponseStatus(HttpStatus.OK)
   @DeleteMapping(value="/{id}")
   public void removeUser(@PathVariable("id") String id) {
      userRepository.delete(id);
   }
}

Postman测试部分接口结果如下图所示

1.新建用户
在这里插入图片描述2.根据用户名模糊查询并分页
在这里插入图片描述3.根据年龄升序排序
在这里插入图片描述

Mongodb截图如下

在这里插入图片描述

注意事项

在使用MongoRepository的过程中,非模糊查询多配合使用Example/ExampleMatcher来完成工作,MongoRepository已经非常强大,常用功能如排序,分页都已实现,当然还有很多方法文中没有提到感兴趣的可以深入了解一下。如果MongoRepository能实现,尽量不要做冗余的工作,如果非要自定义方法才能实现,一定要符合Spring-Data的规则来定义方法名。这里有一个小坑需要注意一下,如果实体类中包含有基本数据类型的属性,那么在使用repository.find(Example)时,需要把这些属性忽略掉,因为基本数据类型在新建对象时会有默认值,这时如果你按照别的属性查找数据时,这些属性也会附带到条件里。比如上文代码中有一个根据用户名查找用户的方法,此时你期望的是在查询过程中只有用户名起作用,那么这时候就要加上下面的代码。如果不加,则条件中会多出age=0&createTime=0,查出的结果有误。

ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age","createTime");
      Example<User> example = Example.of(user, matcher);
      

github地址如下

https://github.com/wppcoder/mongo-example.git

欢迎讨论交流,如有错误欢迎指正。

  • 30
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
Spring Boot是一个用于构建Java应用程序的框架,它能够简化开发过程,提高生产力。它通过提供一系列的开箱即用的特性和配置,允许我们快速构建可运行的、独立的Spring应用程序。 Druid是一个开源的Java数据库连接池框架,它提供了一组可扩展的API,用于管理和监控数据库连接。Druid具有优秀的性能和丰富的扩展功能,可以有效地管理大量的数据库连接。 MongoDB是一个开源的文档数据库,它使用JSON风格的文档格式存储数据。MongoDB具有高可用性、可扩展性和灵活的数据模型,适用于许多不同类型的应用程序。 Spring Boot与Druid和MongoDB的结合可以带来一些好处。首先,Druid可以作为Spring Boot应用程序的数据库连接池,提供高性能和高可用性的数据库连接管理。它可以监控和管理数据库连接的使用情况,避免连接泄漏和过多的连接创建。 其次,Spring BootMongoDB集成使得开发人员能够轻松地使用MongoDB作为应用程序的数据存储。Spring Boot提供了与MongoDB的无缝集成,简化了数据访问的配置和操作。 最后,Spring Boot、Druid和MongoDB集成可以帮助开发人员更好地应对大规模的数据存储和处理需求。Druid的连接池管理功能可以提高应用程序的性能和可靠性,而MongoDB的扩展性和灵活性可以满足不同类型的数据存储需求。 综上所述,Spring Boot、Druid和MongoDB的结合可以提供高性能、高可用性和灵活的数据存储和管理解决方案,适用于各种类型的Java应用程序开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值