日期字段空导致保存异常

数据库端表结构

可以看到字段 bill_date 是 datetime 日期类型,没有设置为 not null,那么如果前段传递来的对象中该属性为空,应该可以保存。

HTTP请求测试代码

测试代码如下:

@Test

public void test01() throws Exception {

RawMain record = new RawMain();

record.setBill_type("1001");

// record.setBill_date(new Date());

ObjectMapper mapper = new ObjectMapper();

ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();

java.lang.String requestJson = ow.writeValueAsString(record);

System.out.print("即将写入的数据是:" + requestJson);

String result = mockMvc.perform(MockMvcRequestBuilders.post("/rawMain/insert")//发送 get 请求

.contentType(MediaType.APPLICATION_JSON_UTF8).content(requestJson))// 发送的请求中带名称为 username 的参数

.andExpect(MockMvcResultMatchers.status().isOk())// 要求返回200

.andReturn().getResponse().getContentAsString();

System.out.println("插入后返回:" + result);

}

使用 SpringBootTest发送 http 请求测试保存,手动创建即将要保存的对象,只设置了一个属性 bill_type,其他属性都没有设置,并且数据库端对应表中的字段都没有设置必填,照理应该能保存成功,但是执行后报错:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException:

### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

### The error may exist in file [D:\Java\ideaProject\femis\target\classes\mapper\business\RawMainMapper.xml]

### The error may involve com.ccsoft.femis.dao.RawMainMapper.insertSelective-Inline

### The error occurred while setting parameters

### SQL: insert into raw_main

### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

注意上面的 The error occurred while setting parameters 可以看出是传入的参数有问题

反证

就如上面的 java 代码,把设置属性 bill_date 为当前日期的代码行 record.setBill_date(new Date()); 去掉注释再次执行测试,成功写入数据到数据库了。

问题

那么问题来了,明明数据库端没有设置必填,请求参数(表对应的对象)中该属性为空应该能写入,但实际情况是只有设置了日期才能成功写入,这是哪里有问题?

补充

打印出来的发送请求中带的参数对象是:

RawMain(iid=null, seq_month=null, seq_day=null, seq_month_all=null, seq_day_all=null, bill_type=1001, bill_date=null, transport=null, assemble=null, driver=null, phone=null, car_number=null, freight_charge=null, assemble_charge=null, freight_settlement=null, remark=null, create_time=null, is_test=null, code_month=null, code_day=null, code_month_all=null, code_day_all=null, bill_code=null)

可以看到属性 bill_type 有值,其他属性都是NULL

mybatis的相关 xml 文件的代码如下:

SELECT LAST_INSERT_ID()

insert into raw_main

iid,

seq_month,

seq_day,

seq_month_all,

seq_day_all,

bill_date,

transport,

assemble,

driver,

phone,

car_number,

freight_charge,

assemble_charge,

freight_settlement,

remark,

create_time,

#{iid,jdbcType=INTEGER},

#{seq_month,jdbcType=INTEGER},

#{seq_day,jdbcType=INTEGER},

#{seq_month_all,jdbcType=INTEGER},

#{seq_day_all,jdbcType=INTEGER},

#{bill_date,jdbcType=TIMESTAMP},

#{transport,jdbcType=VARCHAR},

#{assemble,jdbcType=VARCHAR},

#{driver,jdbcType=VARCHAR},

#{phone,jdbcType=VARCHAR},

#{car_number,jdbcType=VARCHAR},

#{freight_charge,jdbcType=DECIMAL},

#{assemble_charge,jdbcType=DECIMAL},

#{freight_settlement,jdbcType=VARCHAR},

#{remark,jdbcType=VARCHAR},

#{create_time,jdbcType=TIMESTAMP},

java时间空值_Java SpringBoot Mybatis 日期类型属性空值保存出现异常相关推荐

  1. java 时间判断_java怎样判断日期的先后?

    展开全部 Java判段两个日期的先后,方法如下: import java.util.Date; import java.text.ParseException; import java.text.Si ...

  2. Java时间工具类(把日期时间转换成xx秒前、xx分钟前、xx小时前...)

    Java时间工具类(把日期时间转换成xx秒前.xx分钟前.xx小时前...) package com.liuzy.javaopen.entity; import java.text.ParseExce ...

  3. SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常

    SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常 参考文章: (1)SpringBoot+Mybatis+Druid批量更新 multi ...

  4. java 时间处理_JAVA处理日期时间常用方法

    Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了 ...

  5. java时间方法_JAVA处理日期时间常用方法

    转载JAVA处理日期时间常用方法: 1.java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日 ...

  6. java时间代码_java处理日期时间代码

    public static String FORMATE_DATE_STR = "yyyy-MM-dd"; public static String FORMATE_TIME_ST ...

  7. java时间规范化_Java日期时间使用总结

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中 ...

  8. java 时间类_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

  9. java时间计算器_java后台时间计算

    将毫秒转换成年月日时分秒 public static void main(String[] args) { Date date = new Date(); System.out.println(dat ...

最新文章

  1. 导航控制器自定义返回控件及手势失效问题
  2. 新书上市 | C程序员! 这可能是你搞定指针最轻松的方式
  3. C 语言获取系统时间
  4. DBA(四):数据读写分离,MySQL多实例操作
  5. .Net Core应用框架Util介绍(一)
  6. 查看是否安装显卡驱动,查看可以使用的驱动版本
  7. 配置Https 和 HSTS
  8. Windows自动关机命令脚本
  9. 建材物资管理系统(软件定义)
  10. BGP的基本配置以及路由聚合
  11. 实战教程:平面设计配色原则
  12. Docker三剑客之Docer Swarm
  13. WIN2003 R2安装EPSON6200L打印机问题解决
  14. 计算机视觉转型大数据开发,分享一下我的学习历程和大厂面经
  15. Android rom开发:mtk android9.0 开放预置app权限
  16. Scratch技巧—-使用克隆技术实现菜单按钮
  17. qt+opencv进行七巧板识别应用(三)
  18. 手机酷狗2 java_酷狗叮咚(原手机酷狗) 2.70 For Java 中文官方安装版下载
  19. Do not use built-in or reserved HTML elements as compo
  20. 我想使用Simulink模型模拟期间生成的数据更新我在App Designer中设计的GUI。换句话说,如何从App Designer访问Simulink模型的运行时参数?

热门文章

  1. CC2640R2F_蓝牙5.0_通信协议之控LED
  2. 增强for循环 break continue
  3. 为何有些软件需要安装,而有些则是免安装的?
  4. Learning with Noisy Correspondence for Cross-modal Matching个人笔记
  5. WIKIOI 1001
  6. 【React】--React hook
  7. 物理层和Mac层的区别
  8. Dart 字符串拼接
  9. 【Java课程设计】基于Java Swing+MySQL的学生基本信息管理系统----附git仓库地址
  10. 一般而言,以下不属于操作系统内核功能的是()————操作系统