Как правильно обработать это отображение поля Date с помощью JdbcTemplate в проекте Spring Boot? - PullRequest
0 голосов
/ 06 марта 2020

я довольно долго не использую 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 содержит значение as 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 Дата , отображающая поле datetime поля моей таблицы.
  • An int поле, отображающее поле Time_Stamp_ms моей таблицы.
  • A String поле, отображающее значение указанного c SensorXXXDV поля таблицы (я знаю, что из с точки зрения реляционной базы данных это ужасно ужасно ... но я унаследовал проект и в настоящий момент не могу измениться.)

Финн У меня есть класс репозиторий , в котором есть этот метод:

@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 значения полей, подобные этому:

dateTime = пт 22 октября 16:50:12 PDT 2010

Дата совершенно правильная, но я думаю, что это неправильный формат. Я должен вернуть этот объект DTO в формате JSON во внешний интерфейс, и мне нужна дата в формате:

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.

Могу ли я изменить свой предыдущий код, чтобы инкапсулировать эту информацию непосредственно в поле dateTime моего объекта DTO?

Я абсолютно не уверен, что с этим синтаксисом (так ли это лямбда-выражение?) это возможно. Могу ли я сделать это, используя этот синтаксис, или я должен реализовать класс отображения строк для реализации этого поведения?

1 Ответ

0 голосов
/ 06 марта 2020

Я бы сделал это:

  1. Больше не используйте старый API «Дата», используйте более новый (Java8 +) LocalDateTime вместо . Предполагая, что у вас относительно новый драйвер JDB C, вы можете сделать это, чтобы получить 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, все, что вам нужно сделать, это комментировать ваш DTO с помощью @ JsonFormat :

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

...