利用Spring Boot操作MongoDB的方法教程

 更新时间:2017年05月26日 09:30:48   投稿:daisy  
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多,下面这篇文章主要给大家介绍了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以参考下

MongoDB

MongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是一则负面新闻,但是也从侧面说明了MongoDB的流行程度。

下图是DB-Engines统计的2017年5月全球数据库引擎使用排名。从图中可以看出,mongoDB位列总榜第五,非关系数据库第一,非常靠前的排名。

我个人对mongoDB并不是非常熟悉,但是经过一段时间的了解,对mongoDB的特性还是有了一些简单的理解,这里记录一二。

  • 首先,mongoDB作为一种非关系型数据库,它最大的特点就是Schema非常的弱。换而言之,mongoDB的升级以及应用的重构会变得比较简单。
  • 其次,mongoDB使用了文档型的存储结构,数据接口则非常接近于JSON。JSON这种数据结构不仅简单而且也是非常流行的网络传输格式。
  • 此外,mongoDB充分考虑了数据库规模扩展的需要,所以能够很好的适应业务发展。

话说了这么多,还是要回到实际使用上。这里我将使用Spring Boot来操作mongoDB,Spring Boot由于有Spring Data的支持,使用mongoDB还是比较轻松方便的。

方法如下:

首先是添加Spring Data mongo的配置依赖,如下所示:

 compile("org.springframework.boot:spring-boot-starter-data-mongodb")

其次是在application.properties中配置mongoDB的连接参数,如下所示:

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

Spring Boot配置就是这样简单,然后就是具体的代码编写了。首先,需要定义一个实体类,这里用一个User的简单实体类来说明:

@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();
 }

}

通过浏览器的访问结果如下所示:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Activiti7通过代码动态生成工作流实现详解

    Activiti7通过代码动态生成工作流实现详解

    这篇文章主要为大家介绍了Activiti7通过代码动态生成工作流实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Spring Boot与ActiveMQ整合的步骤

    Spring Boot与ActiveMQ整合的步骤

    今天小编就为大家分享一篇关于Spring Boot与ActiveMQ整合的步骤,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析

    这篇文章主要介绍了Spring Boot 自动配置之条件注解浅析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • SpringDataRedis简单使用示例代码

    SpringDataRedis简单使用示例代码

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Java 自定义Spring框架与Spring IoC相关接口分析

    Java 自定义Spring框架与Spring IoC相关接口分析

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发
    2021-10-10
  • java字符串中常用的十个方法总结

    java字符串中常用的十个方法总结

    String类中提供了丰富的用于操作字符串的方法,下面这篇文章主要给大家介绍了关于java字符串中常用的十个方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • java中利用List的subList方法实现对List分页(简单易学)

    java中利用List的subList方法实现对List分页(简单易学)

    本篇文章主要介绍了java中list数据拆分为sublist实现页面分页的简单代码,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Java利用PDFBox实现PDF文档基本操作

    Java利用PDFBox实现PDF文档基本操作

    这篇文章主要为大家详细介绍了java如何利用PDFBox实现PDF文档基本操作,例如创建PDF文档、加载PDF文档、获取总页数等,需要的小伙伴可以参考下
    2023-11-11
  • Spring Cloud服务安全连接方式

    Spring Cloud服务安全连接方式

    这篇文章主要介绍了Spring Cloud服务安全连接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 如何使用Code128字体将文本转换为code128条形码

    如何使用Code128字体将文本转换为code128条形码

    这篇文章主要介绍了如何使用Code128字体将文本转换为code128条形码 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04

最新评论