• Sping-mongodb


    Sping-mongodb   数据库 

              001 

           

    1     吐槽微服务

    1.1   需求分析

    采用SpringDataMongoDB框架实现吐槽微服务的持久层。 实现功能:

    (1)   基本增删改查API

    (2)根据上级ID查询吐槽列表

    (3)吐槽点赞

    (4)发布吐槽

    1.2   代码编写

    1.2.1 模块搭建

    (1)搭建子模块 tensquare_spit

    (2)pom.xml引入依赖

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-mongodb</artifactId>

    </dependency>

    <dependency>

    <groupId>com.tensquare</groupId>

    <artifactId>tensquare_common</artifactId>

    <version>1.0-SNAPSHOT</version>

    </dependency>

    (3)创建application.yml

    server:

      port: 9006

    spring:

      application:

        name: tensquare-spit #指定服务名

      data:

        mongodb:

          host: localhost

          database: spitdb

    (4)创建启动类

    @SpringBootApplication

    public class SpitApplication {

    public static void main(String[] args) {

    SpringApplication.run(SpitApplication.class, args);

    }

    @Bean

    public IdWorker idWorkker(){

    return new IdWorker(1, 1);

    }

    }

    1.2.2 基本增删改查API实现

    (1)创建实体类

    创建包com.tensquare.spit,包下建包pojo 用于存放实体类,创建实体类

    /**

    * 吐槽

    * @author Administrator

    *

    */

    public class Spit implements Serializable{

    @Id

    private String _id;

    private String content;

    private Date publishtime;

    private String userid;

    private String nickname;

    private Integer visits;

    private Integer thumbup;

    private Integer share;

    private Integer comment;

    private String state;

    private String parentid;

    // getter and setter .....

    }

    (2)创建数据访问接口

    com.tensquare.spit包下创建dao包,包下创建接口

    /**

    * 吐槽数据访问层

    * @author Administrator

    *

    */

    public interface SpitDao extends MongoRepository<Spit, String>{

    }

    (3)创建业务逻辑类

    com.tensquare.spit包下创建service包,包下创建类

    @Service

    public class SpitService {

    @Autowired

    private SpitDao spitDao;

    @Autowired

    private IdWorker idWorker;

    /**

    * 查询全部记录

    * @return

    */

    public List<Spit> findAll(){

    return spitDao.findAll();

    }

     

     

     

     

    /**

    * 根据主键查询实体

    * @param id

    * @return

    */

    public Spit findById(String id){

    Spit spit = spitDao.findById(id).get();

    return spit;

    }

     

    /**

    * 增加

    * @param spit

    */

    public void add(Spit spit) {

    spit.set_id(idWorker.nextId()+""); //主键值

    spitDao.save(spit);

    }

     

    /**

    * 修改

    * @param spit

    */

    public void update(Spit spit) {

    spitDao.save(spit);

    }

     

    /**

    * 删除

    * @param id

    */

    public void deleteById(String id) {

    spitDao.deleteById(id);

    }

    }

    (4)com.tensquare.spit包下创建controller类

    @RestController

    @CrossOrigin

    @RequestMapping("/spit")

    public class SpitController {

    @Autowired

    private SpitService spitService;

    /**

    * 查询全部数据

    * @return

    */

    @RequestMapping(method= RequestMethod.GET)

    public Result findAll(){

    return new Result(true, StatusCode.OK,"查询成

    功",spitService.findAll());

    }

     

    /**

    * 根据ID查询

    * @param id ID

    * @return

    */

    @RequestMapping(value="/{id}",method=RequestMethod.GET)

    public Result findOne(@PathVariable String id){

    return new Result(true,StatusCode.OK,"查询成

    功",spitService.findById(id));

    }

     

    /**

    * 增加

    * @param spit

    */

    @RequestMapping(method=RequestMethod.POST)

    public Result add(@RequestBody Spit spit ){

    spitService.add(spit);

    return new Result(true,StatusCode.OK,"增加成功");

    }

     

    /**

    * 修改

    * @param spit

    */

    @RequestMapping(value="/{id}",method=RequestMethod.PUT)

    public Result update(@RequestBody Spit spit,@PathVariable String id )

    {

    spit.set_id(id);

    spitService.update(spit);

    return new Result(true,StatusCode.OK,"修改成功");

    }

    /**

    * 删除

    * @param id

    */

    @RequestMapping(value="/{id}",method=RequestMethod.DELETE)

    public Result deleteById(@PathVariable String id ){

    spitService.deleteById(id);

    return new Result(true,StatusCode.OK,"删除成功");

    }

     

     

    1.2.3 根据上级ID查询吐槽列表

    (1)SpitDao新增方法定义

    /**

    * 根据上级ID查询吐槽列表(分页)

    * @param parentid

    * @param pageable

    * @return

    */

    public Page<Spit> findByParentid(String parentid,Pageable pageable);

    (2)SpitService新增方法

    /**

    * 根据上级ID查询吐槽列表

    * @param parentid

    * @param page

    * @param size

    * @return

    */

    public Page<Spit> findByParentid(String parentid,int page, int size){

    PageRequest pageRequest = PageRequest.of(page-1, size);

    return spitDao.findByParentid(parentid, pageRequest);

    }

    (3)SpitController新增方法

    /**

    * 根据上级ID查询吐槽分页数据

    * @param page

    * @param size

    * @return

    */

    @RequestMapping(value="/comment/{parentId}/{page}/{size}",method=RequestMethod.GET)

    public Result findByParentid(@PathVariable String parentId,

    @PathVariable int page,@PathVariable int size){

    Page<Spit> pageList = spitService.findByParentid(parentId,page,

    size);

    return new Result(true,StatusCode.OK,"查询成功",

    new PageResult<Spit>(pageList.getTotalElements(),

    pageList.getContent()));

    }

    1.2.4 吐槽点赞

    我们看一下以下点赞的代码: SpitService 新增updateThumbup方法

    /**

    * 点赞

    * @param id

    */

    public void updateThumbup(String id){

    Spit spit = spitDao.findById(id).get();

    spit.setThumbup(spit.getThumbup()+1);

    spitDao.save(spit);

    }

    以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。

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

    (1)修改SpitService

    @Autowired

    private MongoTemplate mongoTemplate;

    /**

    * 点赞

    * @param id

    */

    public void updateThumbup(String id){

    Query query=new Query();

    query.addCriteria(Criteria.where("_id").is(id));

    Update update=new Update();

    update.inc("thumbup",1);

    mongoTemplate.updateFirst(query,update,"spit");

    }

    (2)SpitController新增方法

    /**

    * 点赞

    * @param id

    * @return

    */

    @RequestMapping(value="/thumbup/{id}",method=RequestMethod.PUT)

    public Result updateThumbup(@PathVariable String id){

    spitService.updateThumbup(id);

    return new Result(true,StatusCode.OK,"点赞成功");

    }

    1.2.5 控制不能重复点赞

    我们可以通过redis控制用户不能重复点赞

    (1)首先引入依赖

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

    </dependency>

    (2)修改application.yml

    redis:

    host: 192.168.184.135

    (3)修改SpitController代码逻辑

    @Autowired

    private RedisTemplate redisTemplate;

    /**

    * 吐槽点赞

    * @param id

    * @return

    */

    @RequestMapping(value = "/thumbup/{id}", method = RequestMethod.PUT)

    public Result updateThumbup(@PathVariable String id){

    //判断用户是否点过赞

    String userid="2023";// 后边我们会修改为当前登陆的用户

    if(redisTemplate.opsForValue().get("thumbup_"+userid+"_"+

    id)!=null){

    return new Result(false,StatusCode.REPERROR,"你已经点过赞了");

    }

    spitService.updateThumbup(id);

    redisTemplate.opsForValue().set("thumbup_"+userid+"_"+ id,"1");

    return new Result(true,StatusCode.OK,"点赞成功");

    }

    1.2.6 发布吐槽

    修改SpitService的add方法

    /**

    * 发布吐槽(或吐槽评论)

    * @param spit

    */

    public void add(Spit spit){

    spit.set_id( idWorker.nextId()+"" );

    spit.setPublishtime(new Date());//发布日期

    spit.setVisits(0);//浏览量

    spit.setShare(0);//分享数

    spit.setThumbup(0);//点赞数

    spit.setComment(0);//回复数

    spit.setState("1");//状态

    if(spit.getParentid()!=null && !"".equals(spit.getParentid())){//

    如果存在上级ID,评论

    Query query=new Query();

    query.addCriteria(Criteria.where("_id").is(spit.getParentid()));

    Update update=new Update();

    update.inc("comment",1);

    mongoTemplate.updateFirst(query,update,"spit");

    }

    spitDao.save(spit);

    }

    1.2.7 增加浏览量与分享数

    学员实现

    2     文章评论功能开发

    2.1   表结构分析

    集合结构:

    (2)  专栏文章评论

    comment

    (3)  字段名称

    字段含义

    字段类型

    备注

    (4)  _id

    ID

    文本

    (5)  articleid

    文章ID

    文本

    (6)  content

    评论内容

    文本

    (7)  userid

    评论人ID

    文本

    (8)  parentid

    评论ID

    文本

    如果为0表示文章的顶级评论

    publishdate

    评论日期

    日期

    2.2   代码编写

    以下功能学员实现

    2.2.1 新增评论

    (1)修改tensquare_article工程的pom.xml

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-mongodb</artifactId>

    </dependency>

    (2)修改application.yml ,在spring节点下新增配置

    data:

    mongodb:

    host: 192.168.184.134

    database: recruitdb

    (3)创建实体类

    /**

    * 文章评论(mongoDB)

    * @author Administrator

    *

    */

    public class Comment implements Serializable{

    @Id

    private String _id;

    private String articleid;

    private String content;

    private String userid;

    private String parentid;

    private Date publishdate;

    //getter and setter....

    }

    (4)创建数据访问接口

    /**

    * 评论Dao

    * @author Administrator

    *

    */

    public interface CommentDao extends MongoRepository<Comment, String> {

    }

    (5)创建业务逻辑类

    @Service

    public class CommentService {

    @Autowired

    private CommentDao commentDao;

    @Autowired

    private IdWorker idWorker;

    public void add(Comment comment){

    comment.setId( idWorker.nextId()+"" );

    commentDao.save(comment);

    }

    }

    (6)创建控制器类

    @RestController

    @CrossOrigin

    @RequestMapping("/comment")

    public class CommentController {

    @Autowired

    private CommentService commentService;

    @RequestMapping(method= RequestMethod.POST)

    public Result save(@RequestBody Comment comment){

    commentService.add(comment);

    return new Result(true, StatusCode.OK, "提交成功 ");

    }

    }

    2.2.2 根据文章ID查询评论列表

    (1)CommentDao新增方法定义

    /**

    * 根据文章ID查询评论列表

    * @param articleid

    * @return

    */

    public List<Comment> findByArticleid(String articleid);

    (2)CommentService新增方法

    public List<Comment> findByArticleid(String articleid){

    return commentDao.findByArticleid(articleid);

    }

    (3)CommentController新增方法

    @RequestMapping(value="/article/{articleid}",method= RequestMethod.GET)

    public Result findByArticleid(@PathVariable String articleid){

    return new Result(true, StatusCode.OK, "查询成功",

    commentService.findByArticleid(articleid));

    }

    2.2.3 删除评论

    代码略

    面试问题总结

    你在项目中有没有使用到mongodb?

    你的工程是如何操作MongoDB的?

    spring data mongodb

    在项目的哪些场景下使用MongoDB  ?

    吐槽 、文章评论

    为什么在吐槽和文章评论中使用Mongodb而不使 用mysql?

    吐槽和评论都是数据量较大且价值较低的数据,为了减轻mysql的压力,我们使用mongodb

    分布式缓存
    1: 接口中的成员变量可以使用修饰符是: public
    2: 声明接口的关键字是:interface
    3: executeQuery()返回接口是:ResultSet
    4:

      

    好事尽从难中得,少年勿向易中求。
  • 相关阅读:
    Express ejs 3.* layout.ejs
    old header
    mac 命令行 安装 需要管理员 权限
    Understanding the Debug Log
    insufficient_access_on_cross_reference_entity APEX / Salesforce
    custom list view
    exam help
    Backbone.js Wine Cellar 教程
    理解RESTful架构
    SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
  • 原文地址:https://www.cnblogs.com/hanqinshuai888/p/11597918.html
Copyright © 2020-2023  润新知