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: