适合 CRUD 业务开发,包含回显修改、动态 SQL、全局异常处理
一、前言实际开发中修改业务必须先查询回显原有数据再做更新操作本篇结合三层架构Controller‑Service‑Mapper讲解 MyBatis 结果映射、动态 SQL、全局异常处理器、统计图表业务完整开发流程。二、修改前数据查询回显1、三层调用流程浏览器请求 → Controller 接收参数 → Service 调用业务逻辑 → Mapper 执行多表查询查询数据返回前端页面做回显。2、SpringMVC 三种参数接收注解注解作用使用场景RequestParam接收 url 问号后参数xxx?id1RequestBody接收 post 的 json 对象前端传递 json 大对象PathVariable接收路径变量xxx/{id}路径占位符GetMapping(/{id}) public Result getInfo(PathVariable Integer id){ //业务查询逻辑 }3、MyBatisresultType和resultMapresultType数据库字段名 和 实体类属性名完全对应直接自动封装。resultMap字段与属性不匹配、多表联查、嵌套复杂实体手动配置映射关系。多表联查场景使用 resultMap 手动配置解决字段封装问题。select idgetById resultTypexxx.pojo.Emp select e.*,ee.* from emp e left join emp_expr ee on e.idee.emp_id where e.id#{id} /select三、修改业务开发业务逻辑根据 id 查询原有数据回显页面提交修改表单更新员工基础信息删除旧的员工经历数据批量插入新经历数据//service层伪代码 Override public void update(Emp emp) { //1 更新员工基础信息 empMapper.update(emp); //2 删除旧的工作经历 empExprMapper.deleteByEmpId(emp.getId()); //3 判断集合非空批量新增工作经历 if(CollectionUtils.isNotEmpty(emp.getEmpExprList())){ empExprMapper.insertBatch(emp.getEmpExprList()); } }MyBatis 动态 SQL set标签set标签用于 update 语句自动去掉多余逗号实现按需字段更新。update idupdate update emp set if testusername ! nullusername#{username},/if if testgender ! nullgender#{gender},/if if testupdateTime ! nullupdate_time#{updateTime}/if /set where id #{id} /update⚠️开发要点使用CollectionUtils.isNotEmpty()判断集合非空防止空集合执行 SQL 报错。四、全局异常处理器问题原始开发中每层代码写大量try‑catch代码臃肿重复度高。解决方案RestControllerAdvice全局异常处理器统一捕获整个项目抛出的异常统一返回 Result 结果不用每个 controller 写 try‑catch。核心注解RestControllerAdvice作用所有 controllerExceptionHandler指定捕获哪一类异常RestControllerAdvice public class GlobalExceptionHandler { //捕获通用异常 ExceptionHandler(Exception.class) public Result handleException(Exception e){ e.printStackTrace(); return Result.error(出错请联系管理员); } //捕获数据库主键重复异常细分异常提示 ExceptionHandler(DuplicateKeyException.class) public Result handleDuplicateKeyException(DuplicateKeyException e){ return Result.error(数据已存在); } }可以写多个ExceptionHandler细分不同异常类型给前端精准提示1、case when 条件统计 SQL用于数据库层面做分类统计例如统计各个职位人数。select case job when 1 then 班主任 when 2 then 讲师 else 其他 end pos, count(*) num from emp group by job;2、返回 ListMapString,Object统计结果没有对应实体类直接返回ListMapString,Objectmybatis 直接把每行记录封装为 mapkey 为列名value 为值。Mapper 接口ListMapString,Object getJobCount();3、Service 数据组装查询得到 ListMap再转换为前端 ECharts 需要的labels[]、values[]格式。Override public ReportVo getJobData() { ListMapString, Object list empMapper.getJobCount(); ListString jobList new ArrayList(); ListInteger numList new ArrayList(); for (MapString, Object map : list) { jobList.add(map.get(pos).toString()); numList.add((Integer) map.get(num)); } return new ReportVo(jobList,numList); }性别统计逻辑和职位统计完全一致返回数据给前端渲染饼图。六、知识点总结修改业务流程先查询回显 → 提交修改 → 更新主表、处理子表数据。参数接收PathVariable路径变量RequestBody接收 jsonRequestParam接收 url 参数。MyBatisresultType字段属性匹配直接封装resultMap用于字段不匹配 / 多表联查。set动态标签用于 update自动去除末尾逗号。集合判空优先使用CollectionUtils.isNotEmpty()避免空集合操作报错。全局异常RestControllerAdvice ExceptionHandler统一捕获异常区分不同异常返回不同提示。统计业务SQLcase when做分类统计返回ListMapString,Object处理无实体的查询结果组装 ECharts 图表数据

相关新闻

最新新闻

日新闻

周新闻

月新闻