前景摘要:整合SSM练习Insert语句时,想通过前端页面的表单将数据通过后端的处理存储到数据库,但是一直报Column ‘列名‘ cannot be null(某个列名不能为空)的错误,急着知道的直接看最后,中间都是牢骚。
查询功能能够正常运行,但就是插入用户功能报错,如下图
代码逻辑没有问题
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,依旧无效
插一嘴:难受的是在升级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语句中传入的参数匹配!否接接收不到数据!(两张图中红线框起来的属性需要匹配!)
问题解决:成功保存数据。
总结:太粗心,碰到的bug太少,对ssm整合中的传参还不够了解!