目录

一、Java项目 & MongoDB技术

1、mongodb-driver

2、SpringDataMongoDB

二、Java & MongoDB项目实例

1、项目介绍

2、创建Spring Boot工程 项目名"article"

3、项目代码编写

3.1、分页查询功能

3.2、实现评论点赞


一、Java项目 & MongoDB技术

1、mongodb-driver

mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动.

2、SpringDataMongoDB

SpringData家族成员之一,用于操作MongDB的持久层框架,封装了底层的mongodb-driver。

Spring-data-mongodb官网

二、Java & MongoDB项目实例

1、项目介绍

文章评论的项目

需求:某网站中的文章评论。评论下还有子评论等。

需要实现以下功能:

1、基本增删改查API

2、根据文章ID查询评论

3、评论点赞

表结构分析

数据库:articledb

文章评论集合:comment

字段名称 字段含义 字段类型 备注
_id ID ObjectId或String MongoDB的主键的字段
articleid 文章ID String
content 评论内容 String
userid 评论人ID String
nickname 评论人昵称 String
createddatetime 评论的日期时间 Date
likenum 点赞数 Int32
replnum 回复数 Int32
state 状态 String 0:不可见;1:可见;
parentid 上级ID String 如果为0表示文章的顶级评论
1、mongdb数据创建一条
db.comment.insert({_id:'1',content:'我相信是金子,总会有闪光之时。',publishtime:ISODate("20221022 10:10:10"),
userid:'SHK001',nickname:'悟空',createdatetime:ISODate("20221022 20:20:20"),likenum:100,
replynum:200,state:'good',parentid:'wwk334',articleid:'QW987'});

2、创建Spring Boot工程 项目名"article"

创建Spring Boot 工程Spring Boot入门+深入(一)

1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version></parent><modelVersion>4.0.0</modelVersion><groupId>article</groupId><artifactId>article</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>article</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven-jar-plugin.version>3.0.0</maven-jar-plugin.version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

2、application.yml

spring: #数据源配置data: mongodb: #主机地址host: 192.168.0.125#数据源database: articledb#也可以使用uri连接#uri: mongodb://192.168.0.125:27017/articledb#默认端口是27017port: 27017username: adminpassword: admin

3、项目启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringMainApplication {public static void main(String[] args) {SpringApplication.run(SpringMainApplication.class,args);}}

上述配置完成,直接启动项目

...
2022-10-22 22:40:46.556  INFO 9032 --- [168.0.125:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:1}] to 192.168.0.125:27017
2022-10-22 22:40:46.562  INFO 9032 --- [168.0.125:27017] org.mongodb.driver.cluster               : Monitor thread successfully connected to server with description ServerDescription{address=192.168.0.125:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[6, 0, 2]}, minWireVersion=0, maxWireVersion=17, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=4659100}
2022-10-22 22:40:46.757  INFO 9032 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-22 22:40:46.761  INFO 9032 --- [           main] com.lwz.SpringMainApplication            : Started SpringMainApplication in 5.824 seconds (JVM running for 6.232)

控制台没有报错,代表启动成功。

3、项目代码编写

创建实体类

创建包com.lwz.article,包下建包entity用于存放实体类,创建实体类

Comment.java

package com.lwz.article.entity;import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;import lombok.Data;@Data
@Document(collection = "comment")//可以省略,如果省略默认使用类名小写映射集合
//@CompoundIndex(def = "{'userid':1,'nickname':-1}") //复合索引
public class Comment implements Serializable{private static final long serialVersionUID = 1L;@Idprivate String id;//主键@Field("content")//该属性对应mongdb中的字段名/实体类名称和db中的名称不一致时使用private String content;//吐槽内容private Date publishtime;//发布日期@Indexed//添加一个单字段索引private String userid;//发布人idprivate String nickname;//昵称private LocalDateTime createdatetime;//评论的日期时间private Integer likenum;//点赞数private Integer replynum;//回复数private String state;//状态private String parentid;//上级idprivate String articleid;@Overridepublic String toString() {return "Comment [id=" + id + ", content=" + content + ", publishtime=" + publishtime + ", userid=" + userid+ ", nickname=" + nickname + ", createdatetime=" + createdatetime + ", likenum=" + likenum+ ", replynum=" + replynum + ", state=" + state + ", parentid=" + parentid + ", articleid=" + articleid+ "]";}}

CommentRepository.java

package com.lwz.article.repository;import org.springframework.data.mongodb.repository.MongoRepository;import com.lwz.article.entity.Comment;public interface CommentRepository extends MongoRepository<Comment,String>{}

CommentService ---文章评论的增删改查

package com.lwz.article.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.lwz.article.entity.Comment;
import com.lwz.article.repository.CommentRepository;@Service
public class CommentService {@Autowiredprivate CommentRepository commentRepository;/*** 保存评论*/public void saveComment(Comment comment) {commentRepository.save(comment);}/*** 更新评论*/public void updateComment(Comment comment) {commentRepository.save(comment);}/*** 根据ID删除评论*/public void deleteCommentById(String id) {commentRepository.deleteById(id);}/*** 查询所有评论*/public List<Comment> findCommentList() {return commentRepository.findAll();}/*** 根据ID查询评论*/public Comment findCommentById(String id) {return commentRepository.findById(id).get();}
}

CommentServiceTest测试类

package com.lwz.article.service;import java.util.List;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import com.lwz.article.entity.Comment;@RunWith(SpringRunner.class)
@SpringBootTest
public class CommentServiceTest {@Autowiredprivate CommentService commentService;@Testpublic void findCommentListTest() {List<Comment> commentList = commentService.findCommentList();System.out.println(commentList);}
}

启动测试类进行测试:

错误1:

Caused by: com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server 192.168.0.125:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179)

解决方式:

MongoDB中每个数据库之间是相互独立的,都有独立的权限,正确的做法是使用root账号在【将要操作的数据库】中创建一个【子账号】,在用这个子账号连接mongo:

>use articledbswitched to db articledb> db.createUser({user:"admin",pwd:"admin",roles:[{role:"dbOwner",db:"articledb"}]})
...

错误2:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-10-22'; nested exception is java.lang.IllegalArgumentExceptionat org.springframework.core.convert.support.ObjectToObjectConverter.convert(ObjectToObjectConverter.java:112)

解决方式:

实体类Date类型和数据库中数据格式,创建mongdb时间数据使用ISODate函数

db.comment.insert({_id:'1',content:'我相信是金子,总会有闪光之时。',publishtime:ISODate("20221022 10:10:10"),
userid:'SHK001',nickname:'悟空',createdatetime:ISODate("20221022 20:20:20"),likenum:100,
replynum:200,state:'good',parentid:'wwk334',articleid:'QW987'});

问题解决后,再次启动测试类,成功!

控制台会打印如下结果:

[Comment [id=1, content=我相信是金子,总会有闪光之时。, publishtime=Sat Oct 22 18:10:10 CST 2022, userid=SHK001, nickname=悟空, createdatetime=2022-10-23T04:20:20, likenum=100, replynum=200, state=good, parentid=wwk334, articleid=QW987]]

3.1、分页查询功能

根据上级id查询文章评论的分页列表。

(1)、CommentRepository.java新增方法

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;import com.lwz.article.entity.Comment;public interface CommentRepository extends MongoRepository<Comment,String>{Page<Comment> findByParentid(String parentid,Pageable pageable);}

(2)、CommentService新增方法

    /*** 根据上级id分页查询*/public Page<Comment> findCommentListByParentid(String parentid,int page,int size) {return commentRepository.findByParentid(parentid,PageRequest.of(page-1, size));}

(3)、CommentServiceTest测试类新增测试方法

    @Testpublic void findCommentListByParentidTest() {Page<Comment> page = commentService.findCommentListByParentid("wwk334",1,2);System.out.println(page.getTotalElements());System.out.println(page.getContent());}

执行测试类:结果

1
[Comment [id=1, content=我相信是金子,总会有闪光之时。, publishtime=Sat Oct 22 18:10:10 CST 2022, userid=SHK001, nickname=悟空, createdatetime=2022-10-23T04:20:20, likenum=100, replynum=200, state=good, parentid=wwk334, articleid=QW987]]

3.2、实现评论点赞

方法1:

    /*** 更新点赞数*/public void updateCommentLikenumById(String id) {Comment comment = commentRepository.findById(id).get();comment.setLikenum(comment.getLikenum()+1);commentRepository.save(comment);}

方法2:

我们可以使用MongoTemplate类来实现对某列的操作。

(1)、修改CommentService

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;--------------------------------------------------------@Autowiredprivate MongoTemplate 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.class);}

(2)、CommentServiceTest测试类新增测试方法

    @Testpublic void updateCommentLikenum() {Comment comment = commentService.findCommentById("1");System.out.println(comment.getLikenum());commentService.updateCommentLikenum("1");Comment comment1 = commentService.findCommentById("1");System.out.println(comment1.getLikenum());}

测试结果:

100
101

每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

MongoDB入门+深入(一)

MongoDB入门+深入(二)--项目实战相关推荐

  1. 深度学习入门系列6项目实战:声纳回声识别

    大家好,我技术人Howzit,这是深度学习入门系列第六篇,欢迎大家一起交流! 深度学习入门系列1:多层感知器概述 深度学习入门系列2:用TensorFlow构建你的第一个神经网络 深度学习入门系列3: ...

  2. quarkus 入门教程(二) -项目开发模式热更新及项目断点调试方法

    quarkus 入门教程(二) -项目断点调试方法 1.项目热更新 quarkus:dev runs 方式启动,项目会以开发者模式启动,当修改了java文件或者resource文件后,项目会在后台编译 ...

  3. ASP.NET入门篇【项目实战】打造一个自己的相册(二)登录模块

    本文原创,转载请说明,本文地址:http://hi.baidu.com/44498/blog/item/59db5da17d24c28146106478.html 进行本次项目实战,需要有一定的C#基 ...

  4. 软件测试项目实战32讲,软件测试入门-黑马头条项目实战

    课程简介 本课程以黑马头条实战项目为例,将项目的整个测试流程做了详细的介绍,并带着大家一起进行产品需求评审,项目测试计划编写,测试需求分析,以及测试用例的设计编写和执行操作,通过完成实际的功能业务测试 ...

  5. 【备忘】 传智播客云计算大数据Hadoop2014全套高清入门基础到项目实战

    [视频简介] 1,高清不加密. 3,基础(零基础)+中级+项目实战. 4,教学质量:注重方法,不拖泥带水,总之:非常好! 5,附件: 源码+就业指导面试资料. 下载地址:http://www.java ...

  6. java二嗨租车项目_Java入门第二季 项目实战 达达租车系统代码实现

    car.java package com.meteor.dada.vo; /** * 汽车类,封装租车的共有属性 * * @author 刘佳星 * @version v1.0 */ public a ...

  7. 大二项目实战:使用flutter开发的学生端app【云山印尼语学习辅助平台】

    项目介绍 云山印尼语学习辅助平台 (简称"云印") 是一款主要面向学习印尼语的高校学生和印尼语教师以及其他印尼语学习者的辅助学习平台. "云印"功能丰富,满足学 ...

  8. MongoDB入门学习(二):MongoDB的基本概念和数据类型

    上一篇讲了MongoDB的安装和管理,当中涉及到了一些概念,数据结构另一些API的调用,不知道的没关系,事实上非常easy,这篇会简介一下. 1.文档 文档是MongoDB的核心概念.多个键值对有序的 ...

  9. android从入门到精通-项目实战(心得及源码)

    个人心得 这个周的时间,我用了三天的时间跟着书籍上面的内容实现了,家庭理财通这个小的app,算是用来练手的开始.首先开始实现的时候,我是先从项目的架构开始,首先你的先理解者这个APP具体是干什么的,有 ...

  10. 【Go】Go语言视频零基础入门到精通项目实战web-基础篇

    文章目录 day3 1.类型转换 1.1 简单的类型转换 1.2 strconv 1.3 strings 1.4 println 与printf 的区别 2.指针 3.函数参数传递 4.defer 5 ...

最新文章

  1. 中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》...
  2. 数据库 第一、二、三范式
  3. 全栈深度学习第5期: 神经网络调试技巧
  4. Oracle GoldenGate 详解
  5. 梦想还是要有的 万一实现了呢
  6. 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)
  7. php学习第一讲----php是什么?
  8. 无监督学习与有监督学习的本质区别是什么_深度学习使用无监督学习检测模式...
  9. leaflet+vue:色斑图的实现大体步骤
  10. docker镜像下载及docker镜像管理
  11. PPT设计制作与美化
  12. 给浏览器添加油猴插件 and 如何使用
  13. Android 开发,你遇上 Emoji 头疼吗?
  14. 01_开关电源设计-电源反馈电路怎么设计?TL431配合光耦反馈电路实例设计
  15. 基于react hook的砸金蛋动画
  16. 黄仁勋口述:英伟达的发展之道和星辰大海
  17. 天使投资人刘峻:腾讯的七条命 |捕手志
  18. CentOS下安装cups实现局域网共享HP1020打印机
  19. BOM:窗口位置、页面视口大小、window.open
  20. 著名的菲波拉契(Fibonacci)数列,其第一项为0,第二项为1,从第三项开始,其每一项都是前两项的和。编程求出该数列前N项数据。

热门文章

  1. wmctf2022 两题PvsZ
  2. 学员管理系统(完整版)
  3. IE、FF、Safari、OP不同浏览器兼容报告
  4. LazyT——C#基础知识回顾
  5. 401832-00-4,Thalidomide-O-PEG4-Amine在EDC或HATU存在下与NHS酯基或羧酸反应的合成化合物
  6. jieba分词关键字含英文和特殊字符的处理方法
  7. 【读书分享】《解忧杂货店》东野圭吾
  8. (保姆级教程)免费将pdf转化为word文档,不限页数
  9. 语音识别 特征提取(一)
  10. va_buffersharing example