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

相关推荐
诺亚凹凸曼2 小时前
浅谈mysql的undolog
数据库·mysql
m0_694845572 小时前
云服务器如何管理数据库(MySQL/MongoDB)?
服务器·数据库·mysql
wackpa2 小时前
说下对mysql MVCC的理解
数据库·mysql
技术吧3 小时前
MySQL功能模块探秘:数据库世界的奇妙之旅
数据库·mysql
℡余晖^3 小时前
Mysql默认存储引擎InnoDB和底层数据结构
数据库·mysql
开挖掘机上班4 小时前
基于Alpine构建MySQL镜像
mysql·docker·容器
叁沐6 小时前
MySQL 15 日志相关问题追问
mysql
军军君016 小时前
基于Springboot+UniApp+Ai实现模拟面试小工具三:后端项目基础框架搭建上
前端·vue.js·spring boot·面试·elementui·微信小程序·uni-app
黑白极客6 小时前
自增主键为什么不是连续的?
mysql·db·引擎
icecreamstorm7 小时前
JDBC数据库连接池
java·mysql