上一篇博客我们大概介绍了mongodb的使用方法,今天就用一些实际中的例子来介绍一下,mongo怎么运用
项目创建
pom文件创建
首先创建maven项目,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mhb.spring</groupId>
<artifactId>spirng-jpa</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
主要是添加springboot需要的jar包和mongodb需要的jar包。
创建实体类和接口
假设我们是查询用户的借口,所以创建一个用户的实体。
Person
public class Person {
@Id
private long id;
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
很简单的实体类,只有id,firstName,lastName,所以我们开始对一些实体进行基本的增删改查。
在mongoRepository中,有一些基本的方法,也就是简单的crud,所以我们就不需要在写一些保存的方法了,源文件如下:
@NoRepositoryBean
public interface MongoRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
<S extends T> List<S> save(Iterable<S> var1);
List<T> findAll();
List<T> findAll(Sort var1);
<S extends T> S insert(S var1);
<S extends T> List<S> insert(Iterable<S> var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
所以我们写接口的时候,不需要再重复写这些方法,加入我们需要根据lastName来查询用户信息,则如下:
// Copyright (C), rzsj All Rights Reserved.
package hello;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
/**
* Created by menghaibin on 2017/8/7.
*/
public interface PeopleMongoRepository extends MongoRepository<Person, Long> {
List<Person> findPersonByLastName(String lastName);
}
在mongoRepository中,他会自动把属性名称匹配城对应的属性来进行查询,当然如果要一些更复杂的,我们接下来再说。写下来写几个rest接口看看。
RestController
@RequestMapping("/save")
public void save(String firstName, String lastName){
Person person = new Person();
person.setFirstName("meng");
person.setLastName("haibin");
mongoRepository.save(person);
}
@RequestMapping("/all")
public List<Person> findAll(){
return mongoRepository.findAll();
}
@RequestMapping("/lastName")
public List<Person> findByFirstName(String lastName){
return mongoRepository.findPersonByLastName(lastName);
}
这样启动Application就可以了,具体如何启动,就不再废话了,大家看之前的博客就可以了。
复杂查询
上边说的这么多,其实都是一些简单的查询,但是如果我们需要一些关联插入和分页查询或者排序的话,接下来就介绍一些如何实现。
例如我们需要关联插入,比如说我们写博客需要博客的实体, 标签的实体,关联博客的实体,用户的信息,都要存在别的表中,还包括评论,而数据量大的胡啊,这些信息就会对数据库造成非常大的压力,如果是用mongo的话,我们只需要简单的save就可以。
博客实体类
@Data
public class Blog {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
//标题
private String title;
//内容
private String content;
//创建时间
private Date createTime;
//评论集合
private List<Comment> comments;
}
//评论实体
@Data
public class Comment {
//id
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//博客id
private Long blogId;
//评论内容
private String content;
//创建时间
private Date createTime;
}
插入,分页和排序
public interface CommentRepository extends MongoRepository<Comment,Long>{
Page<Comment> findByBlogId(Long blogId, Pageable page);
Page<Comment> findByBlogIdOrderByCreateTimeDesc(Long blogId, Pageable page);
}
@RequestMapping("/save/blog")
public Blog saveBlog(){
Blog blog = new Blog();
blog.setId(20002L);
blog.setTitle("mongoTitle");
blog.setContent("mongoContent");
List<Comment> comments = new ArrayList<>();
Comment comment = new Comment();
comment.setContent("commentContent1");
comment.setId(counter.getAndIncrement() + 202);
comment.setCreateTime(new Date());
comment.setBlogId(20002L);
comments.add(comment);
blog.setComments(comments);
return blogRepository.save(blog);
}
//分页查询评论信息
@RequestMapping("/findComment")
public List<Comment> findBlogByComment(){
PageRequest page = new PageRequest(0,20);
return commentRepository.findByBlogId(20002L,page).getContent();
}
//根据时间倒叙查询评论信息
@RequestMapping("/findCommentSort")
public List<Comment> findBlogByCommentSort(){
PageRequest page = new PageRequest(0,20);
return commentRepository.findByBlogIdOrderByCreateTimeDesc(20002L,page).getContent();
}
小结
本章主要讲解了mongoRepository的使用,但是我用这个还只是单一实体的查询,插入的话,不区分,但是查询的话,还在继续研究,但是对于基本的查询,该博客还是很有用的。