我们常用的数据库一般是MySql,但是在数据量大的时候。MongoDB这种NoSql型数据库更加有优势!我们来看一下如何用java来操作。
1、创建一个maven工程引入依赖
别跟我说你不知道到maven是个啥,哈哈哈!!!
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.mongo</groupId>
<artifactId>spring_data_mongodb</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring_data_mongodb</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
</dependencies>
</project>
第一个是springboot集成junit5单元测试的依赖。
第二个就是我们spring为我们封装好的框架。
第三个是lombok。可以看一下我以前的文章有介绍。
2、配置数据库信息
spring:
data:
mongodb:
uri: mongodb://bobo:[email protected]:27017/article
3、定义实体类
package com.mongo.spring_data_mongodb.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
* /@Document(collection="mongodb 对应 collection 名")
* 若未加 @Document ,该 bean save 到 mongo 的 comment collection
* 若添加 @Document ,则 save 到 comment collection
* 可以省略,如果省略,则默认使用类名小写映射集合
* 复合索引:@CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
*/
@Data
@Document(collection="comment")
public class Comment implements Serializable {
/**
* 主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写 @Id
*/
@Id
private String id;
private String articleid;
private String content;
@Indexed
private String userid;
private String nickname;
private LocalDateTime createdatetime;
private LocalDate publishtime;
private Integer likenum;
private Integer replynum;
private String state;
private String parentid;
}
3、dao层,操作数据库
package com.mongo.spring_data_mongodb.dao;
import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* Mongodb的dao层
**/
public interface CommentRepository extends MongoRepository<Comment,String> {
/**
* 根据条件查询出分页
* @param parentid 父级id
* @param pageable 分页
* @return
*/
Page<Comment> findByParentid(String parentid, Pageable pageable);
}
这东西就很优秀了,有点像jpa。不需要我们写一些Mongodb的命令,直接提供好给我们的查询。有的需要定义,有的基础的可以直接用。来看一下框架为我们提供了哪些方法?
@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
@Override
<S extends T> List<S> saveAll(Iterable<S> entities);
@Override
List<T> findAll();
@Override
List<T> findAll(Sort sort);
<S extends T> S insert(S entity);
<S extends T> List<S> insert(Iterable<S> entities);
@Override
<S extends T> List<S> findAll(Example<S> example);
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);
}
除此之外我们还可以自己定义方法,就像findByParentid一样,根据某一个条件查询。
4、看一下service层,为我们提供了哪些dao层的方法
package com.mongo.spring_data_mongodb.service;
import com.mongo.spring_data_mongodb.dao.CommentRepository;
import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Mongodb查询的业务层
**/
@Service
public class CommentService {
@Autowired
private CommentRepository commentRepository;
@Autowired
private MongoTemplate mongoTemplate;
/**
* 保存一个数据
*/
public void saveComment(Comment comment) {
commentRepository.save(comment);
}
/**
* 更新数据
*/
public void updateComment(Comment comment) {
commentRepository.save(comment);
}
/**
* 删除一个数据
*/
public void deleteComment(String id) {
commentRepository.deleteById(id);
}
/**
* 查询出所有的评论
*/
public List<Comment> findCommentList() {
return commentRepository.findAll();
}
/**
* 根据id查询出评论
*/
public Comment findCommentById(String id) {
return commentRepository.findById(id).get();
}
/**
* 查询分页
* @param parentid 父级id
* @param page 页数
* @param size 每页大小
* @return
*/
public Page<Comment> findCommentListPageByParentid(String parentid, int page, int size) {
return commentRepository.findByParentid(parentid, PageRequest.of(page - 1, size));
}
/**
* 使用MongoTemplate来更新
*/
public void updateCommentLikenum(String id){
//查询
Query query = Query.query(Criteria.where("_id").is(id));
//更新
Update update = new Update();
update.inc("likenum");
mongoTemplate.updateFirst(query,update,"comment");
}
}
5、使用MongoTemplate查询
不多解释了,自己看一下注释就行了。
package com.mongo.spring_data_mongodb.service;
import com.mongo.spring_data_mongodb.entity.Comment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
/**
* @ClassName CommentTempalteService
* @Description
* @Author 戴书博
* @Date 2020/5/18 22:48
* @Version 1.0
**/
@Service
public class CommentTempalteService {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 插入
*/
public void insertComment(Comment comment) {
mongoTemplate.insert(comment, "comment");
}
/**
* save的形式在首次插入的时候和insert效果一样
* 具有插入和更新的功能
*/
public void saveComment(Comment comment) {
mongoTemplate.save(comment, "comment");
}
/**
* save-update更新
*/
public void updateComment(String name) {
Comment comment = mongoTemplate.findOne(Query.query(Criteria.where("nickname").is(name)), Comment.class);
comment.setReplynum(100);
mongoTemplate.save(comment);
}
/**
* 更新查到的第一个数据
*/
public void updateFirstComment(String name) {
Query query = Query.query(Criteria.where("nickname").is(name));
Update update = new Update();
update.set("likenum", 1000);
mongoTemplate.updateFirst(query, update, Comment.class);
}
/**
* 更新查到的所有数据
*/
public void updateMultiComment(String name) {
Query query = Query.query(Criteria.where("nickname").is(name));
Update update = new Update();
update.set("likenum", 1000);
mongoTemplate.updateMulti(query, update, Comment.class);
}
/**
* 这个方法其实和上一条类似,只是在更新后会把更新后的内容返回
* 跟新第一个数据
*/
public Comment findAndModifyComment(String name) {
Query query = Query.query(Criteria.where("nickname").is(name));
Update update = new Update();
update.set("likenum", 100000);
return mongoTemplate.findAndModify(query, update, Comment.class);
}
/**
* 删除
*/
public void removeComment(String name) {
Query query = Query.query(Criteria.where("nickname").is(name));
mongoTemplate.remove(query, Comment.class);
}
}