springboot后端进阶
字数 1179 2025-11-08 17:49:25

SpringBoot后端进阶实战教程

一、删除员工功能实现

1. 核心知识点

参数接收方式对比:

  • 列表参数接收:需要使用@RequestParam注解
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids) {
    // 列表传递需要额外加注解
}
  • 数组参数接收:直接对应参数名即可
@DeleteMapping
public Result delete(Integer[] ids) {
    // 数组传递直接对应名字
}

2. 完整实现代码

Controller层:

@DeleteMapping
public Result delete(@RequestParam List<Integer> ids) {
    log.info("删除员工,参数:{}", ids);
    empService.delete(ids);
    return Result.success();
}

Service层:

@Override
public void delete(List<Integer> ids) {
    // 删除员工基本信息
    empMapper.deleteBatch(ids);
    // 删除员工经历信息
    empExprMapper.deleteBatch(ids);
}

Mapper层SQL实现:

删除员工经历表数据:

<delete id="deleteBatch">
    delete from emp_expr 
    where emp_id in
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</delete>

删除员工主表数据:

<delete id="deleteBatch">
    delete from emp 
    where id in
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</delete>

3. MyBatis动态SQL标签说明

  • <foreach>:遍历集合参数
  • collection="ids":指定要遍历的集合参数名
  • item="id":定义当前遍历元素的变量名
  • open="(" close=")":定义循环开始和结束时的字符串
  • separator=",":定义元素之间的分隔符

二、修改员工功能实现

1. 复杂结果集手动映射

适用场景: 当查询结果类型太复杂,无法通过自动映射完成时,需要手动定义ResultMap。

Mapper查询实现:

<select id="getinfo" resultMap="empResultMap">
    <!-- 复杂查询语句 -->
</select>

ResultMap定义详解:

<resultMap id="empResultMap" type="com.itheima.pojo.Emp">
    <!-- 主键字段映射 -->
    <id column="id" property="id"/>
    
    <!-- 普通字段映射 -->
    <result column="username" property="username"/>
    <result column="password" property="password"/>
    
    <!-- 集合类型映射(一对多关系) -->
    <collection property="exprList" ofType="com.itheima.pojo.EmpExpr">
        <!-- 集合元素的主键映射 -->
        <id column="ee_id" property="id"/>
        <!-- 集合元素的普通字段映射 -->
        <result column="begin" property="begin"/>
        <!-- 可以继续添加其他字段映射 -->
    </collection>
</resultMap>

2. ResultMap映射规则

  • <id>标签:用于映射主键字段,提高识别效率
  • <result>标签:用于映射普通字段
  • <collection>标签:用于映射一对多关系的集合属性
  • ofType属性:指定集合中元素的类型

3. 更新语句动态判断

Mapper更新实现:

<mapper namespace="com.itheima.mapper.EmpMapper">
    <update id="update">
        update emp
        <set>
            <if test="username != null">username = #{username},</if>
            <if test="password != null">password = #{password},</if>
            <!-- 可以继续添加其他字段的条件判断 -->
        </set>
        where id = #{id}
    </update>
</mapper>

4. 动态SQL标签说明

  • <set>标签:自动处理SET语句中的逗号,避免末尾多余逗号
  • <if>标签:条件判断,只有test条件为true时才会包含对应的SQL片段
  • 动态字段更新:只更新非空的字段,提高更新效率

三、全局异常管理器

1. 异常处理机制

SpringBoot全局异常处理的核心是统一处理控制器层抛出的异常,提供一致的错误响应格式。

2. 基础异常处理结构

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result handleException(Exception e) {
        // 统一的异常处理逻辑
        return Result.error("系统异常,请稍后重试");
    }
}

3. 具体异常类型处理

// 处理业务异常
@ExceptionHandler(BusinessException.class)
public Result handleBusinessException(BusinessException e) {
    log.error("业务异常:{}", e.getMessage());
    return Result.error(e.getMessage());
}

// 处理参数校验异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result handleValidationException(MethodArgumentNotValidException e) {
    String errorMessage = e.getBindingResult()
                          .getFieldErrors()
                          .stream()
                          .map(FieldError::getDefaultMessage)
                          .collect(Collectors.joining(", "));
    return Result.error("参数校验失败: " + errorMessage);
}

4. 设置具体提示信息

通过自定义异常类来传递具体的错误信息:

public class BusinessException extends RuntimeException {
    private String code;
    private String message;
    
    public BusinessException(String message) {
        super(message);
        this.message = message;
    }
    
    // getter and setter
}

四、员工信息统计功能

1. 统计功能知识点

  • 使用SQL聚合函数进行数据统计
  • 结果集映射到自定义DTO对象
  • 多维度数据统计展示

2. 职位统计实现

Mapper接口定义:

public interface EmpMapper {
    List<PositionStats> countByPosition();
}

统计DTO对象:

public class PositionStats {
    private String position;    // 职位名称
    private Integer count;      // 该职位人数
    // getter and setter
}

SQL实现:

<select id="countByPosition" resultType="com.itheima.dto.PositionStats">
    select position, count(*) as count 
    from emp 
    where position is not null 
    group by position 
    order by count desc
</select>

3. 性别统计实现

Mapper接口:

List<GenderStats> countByGender();

统计SQL:

<select id="countByGender" resultType="com.itheima.dto.GenderStats">
    select 
        gender,
        count(*) as count,
        round(count(*) * 100.0 / (select count(*) from emp), 2) as percentage
    from emp 
    where gender is not null 
    group by gender
</select>

五、最佳实践和注意事项

1. 批量操作性能优化

  • 使用<foreach>标签时,建议单次批量操作数量控制在1000条以内
  • 大数据量批量删除建议分批次进行

2. 事务管理

@Service
@Transactional
public class EmpService {
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(List<Integer> ids) {
        // 删除操作需要在同一事务中
        empMapper.deleteBatch(ids);
        empExprMapper.deleteBatch(ids);
    }
}

3. 日志记录规范

  • 关键操作必须记录日志
  • 日志内容要包含必要的业务参数
  • 使用SLF4J的占位符方式记录日志

4. 安全考虑

  • 删除操作前进行权限校验
  • 重要数据采用逻辑删除而非物理删除
  • 操作日志要完整记录

本教程详细介绍了SpringBoot后端开发中的核心功能实现,涵盖了数据操作、异常处理、统计功能等关键知识点,为后端开发提供了完整的技术解决方案。

SpringBoot后端进阶实战教程 一、删除员工功能实现 1. 核心知识点 参数接收方式对比: 列表参数接收:需要使用 @RequestParam 注解 数组参数接收:直接对应参数名即可 2. 完整实现代码 Controller层: Service层: Mapper层SQL实现: 删除员工经历表数据: 删除员工主表数据: 3. MyBatis动态SQL标签说明 <foreach> :遍历集合参数 collection="ids" :指定要遍历的集合参数名 item="id" :定义当前遍历元素的变量名 open="(" close=")" :定义循环开始和结束时的字符串 separator="," :定义元素之间的分隔符 二、修改员工功能实现 1. 复杂结果集手动映射 适用场景: 当查询结果类型太复杂,无法通过自动映射完成时,需要手动定义ResultMap。 Mapper查询实现: ResultMap定义详解: 2. ResultMap映射规则 <id> 标签 :用于映射主键字段,提高识别效率 <result> 标签 :用于映射普通字段 <collection> 标签 :用于映射一对多关系的集合属性 ofType 属性 :指定集合中元素的类型 3. 更新语句动态判断 Mapper更新实现: 4. 动态SQL标签说明 <set> 标签 :自动处理SET语句中的逗号,避免末尾多余逗号 <if> 标签 :条件判断,只有test条件为true时才会包含对应的SQL片段 动态字段更新 :只更新非空的字段,提高更新效率 三、全局异常管理器 1. 异常处理机制 SpringBoot全局异常处理的核心是统一处理控制器层抛出的异常,提供一致的错误响应格式。 2. 基础异常处理结构 3. 具体异常类型处理 4. 设置具体提示信息 通过自定义异常类来传递具体的错误信息: 四、员工信息统计功能 1. 统计功能知识点 使用SQL聚合函数进行数据统计 结果集映射到自定义DTO对象 多维度数据统计展示 2. 职位统计实现 Mapper接口定义: 统计DTO对象: SQL实现: 3. 性别统计实现 Mapper接口: 统计SQL: 五、最佳实践和注意事项 1. 批量操作性能优化 使用 <foreach> 标签时,建议单次批量操作数量控制在1000条以内 大数据量批量删除建议分批次进行 2. 事务管理 3. 日志记录规范 关键操作必须记录日志 日志内容要包含必要的业务参数 使用SLF4J的占位符方式记录日志 4. 安全考虑 删除操作前进行权限校验 重要数据采用逻辑删除而非物理删除 操作日志要完整记录 本教程详细介绍了SpringBoot后端开发中的核心功能实现,涵盖了数据操作、异常处理、统计功能等关键知识点,为后端开发提供了完整的技术解决方案。