如何通过JdbcTemplate格式化返回java.util.Date类型日期
问题:MySQL日期查询与格式化异常
MySQL表中release_date字段存储格式为2023-01-30,希望检索数据时将该日期格式化为dd/MM/yyyy(即返回30/01/2023),但当前代码因日期格式不匹配无法正常工作。
表结构
| id | name | release_date |
|---|---|---|
| 1 | The Godfather | 2023-01-30 |
| 2 | The Good The Bad The Ugly | 2023-01-30 |
实体类
public record Movie(Integer id, String name, List<Actor> actors, Date releaseDate) { }
查询方法
public static final String DEFAULT_DATE_PATTERN = "dd/MM/yyyy"; public List<Movie> selectMovieByDate() throws ParseException { String QUERY_GET_CONFIRM_JOURNEE = "select id, name, release_date from movie where date_format(release_date, '%Y/%M/%d') = date_format(?, '%Y/%M/%d')"; String stringDate = "2023-01-30"; Date date1=new SimpleDateFormat("yyyy-MM-dd").parse(stringDate); String dateJournee = this.dateToString(date1, DEFAULT_DATE_PATTERN); List<Movie> movies = this.getMovieDetail(QUERY_GET_CONFIRM_JOURNEE, jdbcTemplate, new Object[] {dateJournee}); // TODO Auto-generated method stub return movies; }
RowMapper方法
private List<Movie> getMovieDetail(String sql, JdbcTemplate jdbcTemplate, Object[] params) { @SuppressWarnings({ "unchecked", "rawtypes", "deprecation" }) List<Movie> listDto = jdbcTemplate.query(sql, params, new RowMapper() { @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Movie detailPaiementDto = new Movie(rs.getInt("id"), rs.getString("name"),List.of(), rs.getDate("release_date")); return detailPaiementDto; } }); return listDto; }
问题分析与解决方案
1. 修正SQL查询的日期格式错误
你的SQL中使用了%M作为月份格式,这代表月份的英文全称(如January),而非数字月份%m,这会导致日期匹配失败。同时无需将参数转为字符串后传入,直接传递java.util.Date对象即可,JdbcTemplate会自动处理日期类型匹配:
-- 优化后的SQL select id, name, release_date from movie where release_date = ?
2. 实现日期格式化返回
如果需要返回dd/MM/yyyy格式的日期,有两种可行方式:
方式一:SQL层直接格式化
修改SQL语句,通过date_format函数直接返回格式化后的日期字符串:select id, name, date_format(release_date, '%d/%m/%Y') as release_date from movie where release_date = ?此时需将实体类中的
releaseDate字段类型改为String,或在RowMapper中读取字符串后处理。方式二:Java代码层格式化
保持实体类Date类型不变,在RowMapper中或查询后统一格式化:// RowMapper中修改日期格式化逻辑 @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Date releaseDate = rs.getDate("release_date"); // 如需在实体类中存格式化后的字符串,需修改Movie构造参数 String formattedDate = new SimpleDateFormat(DEFAULT_DATE_PATTERN).format(releaseDate); Movie detailPaiementDto = new Movie(rs.getInt("id"), rs.getString("name"), List.of(), releaseDate); return detailPaiementDto; }
3. 优化后的查询方法示例
public static final String DEFAULT_DATE_PATTERN = "dd/MM/yyyy"; public List<Movie> selectMovieByDate() throws ParseException { String QUERY_GET_CONFIRM_JOURNEE = "select id, name, release_date from movie where release_date = ?"; String stringDate = "2023-01-30"; Date date1 = new SimpleDateFormat("yyyy-MM-dd").parse(stringDate); List<Movie> movies = this.getMovieDetail(QUERY_GET_CONFIRM_JOURNEE, jdbcTemplate, new Object[] {date1}); // 遍历格式化日期(若需对外返回字符串格式) for (Movie movie : movies) { String formattedDate = new SimpleDateFormat(DEFAULT_DATE_PATTERN).format(movie.releaseDate()); // 后续业务处理逻辑 } return movies; }
内容的提问来源于stack exchange,提问作者BAKHALED Ibrahim
相关产品推荐
相关产品推荐

