在做项目的时候,本地服务器能正常使用,部署在服务器上最后显示:异常报告HTTP500消息 PreparedStatementCallback ; SQL [ insert into t _ leave ( student _ id , grade _ id , start _ time , end _ time , info , status , remark ) values (?,?,?,?,?,?,?);]; Data truncation : Incorrect date value:"xAC \ xED \x00\x05sr\x00\x0Djava. time .Serx95]\x84\ xBA\x1B"HxB2\x0C\x00\x00xpw\x07\x03\x00\x00\x07\xE7x05\x0Ax' for column ' start _ time ' at row 1;
问题分析
- 数据类型错误
- JDBC驱动版本过低
- 数据库在存储数据的时候转换错误
问题解决
针对第一种错误:在数据库中用了data型,实例化用了String或者其它。解决办法:检查数据库类型和实例化类型
第二种错误:实例化类型用LocalDate,但JDBC驱动版本低于4.2,解决办法更换更高版本的jdbc.jar
查看JDBC版本:项目文件夹下找到WEB-INF下的lib文件夹,找到mysql-connector-java-xx.jar
点击向右的尖括号展开,在META-INF打开MANIFEST.MF
若版本不是4.2及其以上,则更换更高版本的JDBC,官方网址:http://dev.mysql.com/downloads/connector/
针对第三种问题:(本次项目中实际问题 本人耗时两小时解决)
先说具体原因:MySQL对数据存储有着相当高的严格
探索过程:在这个功能模块上加了日志,对输出每一次的结果进行分析,结果还是不行,最后灵光一闪,我之间把sql语句拿到SQLyog上执行,最终皇天不负有心人 让我在不起眼的查询输出信息的地方找到了bug的“万恶之源”-----MySQL error1292- Incorrect datetime value;瞬间恍然大悟、茅塞顿开、原来如此。我在功能模块调用了jQuery UI的日历选择器,默认类型为yyyy-mm-dd,然而在MySQL中他会默认为减法运算。此时此刻犹如拨开云雾见青天,迫不及待地打开MySQL技术文档,找到了错误所在之处。映射在脑海里的就有两种解决方法,一种就是更换本地实例化数据类型,从LocalDate换成Date型
最后在后端中修改传递类型
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
Date startDate = dateFormat.parse(request.getParameter("startTime"));
Date endTime = dateFormat.parse(request.getParameter("endTime"));
a.setStartTime(startDate);
a.setEndTime(endTime);
}catch (Exception e){
}
PS:Date类型默认为yyyy-mm-dd-HH-MM-SS,如果需要显示yyyy-mm-dd只需要更改传递的参数就可以
到此,困扰我两个半小时的bug终于得到解决。细节决定成败
借用张宇老师的一句话(改编版):一包烟 一杯酒 一个bug改一天
第二个方法就是改变传递的参数就可以啦,如果小伙伴们有更好的方法,欢迎在评论区不吝赐教
参考文献https://blog.csdn.net/qq_43008315/article/details/106602164