实战 Java 第12天:开发商品点赞接口

前言

用户可以对自己喜欢的商品点赞,今天将开发商品点赞接口。

一、新建praise点赞表

  1. 建表语句如下:
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);
        }
    }
}

七、测试接口是否成功

  1. 使用 postman 验证接口。
  • 验证点赞接口
    1)选择请求方式为 POST, 在地址栏中输入 http://localhost:8080/praise,选择body并继续选择json格式请求参数,输入请求参数,然后发送请求,正常返回操作结果。
    在这里插入图片描述
  1. 对比数据库数据,数据正常,当productId、userId不变时,重复调用接口只会修改status、praise_time字段值,验证ok。
    在这里插入图片描述

八、总结

点赞接口沿用了之前提到了mybatis example通用操作,本接口使用了通用查询、修改、插入等操作,在调用updateByPrimaryKeySelective或updateByPrimaryKey方法时,需要给实体类id字段加上@Id注解,不然mybatis不能识别主键字段,修改会不生效。还要注意,同一个用户对同一商品操作点赞,不要重复入库数据。可以异常提示,也可以覆盖修改数据库记录。


版权声明:本文为weixin_44135121原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。