zoukankan      html  css  js  c++  java
  • springboot集成mongoDB简易使用

    1.首先是添加Spring Data mongo的配置依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-mongodb</artifactId>
       <version>2.0.0.RELEASE</version>
    </dependency>

    2.mongodb配置

    spring.data.mongodb.uri=mongodb://localhost:27017/dbname

    3.单实体类来说明:

    @Document(collection = "users")
    public class User {
     @Id
     private String id;
     
     private String username;
     private Integer age;
    }

    这段代码里面省略了getter和setter,所以看起来非常简单。值得注意的一点是@Document注解,它是mongoDB专用的。了解mongoDB的话,都知道collection之于mongoDB,就像关系数据库的table一样。通过指定collection,可以实现实体类到mongoDB集合的映射关系。如果不显式指定collection,Spring会根据实体类的名字去推测集合的名字。

    配置完毕,实体类也实现完毕,我们需要的就是实现mongoDB的各种操作,从而把数据库和应用程序连接起来。按照Spring data的现状,实现数据库操作大概有两种方式——MongoRepository、mongoTemplate。MongoRepository是一种相对简单的方式,它可以帮我们轻松的实现简答的CRUD操作。

    下面就是它的使用方式:

    public interface UserRepository extends MongoRepository<User, Long>{
     User findByUsername(String username);
    }

    然后在使用数据库的地方直接依赖注入UserRepository即可。的确非常简单,这是因为Spring帮我们做了两件事,首先Spring会为Repository生成bean,一般来说Spring内置的Repository及其子类都使用了@NoRepositoryBean注解,所以只有用户定义的没有该注解的interface才会被实例化一个bean。其次Spring会根据interface中的方法名,去自动生成CRUD操作的函数,因此我们连实现代码都不用写了。

    使用MongoTemplate会稍微麻烦一点,但同时它能够完成的工作也更多一些。下面是使用mongoTemplate的方式,为了展示其强大的能力,我们使用一个稍微复杂点例子。

    @Component
    public class ArticleRepositoryImpl {
     
     MongoTemplate mongoTemplate;
     
     @Autowired
     public ArticleRepositoryImpl(MongoTemplate mongoTemplate) {
      this.mongoTemplate = mongoTemplate;
     }
     public List<Article> find(Query query) {
      return mongoTemplate.find(query, Article.class);
     }
     public Article findOne(Query query) {
      return mongoTemplate.findOne(query, Article.class);
     }
     public void update(Query query, Update update) {
      mongoTemplate.findAndModify(query, update, Article.class);
     }
     public Article save(Article article) {
      mongoTemplate.insert(article);
      return article;
     }
     
     public Article findById(String id) {
      return mongoTemplate.findById(id, Article.class);
     }
     
     public Page<Article> findPage(Page<Article> page, Query query) {
      long count = count(query);
      int pageNumber = page.getPageNumber();
      int pageSize = page.getPageSize();
      query.skip((pageNumber - 1) * pageSize).limit(pageSize);
      List<Article> rows = find(query);
      page.setContent(rows);
      return page;
     }
     
     public long count(Query query) {
      return mongoTemplate.count(query, Article.class);
     }
    }

    对于Article这个实体类,我们其实不需要太关心它的细节。为了实现分页查询的功能(主要在findPage中实现),代码使用了略微复杂的查询操作,这里就体现到了mongoTemplate的更为强大的定制化操作能力。而这里的component注解也只是一种声明bean的方式。除了它之外,还有很多配置的方式,但功能都是一样的,这里也就不深究了。

    把数据库的结果通过一个RESTful的接口返回去,就可以看到数据库的查询结果,代码如下所示:

    @RestController
    public class SimpleRestController {
     
     private UserRepository userRepository;
     @Autowired
     public SimpleRestController(UserRepository userRepository) {
      this.userRepository = userRepository;
     }
     
     @RequestMapping(value="/users", method = RequestMethod.GET)
     public List<User> greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
      return userRepository.findAll();
     }
     
    }
  • 相关阅读:
    把一个数组 赋值给一个新数组
    上传图片时进行压缩
    input上传文件 显示进度条
    vue 后台接口返回文件流地址的下载
    时间戳转换
    JS 两个含有部分相同属性的对象如何快速给对应的key赋值
    javascript中把一个数组的内容全部赋值给另外一个数组
    微信小程序wxs如何使用
    优化内存
    解决position:fiexd相对父元素定位
  • 原文地址:https://www.cnblogs.com/chenziyu/p/9548188.html
Copyright © 2011-2022 走看看