MongoDB之SpringDataMongoDB操作
1.创建工程引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.创建application.yml
server:
port: 9006
spring:
application:
name: spit #指定服务名
data:
mongodb:
host: 10.211.55.28
database: spitdb
3.创建启动类
使用到分布式ID,有关资料参见:https://blog.****.net/weixin_42545256/article/details/84502448
package com.xdp.spit;
import com.xdp.common.utils.IdWorker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SpitApplication {
public static void main(String[] args) {
SpringApplication.run(SpitApplication.class, args);
}
@Bean
public IdWorker idWorkker() {
return new IdWorker(1, 1);
}
}
4.创建实体类
package com.xdp.spit.entity;
import org.springframework.data.annotation.Id;
import java.io.Serializable;
import java.util.Date;
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;
//get和set方法省略
}
5.DAO
package com.xdp.spit.dao;
import com.xdp.spit.entity.Spit;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface SpitDao extends MongoRepository<Spit,String> {
}
6.Service
package com.xdp.spit.service;
import com.xdp.common.utils.IdWorker;
import com.xdp.spit.dao.SpitDao;
import com.xdp.spit.entity.Spit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@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){
return spitDao.findById(id).get();
}
/**
* 增加
* @param spit
*/
public void save(Spit spit){
//生成分布式ID
String id = idWorker.nextId() + "";
spit.set_id(id);
spitDao.save(spit);
}
/**
* 修改
* @param spit
*/
public void update(Spit spit){
spitDao.save(spit);
}
/**
* 删除
* @param id
*/
public void deleteById(String id){
spitDao.deleteById(id);
}
}
7.Controller
package com.xdp.spit.controller;
import com.xdp.common.entity.Result;
import com.xdp.common.entity.StatusCode;
import com.xdp.spit.entity.Spit;
import com.xdp.spit.service.SpitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin//允许跨域访问
@RequestMapping("/spit")
public class SpitController {
@Autowired
private SpitService spitService;
@RequestMapping(method = RequestMethod.GET)
public Result findAll(){
return new Result(true, StatusCode.OK,"查询成功?",spitService.findAll());
}
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public Result findById(@PathVariable String id){
return new Result(true, StatusCode.OK,"查询成功?",spitService.findById(id));
}
@RequestMapping(method = RequestMethod.POST)
public Result save(@RequestBody Spit spit){
spitService.save(spit);
return new Result(true, StatusCode.OK,"保存成功?");
}
@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,"修改成功?");
}
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public Result deleteById(@PathVariable String id){
spitService.deleteById(id);
return new Result(true, StatusCode.OK,"修改成功?");
}
}
8.运行测试
9.根据上级ID查询吐槽列表
9.1SpitDao新增方法定义
/**
* 根据上级ID查询吐槽列表(分页)
* @param parentId
* @param pageable
* @return
*/
Page<Spit> findByParentid(String parentId, Pageable pageable);
9.2SpitService新增方法
/**
* 根据上级ID查询吐槽列表
* @param parentId
* @param page
* @param size
* @return
*/
public Page<Spit> findByParentid(String parentId,int page,int size){
PageRequest pageRequest = PageRequest.of(page, size);
return spitDao.findByParentid(parentId,pageRequest);
}
9.3SpitController新增方法
@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);
PageResult<Spit> spitPageResult = new PageResult<>(pageList.getTotalElements(), pageList.getContent());
return new Result(true, StatusCode.OK,"查询成功?",spitPageResult);
}
10.编写点赞代码
10.1点赞一次,点赞数加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();
//列值增长1
update.inc("thumbup",1);
mongoTemplate.updateFirst(query,update,"spit");
}
10.2.SpitController新增方法
@RequestMapping(value = "/thumbup/{id}", method = RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id) {
spitService.updateThumbup(id);
return new Result(true, StatusCode.OK, "?点赞成功?");
}
11.通过redis控制用户不能重复点赞
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
修改application.yml
server:
port: 9006
spring:
application:
name: spit #指定服务名
data:
mongodb:
host: 10.211.55.28
database: spitdb
redis:
host: 10.211.55.28
password: 123456
修改SpitController代码逻辑
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping(value = "/thumbup/{id}/{userid}", method = RequestMethod.PUT)
public Result updateThumbup(@PathVariable String id,@PathVariable String userid) {
if ( redisTemplate.opsForValue().get("thumbup_"+userid+"_"+id)==null){
spitService.updateThumbup(id);
redisTemplate.opsForValue().set("thumbup_"+userid+"_"+id,1);
return new Result(true, StatusCode.OK, "?点赞成功?");
}
return new Result(false, StatusCode.REPERROR, "?你已经点赞过了?");
}
12.发布吐槽
修改SpitService的add方法
/**
* 增加
*
* @param spit
*/
public void save(Spit spit) {
//生成分布式ID
String id = idWorker.nextId() + "";
spit.setPublishtime(new Date());//发布日期 spit.setVisits(0);//浏览量
spit.setShare(0);//分享数
spit.setThumbup(0);//点赞数
spit.setComment(0);//回复数
spit.setState("1");//状态
spit.set_id(id);
if (spit.getParentid()!=null&&!(spit.getParentid().equals(""))){
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);
}