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:

  

上一篇:sping boot tk.mybatis逆向工程自动生成xml和dao


下一篇:使用java5的注解和Sping/AspectJ的AOP 来实现Memcached的缓存