学习进度条

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

核心功能实现

1. 检测计划实体设计

@Entity
@Table(name = "detection_plan", indexes = {
    @Index(name = "idx_device_type", columnList = "device_type"),
    @Index(name = "idx_status", columnList = "status")
})
public class DetectionPlan {
    @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;
    
    // 其他字段...
}

技术亮点

  • 使用JPA注解定义实体与表的映射关系
  • 为常用查询字段添加索引优化查询性能
  • 字段约束(length, nullable等)确保数据完整性
  • 自动生成主键策略(IDENTITY)

2. 检测计划CRUD接口

分页查询接口

@GetMapping
public Result<PageBean<DetectionPlan>> getDetectionPlans(
        @RequestParam Integer pageNum,
        @RequestParam Integer pageSize,
        @RequestParam(required = false) String deviceType,
        @RequestParam(required = false) String planName,
        @RequestParam(required = false) String status) {
    
    PageBean<DetectionPlan> pageBean = detectionPlanMapper.getDetectionPlans(
        pageNum, pageSize, deviceType, planName, status);
    return Result.success(pageBean);
}

分页实现核心

default PageBean<DetectionPlan> getDetectionPlans(...) {
    PageBean<DetectionPlan> pb = new PageBean<>();
    int offset = (pageNum - 1) * pageSize;
    
    List<DetectionPlan> plans = selectByCondition(deviceType, planName, status, offset, pageSize);
    pb.setItems(plans);
    
    long total = countByCondition(deviceType, planName, status);
    pb.setTotal(total);
    
    return pb;
}

新增检测计划(带事务)

@PostMapping
@Transactional
public Result<DetectionPlan> addDetectionPlan(@RequestBody DetectionPlan detectionPlan) {
    // 验证必要字段
    if (detectionPlan.getPlanName() == null || detectionPlan.getDeviceType() == null) {
        return Result.error("计划名称和设备类型不能为空");
    }
    
    int rowsInserted = detectionPlanMapper.insert(detectionPlan);
    if (rowsInserted > 0) {
        return Result.success(detectionPlan);
    } else {
        return Result.error("添加检测计划失败");
    }
}

事务处理

  • @Transactional注解确保操作原子性
  • 异常时自动回滚
  • 方法级事务控制更精细

状态更新接口(PATCH方法)

@PatchMapping("/{id}/status")
@Transactional
public Result<String> updatePlanStatus(@PathVariable Long id, @RequestParam Integer status) {
    DetectionPlan existingPlan = detectionPlanMapper.selectById(id.toString());
    if (existingPlan == null) {
        return Result.error("未找到对应的检测计划");
    }
    
    int rowsUpdated = detectionPlanMapper.updateStatus(id, status);
    if (rowsUpdated > 0) {
        return Result.success("更新计划状态成功");
    } else {
        return Result.error("更新计划状态失败");
    }
}

RESTful设计

  • 使用PATCH方法进行局部更新
  • 路径变量和请求参数结合使用
  • 符合HTTP语义的状态管理

3. MyBatis高级应用

动态SQL构建

class DetectionPlanSqlProvider {
    public String selectByCondition(...) {
        return new SQL() {{
            SELECT("*");
            FROM("detection_plan");
            if (deviceType != null && !deviceType.isEmpty()) {
                WHERE("device_type LIKE CONCAT('%', #{deviceType}, '%')");
            }
            if (status != null && !status.isEmpty()) {
                WHERE("status = #{status}");
            }
            ORDER_BY("id DESC");
        }}.toString() + " LIMIT #{offset}, #{pageSize}";
    }
}

优势

  • 条件动态拼接避免SQL注入
  • 可读性强的链式调用
  • 支持复杂查询场景

结果集映射

@Select("SELECT * FROM detection_plan WHERE plan_code = #{planCode}")
DetectionPlan selectByPlanCode(String planCode);
  • 自动映射实体字段
  • 支持自定义结果处理器
  • 简化DAO层代码

关键技术点总结

  1. JPA与MyBatis混合使用

    • JPA注解定义实体关系
    • MyBatis处理复杂SQL
    • 两者优势互补
  2. 分页查询优化

    • 物理分页(LIMIT)而非内存分页
    • 总数与数据分离查询
    • 动态条件支持
  3. 事务管理

    • 声明式事务简化代码
    • 传播行为控制
    • 隔离级别配置
  4. RESTful API设计

    • 资源化URL设计
    • 合理使用HTTP方法
    • 状态码规范
  5. 参数校验

    • 业务逻辑校验
    • 非空检查
    • 状态合法性验证

性能优化实践

  1. 数据库索引优化

    @Table(indexes = {
        @Index(name = "idx_device_type", columnList = "device_type"),
        @Index(name = "idx_status", columnList = "status")
    })
    
    • 为查询条件字段添加索引
    • 复合索引设计
    • 索引选择性考虑
  2. SQL优化

    • 避免SELECT *
    • 使用LIMIT分页
    • 条件查询走索引
  3. 事务粒度控制

    • 只对必要操作添加事务
    • 短事务原则
    • 读操作不加事务

学习收获

通过这个模块的开发,我深入理解了以下技术:

  1. Spring事务管理机制

    • 声明式事务实现原理
    • 事务传播行为
    • 隔离级别应用场景
  2. MyBatis高级特性

    • 动态SQL构建
    • 结果集自动映射
    • 注解与XML混合使用
  3. REST API设计原则

    • 资源命名规范
    • 状态码使用
    • 版本控制策略
  4. JPA实体映射

    • 关联关系配置
    • 索引定义
    • 字段约束

后续优化方向

  1. 缓存集成

    • 添加Redis缓存高频数据
    • 缓存失效策略
    • 多级缓存设计
  2. API文档化

    • 集成Swagger
    • 接口描述完善
    • 示例值配置
  3. 性能监控

    • 添加SQL执行监控
    • 慢查询分析
    • 接口响应时间统计
  4. 安全增强

    • 接口权限控制
    • 数据权限过滤
    • 敏感字段加密

这个检测计划管理模块的开发,让我对Spring Boot在企业级应用中的使用有了更深入的理解,特别是在事务管理和复杂查询实现方面积累了宝贵经验。通过合理的架构设计和持续优化,系统在性能和可维护性上都达到了较高水平。

posted @ 2025-05-15 21:42  haoyinuo  阅读(7)  评论(0)    收藏  举报