前景摘要:整合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整合中的传参还不够了解!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐