实战 Java 第12天:开发商品点赞接口
前言
用户可以对自己喜欢的商品点赞,今天将开发商品点赞接口。
一、新建praise点赞表
- 建表语句如下:
CREATE TABLE `praise` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`product_id` int(11) DEFAULT NULL COMMENT '商品编号',
`user_id` int(11) DEFAULT NULL COMMENT '点赞用户编号',
`status` tinyint(2) DEFAULT '1' COMMENT '点赞状态 1-点赞 2-取消赞',
`praise_time` datetime DEFAULT NULL COMMENT '点赞时间/取消点赞时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='点赞表';
二、新建Praise实体类
- 新建Praise实体类
package com.dingding.entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
@Table(name = "praise")
public class Praise {
@Id
private Integer id;
private Integer productId;
private Integer userId;
private Integer status;
private Date praiseTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Date getPraiseTime() {
return praiseTime;
}
public void setPraiseTime(Date praiseTime) {
this.praiseTime = praiseTime;
}
}
三、新建 PraiseMapper 接口
新建PraiseMapper接口,并继承tk.mybatis.mapper.common.Mapper接口。
package com.dingding.mapper;
import com.dingding.entity.Praise;
import tk.mybatis.mapper.common.Mapper;
public interface PraiseMapper extends Mapper<Praise> {
}
四、新建PraiseMapper.xml文件
新建PraiseMapper.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dingding.mapper.PraiseMapper">
<resultMap id="BaseResultMap" type="com.dingding.entity.Praise">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="product_id" jdbcType="INTEGER" property="productId" />
<result column="user_id" jdbcType="INTEGER" property="userId" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="praise_time" jdbcType="TIMESTAMP" property="praiseTime" />
</resultMap>
</mapper>
五、新建 PraiseService 接口类
- 新建 PraiseService 接口类,并添加save接口,实现点赞功能。
package com.dingding.service;
import com.dingding.entity.Praise;
public interface PraiseService {
int save(Praise praise);
}
- 新建 PraiseServiceImpl 类并添加实现。
package com.dingding.service.impl;
import com.dingding.entity.Praise;
import com.dingding.mapper.PraiseMapper;
import com.dingding.service.PraiseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
public class PraiseServiceImpl implements PraiseService {
@Autowired
private PraiseMapper praiseMapper;
@Override
public int save(Praise praise) {
// 先查询是否有点赞记录
Example example = new Example(Praise.class);
example.createCriteria().andEqualTo("productId", praise.getProductId())
.andEqualTo("userId", praise.getUserId());
List<Praise> praiseList = praiseMapper.selectByExample(example);
if (praiseList != null && praiseList.size() > 0) {
// 存在点赞记录,修改操作
Praise old = praiseList.get(0);
// 新建修改对象目的是为了减少update不必要的字段,与后面调用的updateByPrimaryKeySelective方法对应
Praise update = new Praise();
update.setStatus(praise.getStatus());
update.setPraiseTime(praise.getPraiseTime());
update.setId(old.getId());
// 通用修改方法,根据主键修改,只修改有值的字段
return praiseMapper.updateByPrimaryKeySelective(update);
} else {
// 不存在点赞记录
// mybatis 通用插入
// insert 与 insertSelective 区别在于 insertSelective 会忽略 praise 对象中的值为null的属性
return praiseMapper.insertSelective(praise);
}
}
}
六、新建 PraiseController 类并添加业务逻辑
package com.dingding.controller;
import com.dingding.entity.Praise;
import com.dingding.entity.Response;
import com.dingding.service.PraiseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Map;
@RestController
public class PraiseController {
@Autowired
private PraiseService praiseService;
@RequestMapping(value = "praise", method = RequestMethod.POST)
public Response praise(@RequestBody Map<String, Object> params) {
int productId = (int) params.get("productId");
int userId = (int) params.get("userId");
int status = (int) params.get("status");
Praise praise = new Praise();
praise.setProductId(productId);
praise.setUserId(userId);
praise.setPraiseTime(new Date());
praise.setStatus(status);
int count = praiseService.save(praise);
if (count > 0) {
return new Response(true,"操作成功",1);
} else {
return new Response(true,"操作失败",-1);
}
}
}
七、测试接口是否成功
- 使用 postman 验证接口。
- 验证点赞接口
1)选择请求方式为 POST, 在地址栏中输入 http://localhost:8080/praise,选择body并继续选择json格式请求参数,输入请求参数,然后发送请求,正常返回操作结果。
- 对比数据库数据,数据正常,当productId、userId不变时,重复调用接口只会修改status、praise_time字段值,验证ok。

八、总结
点赞接口沿用了之前提到了mybatis example通用操作,本接口使用了通用查询、修改、插入等操作,在调用updateByPrimaryKeySelective或updateByPrimaryKey方法时,需要给实体类id字段加上@Id注解,不然mybatis不能识别主键字段,修改会不生效。还要注意,同一个用户对同一商品操作点赞,不要重复入库数据。可以异常提示,也可以覆盖修改数据库记录。
版权声明:本文为weixin_44135121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。