You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JdbcTemplate格式化返回java.util.Date类型日期

问题:MySQL日期查询与格式化异常

MySQL表中release_date字段存储格式为2023-01-30,希望检索数据时将该日期格式化为dd/MM/yyyy(即返回30/01/2023),但当前代码因日期格式不匹配无法正常工作。

表结构

idnamerelease_date
1The Godfather2023-01-30
2The Good The Bad The Ugly2023-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:34