学习进度条

今日所花时间:一小时
今日代码量:100行
博客量:一篇
了解到的知识点:

一、今日开发概况

今日在团队作业中进行保养计划相关功能的开发,所花时间约一小时,代码量达到 100 行,同时完成了一篇关于此次开发的博客总结。在这个过程中,我使用了多种技术,也学到了不少新的知识点,下面将详细介绍。

二、代码展示

1. MaintenancePlanController.java

package com.example.littlebabydemo0425.controller;

import com.example.littlebabydemo0425.mapper.MaintenancePlanMapper;
import com.example.littlebabydemo0425.pojo.MaintenancePlan;
import com.example.littlebabydemo0425.pojo.PageBean;
import com.example.littlebabydemo0425.pojo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/api/maintenance-plans/")
@CrossOrigin(origins = "http://localhost:5174")
public class MaintenancePlanController {

    @Autowired
    private MaintenancePlanMapper maintenancePlanMapper;

    @GetMapping
    public Result<PageBean<MaintenancePlan>> list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestParam(required = false) String planCode,
            @RequestParam(required = false) String planName,
            @RequestParam(required = false) String deviceType,
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
            @RequestParam(required = false) String frequency,
            @RequestParam(required = false) Integer duration,
            @RequestParam(required = false) Integer minStayTime)
            {

        PageBean<MaintenancePlan> pb = maintenancePlanMapper.list(
                pageNum, pageSize, planCode, planName, deviceType, status,startTime,frequency,duration,minStayTime);
        return Result.success(pb);
    }

    @PostMapping
    public Result<String> add(@RequestBody MaintenancePlan maintenancePlan) {
        maintenancePlanMapper.insert(maintenancePlan);
        return Result.success("添加成功");
    }

    @PutMapping
    public Result<String> update(@RequestBody MaintenancePlan maintenancePlan) {
        maintenancePlanMapper.update(maintenancePlan);
        return Result.success("更新成功");
    }

    @DeleteMapping("/{planCode}")
    public Result<String> delete(@PathVariable String planCode) {
        maintenancePlanMapper.deleteByPlanCode(planCode);
        return Result.success("删除成功");
    }

    @GetMapping("/{planCode}")
    public Result<MaintenancePlan> getByPlanCode(@PathVariable String planCode) {
        MaintenancePlan plan = maintenancePlanMapper.selectByPlanCode(planCode);
        return Result.success(plan);
    }
}

2. MaintenancePlanMapper.java

package com.example.littlebabydemo0425.mapper;

import com.example.littlebabydemo0425.pojo.MaintenancePlan;
import com.example.littlebabydemo0425.pojo.PageBean;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.jdbc.SQL;

import java.util.Date;
import java.util.List;

@Mapper
public interface MaintenancePlanMapper {

    @Insert("INSERT INTO maintenance_plan " +
            "(plan_code, plan_name, device_type, start_time, end_time, " +
            "frequency, duration, min_stay_time, status) " +
            "VALUES " +
            "(#{planCode}, #{planName}, #{deviceType}, #{startTime}, #{endTime}, " +
            "#{frequency}, #{duration}, #{minStayTime}, #{status})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(MaintenancePlan maintenancePlan);

    @Update("UPDATE maintenance_plan SET " +
            "plan_name = #{planName}, device_type = #{deviceType}, " +
            "start_time = #{startTime}, end_time = #{endTime}, " +
            "frequency = #{frequency}, duration = #{duration}, " +
            "min_stay_time = #{minStayTime}, status = #{status} " +
            "WHERE plan_code = #{planCode}")
    int update(MaintenancePlan maintenancePlan);

    @Delete("DELETE FROM maintenance_plan WHERE plan_code = #{planCode}")
    int deleteByPlanCode(String planCode);

    @Select("SELECT * FROM maintenance_plan WHERE plan_code = #{planCode}")
    MaintenancePlan selectByPlanCode(String planCode);

    @Select("SELECT * FROM maintenance_plan")
    List<MaintenancePlan> selectAll();

    @Select("SELECT * FROM maintenance_plan WHERE device_type = #{deviceType}")
    List<MaintenancePlan> selectByDeviceType(String deviceType);

    @Select("SELECT * FROM maintenance_plan WHERE status = #{status}")
    List<MaintenancePlan> selectByStatus(Integer status);

    @Update("UPDATE maintenance_plan SET status = #{status} WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);

    @Select("SELECT * FROM maintenance_plan LIMIT #{offset}, #{pageSize}")
    List<MaintenancePlan> selectByPage(@Param("offset") Integer offset,
                                       @Param("pageSize") Integer pageSize);

    @Select("SELECT COUNT(*) FROM maintenance_plan")
    int count();

    /**
     * 分页查询维护计划列表
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @param planCode 计划编码(可选)
     * @param planName 计划名称(可选)
     * @param deviceType 设备类型(可选)
     * @param status 状态(可选)
     * @param startTime 开始时间(可选)
     * @param frequency 频率(可选)
     * @param duration 持续时间(可选)
     * @param minStayTime 最小停留时间(可选)
     * @return 分页结果
     */
    default PageBean<MaintenancePlan> list(
            Integer pageNum, Integer pageSize,
            String planCode, String planName,
            String deviceType, Integer status,
            Date startTime, String frequency,
            Integer duration, Integer minStayTime) {

        PageBean<MaintenancePlan> pb = new PageBean<>();

        // 计算偏移量
        int offset = (pageNum - 1) * pageSize;

        // 查询数据
        List<MaintenancePlan> plans = selectByCondition(
                planCode, planName, deviceType, status,
                startTime, frequency, duration, minStayTime,
                offset, pageSize);
        pb.setItems(plans);

        // 查询总数
        long total = countByCondition(planCode, planName, deviceType, status,
                startTime, frequency, duration, minStayTime);
        pb.setTotal(total);

        return pb;
    }

    @SelectProvider(type = MaintenancePlanSqlProvider.class, method = "selectByCondition")
    List<MaintenancePlan> selectByCondition(
            @Param("planCode") String planCode,
            @Param("planName") String planName,
            @Param("deviceType") String deviceType,
            @Param("status") Integer status,
            @Param("startTime") Date startTime,
            @Param("frequency") String frequency,
            @Param("duration") Integer duration,
            @Param("minStayTime") Integer minStayTime,
            @Param("offset") int offset,
            @Param("pageSize") int pageSize);

    @SelectProvider(type = MaintenancePlanSqlProvider.class, method = "countByCondition")
    long countByCondition(
            @Param("planCode") String planCode,
            @Param("planName") String planName,
            @Param("deviceType") String deviceType,
            @Param("status") Integer status,
            @Param("startTime") Date startTime,
            @Param("frequency") String frequency,
            @Param("duration") Integer duration,
            @Param("minStayTime") Integer minStayTime);

    // SQL提供类
    class MaintenancePlanSqlProvider {
        public String selectByCondition(
                @Param("planCode") String planCode,
                @Param("planName") String planName,
                @Param("deviceType") String deviceType,
                @Param("status") Integer status,
                @Param("startTime") Date startTime,
                @Param("frequency") String frequency,
                @Param("duration") Integer duration,
                @Param("minStayTime") Integer minStayTime,
                @Param("offset") int offset,
                @Param("pageSize") int pageSize) {

            return new SQL() {{
                SELECT("*");
                FROM("maintenance_plan");
                if (planCode != null && !planCode.isEmpty()) {
                    WHERE("plan_code LIKE CONCAT('%', #{planCode}, '%')");
                }
                if (planName != null && !planName.isEmpty()) {
                    WHERE("plan_name LIKE CONCAT('%', #{planName}, '%')");
                }
                if (deviceType != null && !deviceType.isEmpty()) {
                    WHERE("device_type LIKE CONCAT('%', #{deviceType}, '%')");
                }
                if (status != null) {
                    WHERE("status = #{status}");
                }
                if (startTime != null) {
                    WHERE("start_time >= #{startTime}");
                }
                if (frequency != null && !frequency.isEmpty()) {
                    WHERE("frequency = #{frequency}");
                }
                if (duration != null) {
                    WHERE("duration = #{duration}");
                }
                if (minStayTime != null) {
                    WHERE("min_stay_time = #{minStayTime}");
                }
                ORDER_BY("id DESC");
            }}.toString() + " LIMIT #{offset}, #{pageSize}";
        }

        public String countByCondition(
                @Param("planCode") String planCode,
                @Param("planName") String planName,
                @Param("deviceType") String deviceType,
                @Param("status") Integer status,
                @Param("startTime") Date startTime,
                @Param("frequency") String frequency,
                @Param("duration") Integer duration,
                @Param("minStayTime") Integer minStayTime) {

            return new SQL() {{
                SELECT("COUNT(*)");
                FROM("maintenance_plan");
                if (planCode != null && !planCode.isEmpty()) {
                    WHERE("plan_code LIKE CONCAT('%', #{planCode}, '%')");
                }
                if (planName != null && !planName.isEmpty()) {
                    WHERE("plan_name LIKE CONCAT('%', #{planName}, '%')");
                }
                if (deviceType != null && !deviceType.isEmpty()) {
                    WHERE("device_type LIKE CONCAT('%', #{deviceType}, '%')");
                }
                if (status != null) {
                    WHERE("status = #{status}");
                }
                if (startTime != null) {
                    WHERE("start_time >= #{startTime}");
                }
                if (frequency != null && !frequency.isEmpty()) {
                    WHERE("frequency = #{frequency}");
                }
                if (duration != null) {
                    WHERE("duration = #{duration}");
                }
                if (minStayTime != null) {
                    WHERE("min_stay_time = #{minStayTime}");
                }
            }}.toString();
        }
    }
}

3. MaintenancePlan.java

package com.example.littlebabydemo0425.pojo;

import jakarta.persistence.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Entity
@Table(name = "maintenance_plan", indexes = {
        @Index(name = "idx_device_type", columnList = "device_type"),
        @Index(name = "idx_status", columnList = "status")
})
public class MaintenancePlan {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "plan_code", length = 64, nullable = false)
    private String planCode;

    @Column(name = "plan_name", length = 128, nullable = false)
    private String planName;

    @Column(name = "device_type", length = 32, nullable = false)
    private String deviceType;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "start_time", nullable = false)
    private Date startTime;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Column(name = "end_time", nullable = false)
    private Date endTime;

    @Column(name = "frequency", length = 16, nullable = false)
    private String frequency;

    @Column(name = "duration")
    private Integer duration;

    @Column(name = "min_stay_time", columnDefinition = "int default 2")
    private Integer minStayTime = 2;

    @Column(name = "status", columnDefinition = "tinyint default 1")
    private Integer status = 1;

    @Column(name = "create_time", columnDefinition = "datetime default CURRENT_TIMESTAMP")
    private Date createTime;

    @Column(name = "update_time", columnDefinition = "datetime default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
    private Date updateTime;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPlanCode() {
        return planCode;
    }

    public void setPlanCode(String planCode) {
        this.planCode = planCode;
    }

    public String getPlanName() {
        return planName;
    }

    public void setPlanName(String planName) {
        this.planName = planName;
    }

    public String getDeviceType() {
        return deviceType;
    }

    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }

    public Date getStartTime() {
        return startTime;
    }

    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }

    public String getFrequency() {
        return frequency;
    }

    public void setFrequency(String frequency) {
        this.frequency = frequency;
    }

    public Integer getDuration() {
        return duration;
    }

    public void setDuration(Integer duration) {
        this.duration = duration;
    }

    public Integer getMinStayTime() {
        return minStayTime;
    }

    public void setMinStayTime(Integer minStayTime) {
        this.minStayTime = minStayTime;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

三、使用到的技术和知识点

1. Spring Boot

  • RestController:在 MaintenancePlanController 类上使用了 @RestController 注解,它是 @Controller@ResponseBody 的组合注解。@Controller 用于标记该类为 Spring MVC 的控制器,而 @ResponseBody 则表示方法的返回值会直接作为 HTTP 响应的内容返回,通常用于返回 JSON 数据,这在前后端分离的开发中非常实用。
  • RequestMapping@RequestMapping("/api/maintenance-plans/") 注解用于映射 HTTP 请求的 URL 路径。通过该注解,我们可以将不同的 HTTP 请求(如 GET、POST、PUT、DELETE)映射到控制器的不同方法上,实现对保养计划资源的增删改查操作。
  • Autowired:在 MaintenancePlanController 中,使用 @Autowired 注解将 MaintenancePlanMapper 注入到控制器中。Spring 框架会自动查找 MaintenancePlanMapper 的实现类并进行注入,实现了依赖注入,降低了代码的耦合度。

2. MyBatis

  • Mapper 接口MaintenancePlanMapper 是一个 MyBatis 的 Mapper 接口,使用 @Mapper 注解标记。MyBatis 会自动为该接口生成实现类,我们可以通过该接口的方法来执行 SQL 操作。
  • SQL 注解:在 MaintenancePlanMapper 中,使用了 @Insert@Update@Delete@Select 等注解来定义 SQL 语句。例如,@Insert 注解用于插入数据,@Select 注解用于查询数据。这种方式可以直接在 Java 代码中编写 SQL 语句,方便快捷。
  • SQL 提供类MaintenancePlanSqlProvider 类用于动态生成 SQL 语句。在复杂的查询场景中,如根据不同的条件进行查询,使用 SQL 提供类可以根据传入的参数动态生成 SQL 语句,提高了代码的灵活性和可维护性。

3. JPA(Java Persistence API)

  • Entity 注解:在 MaintenancePlan 类上使用了 @Entity 注解,将该类标记为 JPA 实体类。@Table 注解用于指定该实体类对应的数据库表名,@Index 注解用于为表创建索引,提高查询性能。
  • 主键生成策略@Id 注解用于标记实体类的主键字段,@GeneratedValue(strategy = GenerationType.IDENTITY) 表示使用数据库的自增主键策略。
  • 日期格式化@DateTimeFormat(pattern = "yyyy-MM-dd") 注解用于指定日期字段的格式化方式,确保日期数据在传输和存储时的一致性。

4. 分页查询

MaintenancePlanMapperlist 方法中实现了分页查询功能。通过计算偏移量,结合 SQL 的 LIMIT 关键字,实现了从数据库中分页获取数据。同时,通过查询总数,将数据总数和当前页的数据封装到 PageBean 对象中返回给前端,方便前端进行分页展示。

5. 跨域处理

MaintenancePlanController 类上使用了 @CrossOrigin(origins = "http://localhost:5174") 注解,允许来自 http://localhost:5174 域名的跨域请求。在前后端分离的开发中,由于前后端可能运行在不同的域名和端口上,需要进行跨域处理才能正常通信。

四、总结

通过这次保养计划功能的开发,我深入学习和实践了 Spring Boot、MyBatis、JPA 等技术,掌握了 RESTful API 的开发、动态 SQL 生成、分页查询和跨域处理等知识点。这些技术和知识点将对我今后的项目开发有很大的帮助。在后续的开发中,我将继续学习和探索,不断提高自己的编程能力。

posted @ 2025-05-23 16:25  haoyinuo  阅读(11)  评论(0)    收藏  举报