基于mybatis-plus实现一个自己设计的POST接口

一、前期环境准备

由于并不打算从零开始,只是为了验证一下我设计的接口。所以最便捷的方法是使用一个用了mybatis-plus的项目,github上随便找,从里面开始着手,而且数据库我已经建立好了。

二、接口设计:用于上报用例数据

类型: POST
URL: http://127.0.0.1:9998/api/create-task
请求示例:

请求头

Content-Type: application/json 

请求体:

{
  "user_id": "wangjinsong02@m.com",
  "upload_time": "1672531200",
  "case_name": "test_case_1",
  "test_package": "com.example.app",
  "test_process": "com.example.app.process",
  "test_package_ver": "1.0.0",
  "platform": "Android",
  "device_id": "device123",
  "device_mode": "Model X",
  "cpu": " arm X",
  "screen": "1080x1920",
  "system_version": "10",
  "data_overview": {
    "app_cpu_avg": "10%",
    "total_cpu_avg": "20%",
    "app_memory_avg": "100MB",
    "total_memory_avg": "200MB",
    "app_memory_peak": "150MB",
    "fps_avg": "60",
    "send_traffic_avg": "50KB",
    "recieve_traffic_avg": "100KB",
    "small_jank": "2",
    "big_jank": "1",
    "jank": "3",
    "b_temp_avg": "30C",
    "b_temp_range": "25C-35C"

  },

  "data_list": [
    {
      "app_cpu_rate": "15%",
      "system_cpu_rate": "25%",
      "memory_usage": "120MB",
      "pid_rx": "60KB",
      "pid_tx": "70KB",
      "fps": "55",
      "small_jank": "1",
      "big_jank": "0",
      "focus_window": "Main Activity",
      "temperature": "32C",
      "date_time": "2024/6/20 15:38:27"
    },

    {
      "app_cpu_rate": "18%",
      "system_cpu_rate": "28%",
      "memory_usage": "130MB",
      "pid_rx": "70KB",
      "pid_tx": "80KB",
      "fps": "58",
      "small_jank": "2",
      "big_jank": "1",
      "focus_window": "Settings Activity",
      "temperature": "33C",
      "date_time": "2024/6/20 15:39:27"

    }

  ]

}


返回示例:

{

  "status": 200,

  "message": "Data uploaded successfully",

  "data": {

    "case_id": "upload001"

  }

}

三、详细步骤

1.接口分析

这是一个提交接口,提交的内容涉及到四个表单。所以目前需要一个新的VO来承载这些数据,并且我希望四个实体类能利用这VO初始化自己的属性。要关注的有两个点:用户id如果数据库中已经存在就不插入用户表,否则插入用户表,密码为默认;时间如果传过来为空那么自己设定为当前时间。

2.controller 层

 @PostMapping("/create-task")
    public ResponseEntity<Map<String, Object>> createTask(@RequestBody TaskRequestVO taskRequestVO) {

        taskRequestVO.setCaseId(generateCaseId(taskRequestVO.getCaseName()));
        System.out.println("caseId: " + taskRequestVO.getCaseId());

        Task createdTask = taskService.createTask(taskRequestVO.getTask());
        Device createdDevice = taskService.createDevice (taskRequestVO.getDevice ());
        List<CaseDetail> createdCaceDetails = taskService.createCaceDetail(taskRequestVO.getCaseDetails());
        User createdUser = taskService.createUser(taskRequestVO.getUser());

        Map<String, Object> response = new HashMap<>();
        response.put("status", 200);
        response.put("message", "Data uploaded successfully");
        response.put("task", createdTask);
        response.put("Device", createdDevice);
        response.put("CaceDetail", createdCaceDetails);
        response.put("User", createdUser);
        return ResponseEntity.ok(response);
    }

3.service 层

service

public interface TaskService {
    List<TaskVO> getAllTasks();


    Task createTask(Task task);
    Device createDevice(Device device);
    List<CaseDetail> createCaceDetail( List<CaseDetail> createdCaceDetails);
    User createUser(User user);

}

serviceimpl


    @Override
    public Task createTask(Task task) {
         taskMapper.insert(task);
         return task;
    }

    @Override
    public Device createDevice(Device device) {
        // 实现创建设备的逻辑
        if (deviceMapper.selectById(device.getDeviceId())!=null)
            return null;
        deviceMapper.insert(device);
        return device;
    }
    @Override
   public List<CaseDetail> createCaceDetail( List<CaseDetail> createdCaceDetails){
        caceDetailMapper.insertCaseDetails(createdCaceDetails);
        return createdCaceDetails;
    }

    @Override
    public User createUser(User user) {
        // 实现创建用户的逻辑
        if (userMapper.selectById(user.getUserId())!=null)
            return null;
        else  {userMapper.insert(user);
        return user;}
    }

4.mapper 层

CaceDetailMapper

package cn.ityao.cat.mapper;

import cn.ityao.cat.entity.CaseDetail;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;


public interface CaceDetailMapper extends BaseMapper<CaseDetail> {

    void insertCaseDetails(@Param("caseDetails") List<CaseDetail> caseDetails);
}

CaceDetailMapper.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="cn.ityao.cat.mapper.CaceDetailMapper">

    <insert id="insertCaseDetails">
        INSERT INTO case_detail_table ( case_id, case_name, appCpuRate, systemCpuRate, memory_usage, pid_rx, pid_tx, fps, smalljank, jank, bigjank, temperature, datetime)
        VALUES
        <foreach collection="caseDetails" item="caseDetail" separator=",">
            ( #{caseDetail.caseId}, #{caseDetail.caseName}, #{caseDetail.appCpuRate}, #{caseDetail.systemCpuRate}, #{caseDetail.memoryUsage}, #{caseDetail.pidRx}, #{caseDetail.pidTx}, #{caseDetail.fps}, #{caseDetail.smalljank}, #{caseDetail.jank}, #{caseDetail.bigjank}, #{caseDetail.temperature}, #{caseDetail.datetime})
        </foreach>
    </insert>

</mapper>

5.结果

在这里插入图片描述

四、疑惑和思考

1️⃣为什么项目pom.xml文件添加新的依赖时候Dependency ‘***’ not found?

第一步	去官网https://central.sonatype.com/?smo=true搜索该依赖版本是否存在
第二步	重新maven clean 、compile一下

2️⃣依赖报错为啥在maven compile 不会发现,而在启动app时候出现?

因为 Maven 编译主要关注的是代码的语法和结构是否正确,而不会检查运行时的依赖关系。
Maven 编译时主要关注的是代码的编译依赖,即那些在编译过程中直接使用的依赖。而运行时依赖是指在应用程序运行时需要的依赖,这些依赖可能在编译时不直接使用,因此不会在编译时检查。

3️⃣JSON和JavaScript的渊源

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,JSON格式的数据,主要是为了跨平台交流数据用的。
JSON数据格式是从JavaScript对象中演变出来的,它是JavaScript的一个子集。JSON本身的意思就是JavaScript对象表示法(JavaScript Object Notation),它用严格的JavaScript对象表示法来表示结构化的数据。
它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号;JSON只是一种数据格式(或者叫数据形式),数据格式其实就是一种规范,格式、形式、规范是不能用来存诸数据的。我们不能把以下的对象叫JSON,比如:

4️⃣提交时候的数据库的一致性怎么保证:比如用户不能重复插入

可以在seviceimpl中控制下,如:
  @Override
    public User createUser(User user) {
        // 实现创建用户的逻辑
        if (userMapper.selectById(user.getUserId())!=null)
            return null;
        else  {userMapper.insert(user);
        return user;}
    }

5️⃣提交时候的数据库的一致性怎么保证:比如自增id哪一层管

自增这种数据库插入自增,直接插入语句别写哪个自增语句了。千万别人为逻辑控制,费劲。

6️⃣提交数据的时间格式不一致怎么办?

1.在数据提交之前,确保所有时间数据都遵循一个统一的格式。例如,使用ISO 8601标准格式(如YYYY-MM-DDTHH:MM:SSZ),或者自定义一个固定的格式(如YYYY-MM-DD HH:MM:SS)。
前端解释:

2.在前端接口时间格式的验证,确保用户输入的时间符合标准的格式。可以使用 JavaScript 等前端技术进行验证。
3.服务器端对提交的时间数据进行验证,确保接收到的数据格式正确。如果格式不正确,可以向用户返回错误信息,并提示其重新提交。
时间格式转换:
4.在数据处理层,对不同格式的时间数据进行统一的转换。可以使用日期时间处理库(如Java的SimpleDateFormat、Python的datetime模块等)来解析和格式化时间数据

7️⃣mybatis plus的好用之处

以下两种感受最深,直接插表插入实体类就行。

MyBatis Plus 提供了代码生成器,它会根据数据库表结构自动生成实体类、Mapper 接口、Service 接口及其实现类、Controller 类等,从而大大提高浏览器的可执行性。
MyBatis Plus 提供了通用的 CRUD 方法,如,,,insert等,无需手动编写 SQL 语句,简化了基本的增删改查操作。deleteupdateselect

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值