如何使用JdbcTemplate将此Date字段映射到Spring Boot项目中



我很长一段时间没有使用Spring,而且我发现这个JdbcTemplate行映射器映射日期字段有一些困难。

我试图详细解释我的情况。

在我的数据库(MariaDB(上,我有一个名为TREND002:的表

+-----------------+----------+------+-----+---------+-------+
| Field           | Type     | Null | Key | Default | Extra |
+-----------------+----------+------+-----+---------+-------+
| Time_Stamp      | datetime | NO   | PRI | NULL    |       |
| Time_Stamp_ms   | int(11)  | NO   | PRI | NULL    |       |
| Sensor001DV     | double   | YES  |     | NULL    |       |
| Sensor002DV     | double   | YES  |     | NULL    |       |
| Sensor003DV     | double   | YES  |     | NULL    |       |
..............................................................
..............................................................
..............................................................
| Sensor00NDV     | double   | YES  |     | NULL    |       |

注释1:Time_Stamp字段包含的值为2010-10-22 16:50:12

然后我有这个DTO类映射上一个表的字段:

public class TrendDTO {
    private Date dateTime;
    private int timeStampMs;
    private String sensorValue;
    public TrendDTO() {
        super();
    }
    public TrendDTO(Date dateTime, int timeStampMs, String sensorValue) {
        super();
        this.dateTime = dateTime;
        this.timeStampMs = timeStampMs;
        this.sensorValue = sensorValue;
    }
    public Date getDateTime() {
        return dateTime;
    }
    public void setDateTime(Date dateTime) {
        this.dateTime = dateTime;
    }
    public int getTimeStampMs() {
        return timeStampMs;
    }
    public void setTimeStampMs(int timeStampMs) {
        this.timeStampMs = timeStampMs;
    }
    public String getSensorValue() {
        return sensorValue;
    }
    public void setSensorValue(String sensorValue) {
        this.sensorValue = sensorValue;
    }
    @Override
    public String toString() {
        return "TrendDTO [dateTime=" + dateTime + ", timeStampMs=" + timeStampMs + ", sensorValue=" + sensorValue + "]";
    }
}

基本上,在这个DTO类中,我有:

  • 映射表的datetime字段的日期
  • 映射表的Time_Stamp_ms字段的int字段
  • 映射表中特定SensorXXXDV字段值的String域(我知道从关系数据库的角度来看,这非常糟糕……但我继承了该项目,目前无法更改(

在芬兰,我有一个存储库类,其中有这样的方法:

@Override
public List<TrendDTO> findTrendListBySensorName(String tableName, String columnName) {
    List<TrendDTO> result = null;
    String RETRIEVE_TREND_BY_SENSOR_NAME = "SELECT Time_Stamp, Time_Stamp_ms, Sensor240DV FROM Delphys.TREND003";
    //result = jdbcTemplate.query(RETRIEVE_TREND_BY_SENSOR_NAME, BeanPropertyRowMapper.newInstance(TrendDTO.class));
    result =  jdbcTemplate.query(
            RETRIEVE_TREND_BY_SENSOR_NAME,
            (rs, rowNum) ->
                    new TrendDTO(
                            new java.util.Date(rs.getTimestamp("Time_Stamp").getTime()),
                            rs.getInt("Time_Stamp_ms"),
                            String.valueOf(rs.getDouble(columnName))
                    )
    );
    return result;
}

它运行良好,但通过这种方式,我获得了一个TrendDTO实例列表,其中包含dateTime字段值,如下所示:

日期时间=10月22日星期五16:50:12 PDT 2010

日期完全正确,但我认为这是错误的格式。我必须将这个JSON格式的DTO对象返回到前端,我需要一个格式为的日期

2010-10-22 16:50:12

我还尝试使用以下代码更改我的映射程序代码:

result =  jdbcTemplate.query(
                RETRIEVE_TREND_BY_SENSOR_NAME,
                (rs, rowNum) ->
                        new TrendDTO(
                                //new java.util.Date(rs.getTimestamp("Time_Stamp").getTime()),
                                rs.getTimestamp("Time_Stamp"),
                                rs.getInt("Time_Stamp_ms"),
                                String.valueOf(rs.getDouble(columnName))
                        )
        );

正如你所看到的,我只是简单地使用rs.getTimestamp("Time_Stamp"(,但通过这种方式,我获得了日期时间初始化,如下所示:2010-10-22 16:50:120

正如您所看到的,它以.0结束,它应该代表我不想要的毫秒。我可以指定格式来避免也放这个结束毫秒部分吗?

解决我的问题的另一种可能方法(也许是最好的解决方案(是:在这个非常可怕的数据库表中,毫秒信息包含在Time_Stamp_ms列中,该列目前与我的timeStampMsDTO字段映射。

我可以修改以前的代码,将这些信息直接封装到DTO对象的dateTime字段中吗?

我绝对不确定用这种语法(它是lambda表达式吗?(这是可能的。我可以使用这种语法吗?或者让我实现一个行映射器类来实现这种行为?

我会这样做:

  1. 不再使用旧的"Date"API,而是使用较新的(Java8+(LocalDateTime。假设你有一个相对较新的JDBC驱动程序,你可以这样做来获得LocalDateTime,它可以省去你将时间戳转换为日期的几笔操作。

    LocalDateTime yourLocalDateTime = rs.getObject("Time_Stamp", LocalDateTime.class) ;

  2. 您可以任意设置LocalDateTime的格式。要手动执行此操作,您需要使用DateTimeFormatter

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatDateTime = yourLocalDateTime.format(formatter);

  3. 不过,如果您在Spring Boot项目中并序列化为JSON,那么您所需要做的就是使用@JsonFormat注释来注释DTO:

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime myLocalDateTime;

最新更新