学习进度条
今日所花时间:一小时
今日代码量: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. 分页查询
在 MaintenancePlanMapper 的 list 方法中实现了分页查询功能。通过计算偏移量,结合 SQL 的 LIMIT 关键字,实现了从数据库中分页获取数据。同时,通过查询总数,将数据总数和当前页的数据封装到 PageBean 对象中返回给前端,方便前端进行分页展示。
5. 跨域处理
在 MaintenancePlanController 类上使用了 @CrossOrigin(origins = "http://localhost:5174") 注解,允许来自 http://localhost:5174 域名的跨域请求。在前后端分离的开发中,由于前后端可能运行在不同的域名和端口上,需要进行跨域处理才能正常通信。
四、总结
通过这次保养计划功能的开发,我深入学习和实践了 Spring Boot、MyBatis、JPA 等技术,掌握了 RESTful API 的开发、动态 SQL 生成、分页查询和跨域处理等知识点。这些技术和知识点将对我今后的项目开发有很大的帮助。在后续的开发中,我将继续学习和探索,不断提高自己的编程能力。

浙公网安备 33010602011771号