这几天写增删改查遇到的一些错误做出的一些总结
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语句写错了,多谢了双引号
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
问题分析
- 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打错了
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语法错误建议现在数据库图形化工具上先运行一遍,不报错了再书写上面