Bug系列(三):增删改查遇到的错误

这几天写增删改查遇到的一些错误做出的一些总结

1、Bug1

错误代码

js 复制代码
@DeleteMapping
public Result deleteClazzById(@RequestParam("id") Integer id){
    log.info("删除班级id为:{}", id);
    clazzService.deleteClazzById(id);
    return Result.success();

问题分析

  1. URL 格式不匹配
    • 当前代码期望的 URL 格式:/clazzs?id=3(查询参数)
    • RESTful 标准格式应为:/clazzs/3(路径变量)
  1. 注解使用不当
    • @RequestParam适用于 GET 请求的查询参数(如?id=3
    • @PathVariable适用于路径中的动态部分(如/clazzs/{id}
  1. 路径映射不完整
    • 方法没有指定具体路径,仅继承了类级别的@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语句写错了,多谢了双引号

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注解例如:

less 复制代码
void deleteEmp(@Param("ids") List<Integer> ids);

List<String> selectImageByIds(@Param("ids") List<Integer> ids);

6、Bug6

问题分析

  1. SQL 执行结果与期望不匹配
  • 你的 SQL 语句是按 clazz_id 分组,然后通过 having count 筛选(不过这里 having count 写法有点问题,having 子句里一般是对聚合结果的筛选条件,比如 having count > 0 这类,单纯 having count 意义不大,可能达不到你预期筛选效果 )。当执行后,如果没有符合条件的记录,那么查询结果会是空(null),而你的 resultType 期望是 java.lang.Long,MyBatis 无法将空结果正确转换为 Long 类型返回,后续代码中使用这个返回值调用 longValue() 方法时就会因为 countnull 报错。
  1. having 子句使用不当 :如上述所说,having count 这样的写法不符合常规用法,它没有明确的筛选条件判断(比如大于、小于、等于某个值 ),逻辑上不太对,可能导致查询结果异常或者不符合预期。
  2. 通过上述调整 SQL 保证结果合理性,再在业务代码里妥善处理可能的 null 情况,就能避免这类空指针异常报错了。 另外,也可以考虑根据实际需求,确认是否真的需要 group by 分组,比如如果只是想统计指定 clazz_id 下的学生总数,不需要分组的话,简化 SQL 为 select count(*) from student s where s.clazz_id = #{id} 可能更简单直接 。
  3. 错误代码
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打错了

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 时会报错,导致查询执行失败。

  1. 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语法错误建议现在数据库图形化工具上先运行一遍,不报错了再书写上面

相关推荐
Rover.x22 分钟前
Netty基于SpringBoot实现WebSocket
spring boot·后端·websocket
中国胖子风清扬1 小时前
SpringAI和 Langchain4j等 AI 框架之间的差异和开发经验
java·数据库·人工智能·spring boot·spring cloud·ai·langchain
计算机学姐2 小时前
基于php的摄影网站系统
开发语言·vue.js·后端·mysql·php·phpstorm
Java水解2 小时前
【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
spring boot·后端
计算机学姐2 小时前
基于php的旅游景点预约门票管理系统
开发语言·后端·mysql·php·phpstorm
czlczl200209252 小时前
高并发下的 Token 存储策略: Redis 与 MySQL 的一致性
数据库·redis·mysql
哈哈老师啊2 小时前
Springboot校园订餐管理系统k2pr7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
JIngJaneIL2 小时前
基于java+ vue学生选课系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
石明亮(JT)2 小时前
MySQL8.0电商金融交易系统SQL实战
数据库·mysql
残花月伴2 小时前
天机学堂-day4(高并发优化方案)
java·spring boot·后端