欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-20 08:22:04
mongodb mongodb作为一种nosql数据库产品,其实已经非常著名了。去年,由于mongodb安全认证的薄弱,上万家公司中招。虽然是一则负面新闻,但是也从侧面说...

mongodb

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

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

利用Spring Boot操作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();
 }

}

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

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

总结

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