我很长一段时间没有使用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表达式吗?(这是可能的。我可以使用这种语法吗?或者让我实现一个行映射器类来实现这种行为?
我会这样做:
-
不再使用旧的"Date"API,而是使用较新的(Java8+(LocalDateTime。假设你有一个相对较新的JDBC驱动程序,你可以这样做来获得LocalDateTime,它可以省去你将时间戳转换为日期的几笔操作。
LocalDateTime yourLocalDateTime = rs.getObject("Time_Stamp", LocalDateTime.class) ;
-
您可以任意设置LocalDateTime的格式。要手动执行此操作,您需要使用DateTimeFormatter。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formatDateTime = yourLocalDateTime.format(formatter);
-
不过,如果您在Spring Boot项目中并序列化为JSON,那么您所需要做的就是使用@JsonFormat注释来注释DTO:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime myLocalDateTime;