Column ‘XXX‘ cannot be null问题 后端接收不到前端表单提交的数据

在SSM(Spring、SpringMVC、MyBatis)整合项目中,遇到插入数据时出现Column‘列名’cannotbenull的错误。经过一系列尝试,包括检查MySQL配置、升级数据库版本、调整依赖版本等,最终发现是表单属性与Insert语句参数未匹配导致的问题。修复这个问题后,成功实现了数据的插入。该经历提醒开发者在遇到问题时要细心检查,并谨慎处理依赖和环境版本。

前景摘要:整合SSM练习Insert语句时,想通过前端页面的表单将数据通过后端的处理存储到数据库,但是一直报Column ‘列名‘ cannot be null(某个列名不能为空)的错误,急着知道的直接看最后,中间都是牢骚。
image-20220315083600676
查询功能能够正常运行,但就是插入用户功能报错,如下图
img
代码逻辑没有问题

Controller层保存用户方法代码

@RequestMapping("/save")
    public void save(User user, HttpServletRequest request, HttpServletResponse response) throws IOException{
        userService.addUser(user);
        response.sendRedirect(request.getContextPath()+"/user/findAll");
        return;
    }

Dao层保存用户方法代码

    //增加用户
    @Insert("insert into t_user (username,password,age) values (#{username},#{password},#{age})")
    void addUser(User user);

期间面向百度改bug走了如下弯路:

1、怀疑是本地mysql问题,修改了本地配置my.int,无效。

2、在某个成功解决类似问题的老哥帖子中,看到此图(web项目各环境所需版本支持),继而怀疑是mysql与pom.xml中的mysql-connect-java、C3P0、JDBC等依赖有问题,重装了mysql版本,由5.5强行升级到5.7,依旧无效
image-20220315085007086

插一嘴:难受的是在升级mysql后,原本有用的查询功能也跑不动了!后在奋战数小时后终于实验找到了能够恢复查询功能的依赖版本,所以能运行没事不要随便动依赖和环境的版本!

mysql-connector-java: 8.0.16 (可以是最新)
c3p0: 0.9.5.2 (MySql8.0的驱动必须用0.9.5.2以上的c3p0版本)
mchange-commons-java: 0.2.11 (0.9.5.2以上的c3p0版本必须有mchange)
jdbc连接配置: driver 可以是"com.mysql.jdbc.Driver",也可以是"com.mysql.cj.jdbc.Driver"

于是一切又回到了原点,查询功能能用,但是依旧报Column ‘列名’ cannot be null的错误。

3、数据库表字段设置非空问题?在设置了允许为空后,测试发现还是不对。

解决方案:静下心后不再迷恋百度,思考是映射路径的问题,先前虽然仔细检查了@RequestMapping、form action关联的路径,但是遗漏了表单属性需要与Insert语句中传入的参数匹配!否接接收不到数据!(两张图中红线框起来的属性需要匹配!)

image-20220315091118132
image-20220315091151912

问题解决:成功保存数据。

总结:太粗心,碰到的bug太少,对ssm整合中的传参还不够了解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值