这几天写增删改查遇到的一些错误做出的一些总结
1、Bug1
错误代码
            
            
              js
              
              
            
          
          @DeleteMapping
public Result deleteClazzById(@RequestParam("id") Integer id){
    log.info("删除班级id为:{}", id);
    clazzService.deleteClazzById(id);
    return Result.success();问题分析
- URL 格式不匹配:
- 
- 当前代码期望的 URL 格式:/clazzs?id=3(查询参数)
- RESTful 标准格式应为:/clazzs/3(路径变量)
 
- 当前代码期望的 URL 格式:
- 注解使用不当:
- 
- @RequestParam适用于 GET 请求的查询参数(如- ?id=3)
- @PathVariable适用于路径中的动态部分(如- /clazzs/{id})
 
- 路径映射不完整:
- 
- 方法没有指定具体路径,仅继承了类级别的@RequestMapping("/clazzs")
- 客户端需要访问/clazzs而不是/clazzs/3才能匹配到该方法 这个错误主要是需求没看清,会报Required request parameter 'id' for method parameter type Integer is not present]的错误 需求是根据路径传参,需要使用@PathVariable注解,当根据键值对传参也就是key=name传参才能使用@RequestParam("id")注解
 
- 方法没有指定具体路径,仅继承了类级别的
            
            
              正确代码
              
              
            
          
          @DeleteMapping("/{id}") // 明确路径变量
public Result deleteClazzById(@PathVariable("id") Integer id){
    log.info("删除班级id为:{}", id);
    clazzService.deleteClazzById(id);
    return Result.success();
}2、Bug2

 
  该错误是因为没写地址映射
 该错误是因为没写地址映射
3、Bug3
 错误原因是因为底下这个sql语句写错了,多谢了双引号
 错误原因是因为底下这个sql语句写错了,多谢了双引号 
4、Bug4

            
            
              perl
              
              
            
          
          <delete id="deleteEmp">
    delete from emp where id in
    <foreach collection="ids" item="id" separator="," close=")" open="(">
        #{id}
    </foreach>
</delete>在使用foreach标签时,close属性和open属性的值括号错误
5、Bug5
 同样时批量删除的问题,批量删除需要使用数组或者集合来接收所要删除的id,当在mapper类中的参数需要加@Param注解,当多个参数时也要加@Param注解例如:
 同样时批量删除的问题,批量删除需要使用数组或者集合来接收所要删除的id,当在mapper类中的参数需要加@Param注解,当多个参数时也要加@Param注解例如:
            
            
              less
              
              
            
          
          void deleteEmp(@Param("ids") List<Integer> ids);
List<String> selectImageByIds(@Param("ids") List<Integer> ids);6、Bug6
 问题分析
 问题分析
- SQL 执行结果与期望不匹配:
- 你的 SQL 语句是按 clazz_id分组,然后通过having count筛选(不过这里having count写法有点问题,having子句里一般是对聚合结果的筛选条件,比如having count > 0这类,单纯having count意义不大,可能达不到你预期筛选效果 )。当执行后,如果没有符合条件的记录,那么查询结果会是空(null),而你的resultType期望是java.lang.Long,MyBatis 无法将空结果正确转换为Long类型返回,后续代码中使用这个返回值调用longValue()方法时就会因为count为null报错。
- having子句使用不当 :如上述所说,- having count这样的写法不符合常规用法,它没有明确的筛选条件判断(比如大于、小于、等于某个值 ),逻辑上不太对,可能导致查询结果异常或者不符合预期。
- 通过上述调整 SQL 保证结果合理性,再在业务代码里妥善处理可能的 null情况,就能避免这类空指针异常报错了。 另外,也可以考虑根据实际需求,确认是否真的需要group by分组,比如如果只是想统计指定clazz_id下的学生总数,不需要分组的话,简化 SQL 为select count(*) from student s where s.clazz_id = #{id}可能更简单直接 。
- 错误代码
            
            
              sql
              
              
            
          
          <select id="countStudent" resultType="java.lang.Long"> select count(*) count from student s where s.clazz_id = #{id} group by s.clazz_id having count </select>这是分组语句使用错误,having后面应该跟过滤条件,单纯的count不加条件反而会错误,因为在查找过程中如果没有该id会返回null与我们所想要返回的long有区别,加过滤条件或者不加都不会报错
7、Bug7
 错误原因:因为数据库sql语句书写错误 test="name != null and name != ''"中的and没写且name打错了
 错误原因:因为数据库sql语句书写错误 test="name != null and name != ''"中的and没写且name打错了
            
            
              bash
              
              
            
          
          <select id="queryStudentByCondition" resultType="com.itheima.boottlias.domain.pojo.Student">
    select s.* , c.name clazz_name from student s left join clazz c on s.clazz_id = c.id
    <where>
        <if test="name != null and name != ''">
            s.name like concat('%', #{name}, '%')
        </if>
        <if test="degree != null">
            s.degree = #{degree}
        </if>
        <if test="clazzId != null">
            s.clazz_id = #{clazzId}
        </if>
    </where>
</select>1. 动态 SQL <if> 条件语法错误
问题 :
<if test="name != null name != ''"> 里的条件写法错误,test 表达式中多个条件要用 and/or 连接,正确写法是:
xml
            
            
              ini
              
              
            
          
          <if test="name != null and name != ''">如果不修正,MyBatis 解析动态 SQL 时会报错,导致查询执行失败。
- SQL 拼接可能的语法问题
问题 :
当 <if> 条件满足时,and 关键字可能导致 SQL 语法错误。比如:
- 若 name条件满足,但degree条件不满足,生成的 SQL 可能变成WHERE s.name like ... and s.clazz_id = ...(中间少条件时and多余)。
解决 :
MyBatis 的 <where> 标签会自动处理开头的 AND/OR,但不要在 <if>  里手动加 and,而是让条件自然拼接
8、Bug8
 
  同样是数据库语法错误
 同样是数据库语法错误
8、Bug8
            
            
              less
              
              
            
          
          @PostMapping("/findPage")
public PageBean queryCheckItem(@RequestBody PageQueryDTO pageQueryDTO) {
    PageBean<CheckItem> pageBean = checkItemService.queryCheckItem(pageQueryDTO);
    return pageBean;
}注意接收对象需要使用@RequestBody
总结
这些错误主要是因为注解使用不规范和sql语句语法错误,接下来要多了解注解的具体用法,以后不能用错,对于sql语法错误建议现在数据库图形化工具上先运行一遍,不报错了再书写上面