SpringBoot整合MongoDB的步骤详解

项目结构:

1.pom引入mongodb依赖

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

2 配置application.properties

#spring.data.mongodb.host=127.0.0.1
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=books
###这种类似于关系型数据库url配置
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/books

3.创建mongodb文档映射实体类

@Document(collection = "comment") //如果省略集合属性,默认为类名首字母小写
//设置复合索引
//@CompoundIndex(def="{'userId':1},{'nickName':-1}")
public class Comment implements Serializable {

    @Id  //对应comment中的_id
    private String id;
    @Field("content")//属性对应mongodb字段名,如果一致,无须该注解
    private String content;//吐槽内容
    private String articleId;//文章id
    private Date publishTime;//发布日期
    @Indexed  //添加一个单字段的索引
    private String userId;//发布人id
    private String nickName;//发布人昵称
    private Date createDateTime;//评论的日期时间
    private Integer likeNum;//点赞数
    private Integer replyNum;//回复数
    private String state;//状态
    private String parentId;//上级id
	// 此处忽略getter与setter方法
} 

SpringBoot中MongoDB常用注解:

  1. @Document

标注在实体类上,将java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。类似于Hibernate的entity注解,表明由mongo来维护该集合(表)。

  1. @id

主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。
如果自己不设置@Id主键,mongo会自动生成一个唯一主键,插入效率远高于自己设置主键。
在实际业务中不建议自己设置主键,应交给mongo自己生成,可以另外设置一个业务id,如int型字段,用自己设置的业务id来维护相关联的集合(表)。

  1. @Indexed

声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
唯一索引的话是@Indexed(unique = true)。
也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。
也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。

  1. @CompoundIndex

复合索引,加复合索引后通过复合索引字段查询将大大提高速度。

  1. @Field

实体类属性对应集合(表)字段名,如果一致,无须该注解

4.service业务层

CommonService,操作mongo的具体业务类

采用Repository和MongoTemplate两种方式来实现的;Repository 提供最基本的数据访问功能,其几个子接口则扩展了一些功能。

MongoTemplate核心操作类:Criteria和Query

  • Criteria类:封装所有的语句,以方法的形式查询。
  • Query类:将语句进行封装或者添加排序之类的操作。
@Service
public class CommentService {

    @Autowired
    private CommentRepository commentRepository;  // 注入DAO

    @Autowired
    private MongoTemplate mongoTemplate;  // 注入Mongodb提供的操作模板

	// 保存一个
    public void saveComment(Comment comment){
        commentRepository.save(comment);
       // mongoTemplate.save(comment);
       // mongoTemplate.insert(comment);
    }

	// 批量保存
    public void mutilSaveComment(List<Comment> list){
        commentRepository.saveAll(list);
       // mongoTemplate.insertAll(list);
    }

    // 更新一个
    public void updateComment(Comment comment){
         commentRepository.save(comment);
    }

   	// 查询全部
    public List<Comment> findCommentAll(){
       // return  commentRepository.findAll();
        return mongoTemplate.findAll(Comment.class);
    }

    // 条件查询
    public List<Comment> findCommentByContion(Query query){
        return  mongoTemplate.find(query,Comment.class);
    }

    // 查询全部并以id排序返回结果
    public List<Comment> findCommentAllOrder(){
      //  return  commentRepository.findAll(Sort.by(Sort.Order.desc("_id")));

		Query query=new Query();
		query.with(Sort.by(Sort.Direction.DESC,"id"));
		return mongoTemplate.find(query,Comment.class);
    }

    // 通过id查询
    public Comment findCommentById(String id){
        //return  commentRepository.findById(id).get();
        return mongoTemplate.findById(id,Comment.class);
    }

    /**
     * @param parentId
     * @param page
     * @param size
     * @return
     */
    public Page<Comment> findByparentIdPage1(String parentId, int page,int size){
        return  commentRepository.findByParentId(parentId, PageRequest.of(page-1,size));
    }

    // 方式二
    public List<Comment> findByparentIdPage2(String parentId, int page,int size){
        Query query=Query.query(Criteria.where("parentId").is(parentId));
        query.with(PageRequest.of(page-1,size));
        return  mongoTemplate.find(query,Comment.class);
    }

    // 通过id删除
    public void deleteById(String id){
        // commentRepository.deleteById(id);
        Comment comment=new Comment();
        comment.setId(id);
        mongoTemplate.remove(comment);
    }

    // 删除全部数据
    public void deleteAll(){
        commentRepository.deleteAll();
    }

    // 批量删除
    public void deleteMulti(List<Comment> list){
        commentRepository.deleteAll(list);
    }

	// 根据id更新一条文档:点赞数加1
    public void updateCommentLikeNumm(String id){
		// 点赞数加一,效率低,增加id开销
		// Comment comment=commentRepository.findById(id).get();
		// comment.setLikeNum(comment.getLikeNum()+1);
		// commentRepository.save(comment);

		// 拿到查询对象
        Query query=Query.query(Criteria.where("_id").is(id));
        // 拿到更新对象
        Update update=new Update();
		// 局部更新 相当于$set
		// update.set(key,value);
		// 递增$inc
        // update.inc("likeNum",1);
        update.inc("likeNum");  // 指定字段自增1
        mongoTemplate.updateFirst(query,update,"comment");
    }

    // 有条件的统计
    public Long commentCount(Query query){
        return mongoTemplate.count(query,Comment.class);
    }
}

5.DAO层

dao层CommentRepository 继承MongoRepository,MongoRepository中已经预定义了一些增删查的方法,根据JPA的命名规范可以定义一些查询方法,不需要具体实现,底层会帮你实现。

public interface CommentRepository extends MongoRepository<Comment,String> {
  //新增按父id分页查询
    Page<Comment> findByParentId(String parentId,Pageable pageable);
}  

6.测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class CommentServiceTest {

    @Autowired
    private CommentService commentService;

    @Test
    public void saveCommentTest(){  // 新增单个
        Comment comment=new Comment();
        //comment.setId("2");
        comment.setArticleId("777");
        comment.setContent("添加数据测试");
        comment.setPublishTime(new Date());
        comment.setUserId("1001");
        comment.setNickName("张三");
        comment.setCreateDateTime(new Date());
        comment.setLikeNum(1);
        comment.setReplyNum(0);
        comment.setState("1");
        comment.setParentId("0");
        commentService.saveComment(comment);
    }

    @Test
    public void mutilSaveComment(){  // 批量新增
        List<Comment> list=new ArrayList<>();
        Comment comment;
        for(int i=1;i<=10;i++){
            comment=new Comment();
            comment.setId(""+i);
            comment.setArticleId(""+i);
            comment.setContent("添加数据测试"+i);
            comment.setPublishTime(new Date());
            comment.setUserId("1001");
            comment.setNickName("张三");
            comment.setCreateDateTime(new Date());
            comment.setLikeNum(0);
            comment.setReplyNum(0);
            comment.setState("1");
            comment.setParentId("0");
            list.add(comment);
        }
        commentService.mutilSaveComment(list);
    }

    @Test
    public void findCommentListTest() {  // 查询全部
        List<Comment> list=commentService.findCommentAll();
        for(Comment comment:list){
            System.out.println(comment);
        }
    }

    @Test
    public void findCommentListOrderTest() {  // 查全部并通对id排序
        List<Comment> list=commentService.findCommentAllOrder();
        for(Comment comment:list){
            System.out.println(comment);
        }
    }

    @Test
    public void findCommentById() {  // 通过id删除
        Comment comment=commentService.findCommentById("1");
        System.out.println(comment);
    }

    @Test
    public void findByParentId(){  // 通过父id分页查询1
        Page<Comment> page=commentService.findByparentIdPage1("0",1,10);  // 第1页,每页10个
        System.out.println(page.getTotalElements());
        System.out.println(page.getContent());
    }

    @Test
    public void findByparentIdPage2(){  //  通过父id分页查询2
        List<Comment> list=commentService.findByparentIdPage2("0",1,10);  // 第1页,每页10个
        for(Comment comment1:list){
            System.out.println(comment1);
        }
    }

    @Test
    public void deleteById(){  // 通过id删除评论
        commentService.deleteById("1");
    }

    @Test
    public void deleteAll(){  // 删除全部
        commentService.deleteAll();
    }

    @Test
    public void deleteMulti(){  // 批量删除
        List<Comment> list=new ArrayList<>();
        Comment comment;
        for(int i=1;i<=10;i++) {
            comment = new Comment();
            comment.setId("" + i);
            list.add(comment);
        }
        commentService.deleteMulti(list);
    }

    @Test
    public void findCommentByContion(){ // 多条件查询in
       	// 拿到查询范围
        List<String> list=new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");

        // 根据范围拿到查询对象
        Query query=Query.query(Criteria.where("_id").in(list));

        // 根据查询条件拿到结果
        List<Comment> list2=commentService.findCommentByContion(query);
        for(Comment comment1:list2){
            System.out.println(comment1);
        }
    }

    @Test
    public void findCommentContionByGtLt(){  // 多条件查询大于2小于等于6
        // 拿到查询对象
        Query query=Query.query(Criteria.where("likeNum").gte(2).lte(6));
        // 根据查询条件拿到结果
        List<Comment> list =commentService.findCommentByContion(query);
        for(Comment comment1:list){
            System.out.println(comment1);
        }
    }

    @Test
    public void findCommentContionByAnd(){  // 多条件查询and
        //查询对象
        Query query=Query.query(new Criteria().andOperator(Criteria.where("likeNum").gte(2)
                                             ,Criteria.where("state").is("1")));
        List<Comment> list =commentService.findCommentByContion(query);
        for(Comment comment1:list){
            System.out.println(comment1);
        }
    }

    @Test
    public void findCommentContionByOr(){ // 多条件查询or
        //查询对象
        Query query=Query.query(new Criteria().orOperator(Criteria.where("likeNum").gte(2)
                                            ,Criteria.where("state").is("0")));
        List<Comment> list =commentService.findCommentByContion(query);
        for(Comment comment1:list){
            System.out.println(comment1);
        }
    }

    @Test
    public void updateCommentLikeNumm(){  // 更新 点赞数加一
        commentService.updateCommentLikeNumm("1");
    }

    @Test
    public void commentCount(){  // 统计查询
        Query query=Query.query(Criteria.where("likeNum").gte(2));  // 拿到查询器
        Query query1=new Query();
        Long count1=commentService.commentCount(query);  // 查符合条件的文档个数
        Long count2=commentService.commentCount(query1);  // 查全部
        System.out.println("点赞数大于等于2的文档有======="+count1);
        System.out.println("统计总数======="+count2);
    }
}

到此已经在SpringBoot项目中引入了MongoDB,并通过MongoRepository和MongoTemplate两种方式来实现了基本的增删改查操。

以上就是SpringBoot整合MongoDB的步骤详解的详细内容,更多关于SpringBoot整合MongoDB的资料请关注我们其它相关文章!

(0)

相关推荐

  • Springboot整合MongoDB的Docker开发教程全解

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. 2 把Springboot打包成Docker镜像 Springboot的Web开发非常简单,本次使用之前讲解过的Springboot整合MongoDB的项目,请参考 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式,文章中有源码:MongoDB的安装请参考:用Docker安装

  • Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合MongoDB的两种方法:MongoRepository和MongoTemplate. 代码结构如下: 2 项目准备 2.1 启动MongoDB实例 为了方便,使用Docker来启动MongoDB,详细指导文档请参考:基于Docker的MongoDB实现授权访问的方法,这里不再赘述. 2.2 引入相关依赖

  • 详解springboot整合mongodb

    这篇文章主要介绍springboot如何整合MongoDB. 准备工作 安装 MongoDB jdk 1.8 maven 3.0 idea 环境依赖 在pom文件引入spring-boot-starter-data-mongodb依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifa

  • SpringBoot整合MongoDB的示例

    本节使用SpringBoot 2.1.9.RELEASE,示例源码在https://github.com/laolunsi/spring-boot-examples/tree/master/06-spring-boot-mongo-demo SpringBoot可以非常方便地引入和操作MongoDB.本节分两部分,记录个人学习SpringBoot使用MongoDB数据库的一些知识. 第一部分是一个简单的springboot连接mongo的demo,测试查询功能. 第二部分是基于mongo实现的增

  • SpringBoot轻松整合MongoDB的全过程记录

    前言 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 提示:以下是本篇文章正文内容,下面案例可供参考 一.技术介绍 1.MongoDB是什么? MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新.与此同时,它也为开发人员 提供

  • SpringBoot整合MongoDB的步骤详解

    项目结构: 1.pom引入mongodb依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2 配置application.properties #spring.data.mongodb.host=127.0.0.1 #spr

  • SpringBoot整合Swagger2的步骤详解

    简介 swagger是一个流行的API开发框架,这个框架以"开放API声明"(OpenAPI Specification,OAS)为基础, 对整个API的开发周期都提供了相应的解决方案,是一个非常庞大的项目(包括设计.编码和测试,几乎支持所有语言). springfox大致原理: springfox的大致原理就是,在项目启动的过种中,spring上下文在初始化的过程, 框架自动跟据配置加载一些swagger相关的bean到当前的上下文中,并自动扫描系统中可能需要生成api文档那些类,

  • Spring Boot整合EhCache的步骤详解

    本文讲解Spring Boot与EhCache的整合. 1 EhCache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 2 Spring Boot整合EhCache步骤 2.

  • SpringBoot整合rockerMQ消息队列详解

    目录 Springboot整合RockerMQ 使用总结 消费模式 生产者组和消费者组 生产者投递消息的三种方式 如何保证消息不丢失 顺序消息 分布式事务 Springboot整合RockerMQ 1.maven依赖 <dependencies> <!-- springboot-web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

  • SpringBoot 整合 Quartz 定时任务框架详解

    目录 前言 一.简单聊一聊 Quartz 1.1.Quartz 概念 二.SpringBoot 使用 Quartz 2.1.基本步骤 2.2.执行 Quartz 需要的SQL文件 2.3.Controller 2.4.Service 划重点 2.5.实体类 2.6.简单的 Job 案例 2.7.那么该如何使用呢? 前言 在选择技术栈之前,一定要先明确一件事情,你真的需要用它吗?还有其他方式可以使用吗? 相比其他技术技术,优点在哪里呢?使用了之后的利与弊等等. 写这个主要是因为一直想写一下定时任务

  • SpringBoot整合Shiro的代码详解

    shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/  它提供了很方便的权限认证和登录的功能. 而springboot作为一个开源框架,必然提供了和shiro整合的功能!接下来就用springboot结合springmvc,mybatis,整合shiro完成对于用户登录的判定和权限的验证. 1.准备数据库表结构 这里主要涉及到五张表:用户表,角色表(用户所拥有的角色),权限表(角色所涉及到的权限),用户-角色表(用户和角色是多对多的),角色-权限表

  • SpringBoot整合Druid数据源过程详解

    这篇文章主要介绍了SpringBoot整合Druid数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.数据库结构 2.项目结构 3.pom.xml文件 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</ar

  • IDEA SSM框架整合配置及步骤详解

    参考 狂神说SpringMVC05:整合SSM框架 https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247484004&idx=1&sn=cef9d881d0a8d7db7e8ddc6a380a9a76&scene=19#wechat_redirect 前言 根据自己的环境参考狂神的视频进行了SSM框架整合,用于备忘 SSM框架整合步骤 1. 创建数据库 2. IDEA创建maven项目.在pom.xml中设设置

  • springBoot整合rabbitMQ的方法详解

    引入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

  • springBoot整合redis使用案例详解

    一.创建springboot项目(采用骨架方式) 创建完成: 我们分析下pom文件中内容: 所使用到的关键依赖: <!--springBoot集成redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.4<

随机推荐