java 日期为空值
学习Java SE或Java EE可为软件开发工程师做准备 #生活技巧# #工作学习技巧# #技能培训认证#
日期字段空导致保存异常
数据库端表结构
可以看到字段 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 日期为空值 https://www.yuejiaxmz.com/news/view/504061
相关内容
java 日期函数(笔记)java基础学习十四之BigDecimal类与常用日期时间类
基于Java的日程安排系统
A =Java基础与源码
JAVA题目
java中给集合赋值的方法
Java
java软件工程师
复杂的xml转化为java实体
基于ssm+vueapp日程管理系统(开题报告+程序+论文+java)