2023年6月21日发(作者:)

字符串存⼊数据库date类型字段有时候为了计算⽅便等原因需要将时间以date格式存⼊数据库,但是前台传过来的数据类型都是字符串,如果将字符串直接插⼊date类型的字段中会抛:ORA-01861: ⽂字与格式字符串不匹配。前台页⾯有⼀个表单,如下所⽰:

提交表单时传到后台只是选定⽇期对应的字符串表⽰形式:

如选定:

由浏览提地址栏可知传到后台只是字符串的”2017-07-25”,localhost:8080/....../?date=2017-07-25这样直接保存到数据库中就会抛如下异常:tegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO DEMO (DATATEST) VALUES (?)]; ORA-; nested exception is aException: ORA-01861: ⽂字与格式字符串不匹配数据库结构如下:

解决办法:1、使⽤注解:@DateTimeFormat@JsonFormat在实体类代表⽇期字段的get⽅法上添加注解:import rmat;import meFormat;import ;public class DateModel { private Date date; @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") public Date getDate() { return date; } public void setDate(Date date) { = date; } @Override public String toString() { return "DateModel{" + "date='" + date + ''' + '}'; }}dao层:(此处使⽤jdbctemplate)import del;import red;import mplate;import opertySqlParameterSource;import arameterJdbcTemplate;import ameterSource;import tory;@Repositorypublic class DateDao { @Autowired private JdbcTemplate jdbcTemplate; public void saveDate(DateModel dateModel) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (:date)"; NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(dateModel); (sql, sqlParameterSource); }}2、使⽤Java将代表⽇期的字符串转换为再插⼊数据库使⽤SimpleDateFormat:@RequestMapping("/save")public void saveDate(String dateStr) throws ParseException { Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); te(date);}也可使⽤ar,只不过⿇烦些。dao层:public void saveDate(Date date) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (?)"; (sql, date);}3、使⽤数据库函数TO_CHAR()函数dao层:public void saveDate(String date) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (TO_DATE(?, 'yyyy-MM-dd'))"; (sql, date);}测试结果:

2023年6月21日发(作者:)

字符串存⼊数据库date类型字段有时候为了计算⽅便等原因需要将时间以date格式存⼊数据库,但是前台传过来的数据类型都是字符串,如果将字符串直接插⼊date类型的字段中会抛:ORA-01861: ⽂字与格式字符串不匹配。前台页⾯有⼀个表单,如下所⽰:

提交表单时传到后台只是选定⽇期对应的字符串表⽰形式:

如选定:

由浏览提地址栏可知传到后台只是字符串的”2017-07-25”,localhost:8080/....../?date=2017-07-25这样直接保存到数据库中就会抛如下异常:tegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO DEMO (DATATEST) VALUES (?)]; ORA-; nested exception is aException: ORA-01861: ⽂字与格式字符串不匹配数据库结构如下:

解决办法:1、使⽤注解:@DateTimeFormat@JsonFormat在实体类代表⽇期字段的get⽅法上添加注解:import rmat;import meFormat;import ;public class DateModel { private Date date; @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") public Date getDate() { return date; } public void setDate(Date date) { = date; } @Override public String toString() { return "DateModel{" + "date='" + date + ''' + '}'; }}dao层:(此处使⽤jdbctemplate)import del;import red;import mplate;import opertySqlParameterSource;import arameterJdbcTemplate;import ameterSource;import tory;@Repositorypublic class DateDao { @Autowired private JdbcTemplate jdbcTemplate; public void saveDate(DateModel dateModel) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (:date)"; NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(dateModel); (sql, sqlParameterSource); }}2、使⽤Java将代表⽇期的字符串转换为再插⼊数据库使⽤SimpleDateFormat:@RequestMapping("/save")public void saveDate(String dateStr) throws ParseException { Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr); te(date);}也可使⽤ar,只不过⿇烦些。dao层:public void saveDate(Date date) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (?)"; (sql, date);}3、使⽤数据库函数TO_CHAR()函数dao层:public void saveDate(String date) { String sql = "INSERT INTO DEMO (DATATEST) VALUES (TO_DATE(?, 'yyyy-MM-dd'))"; (sql, date);}测试结果: