如何使用JdbcTemplate正确处理此Date字段映射到Spring Boot项目中?

问题描述 投票:0回答:1

很长一段时间以来,我没有使用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    |       |

NOTE-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课程中:

    A
  • Date字段映射到我表的datetime字段。映射到表的Time_Stamp_ms字段的
  • int
  • 字段。A
  • String
  • 字段映射表的特定SensorXXXDV字段的值(我知道从关系数据库的角度来看这很丑陋……但是我继承了该项目,并且当我无法改变的时候。
    最后我有一个

    repository

类,其中有此方法:@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; }
它工作正常,但通过这种方式,我获得了包含以下[[dateTime
字段值的

TrendDTO

实例的列表:dateTime =星期五2010年10月22日星期五16:50:12

日期是完全正确的,但我认为这是错误的格式。我必须将此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”)
,但通过这种方式,我正在获得

dateTime

的初始化,如下所示:2010-10-22 16:50 :12.0
如您所见,它以。0结尾,它应该代表我不需要的毫秒数。我可以指定格式来避免在结尾毫秒部分也放吗?

解决我的问题的另一种可能的方法(也许是最好的解决方案)是:在这个非常恐怖的数据库表中,毫秒信息包含在Time_Stamp_ms

列中,此列目前与我的

timeStampMs]映射> DTO字段。

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

我绝对不确定使用这种语法(它是lambda表达式吗?)。我可以使用这种语法吗?还是可以实现行映射器类来实现此行为?

很长一段时间以来,我没有使用Spring,并且使用此JdbcTemplate行映射器映射日期字段时发现了一些困难。我试图详细解释我的情况。在我的数据库上(...
java spring-boot jdbctemplate rowmapper
1个回答
0
投票

    不再使用旧的“ Date” API,请使用较新的(Java8 +)
  1. LocalDateTime代替
© www.soinside.com 2019 - 2024. All rights reserved.