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后端开发中的核心功能实现,涵盖了数据操作、异常处理、统计功能等关键知识点,为后端开发提供了完整的技术解决方案。