当前位置: 首页 > 知识库问答 >
问题:

如何使用JdbcTemplate将这个日期字段映射到Spring Boot项目中?

裴英才
2023-03-14

我很长一段时间没有使用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课上我有:

  • 一个Date字段,映射我表的datetime字段。
  • 映射表Time_Stamp_ms字段的int字段。
  • 一个字符串字段,映射表的特定传感器XXXDV字段的值(我知道从关系数据库的角度来看,这太丑了……但我继承了这个项目,目前我无法更改)。

最后,我有一个存储库类,其中有这个方法:

@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字段值的StredDTO实例列表,如下所示:

dateTime=2010年10月22日星期五16:50:12 PDT

日期完全正确,但我认为这是错误的格式。我必须将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.get时间戳(Time_Stamp),但这样做,我获得了一个dateTime iniziation,如下所示:2010-10-22 16:50:12.0

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

解决我的问题的另一种可能的方法(也许是最好的解决方案)是:在这个相当糟糕的数据库表中,毫秒信息包含在Time_Stamp_ms列中,目前,该列与我的时间戳DTO字段映射。

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

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

共有1个答案

夹谷志
2023-03-14

我会这样做:

>

  • 不要再使用旧的“Date”API,而是使用较新的(Java8)LocalDateTime。假设您有一个相对较新的 JDBC 驱动程序,您可以执行此操作来获取 LocalDateTime,它可以节省您尝试将时间戳转换为日期的几次笔划。

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

    您可以根据需要以任何方式设置该本地日期时间的格式。要手动执行此操作,请使用日期时间格式化程序。

    DateTimeFormatter-formatter=日期时间格式器。模式(“yyyy-MM-dd HH:MM:ss”);字符串formatDateTime=yourLocalDateTime.format(格式化程序)

    但是,如果您在一个Spring Boot项目中并序列化为JSON,您需要做的就是用@JsonFormat注释来注释您的d to:

    < code > @ JSON format(shape = JSON format。Shape.STRING,pattern = " yyyy-MM-DD HH:MM:ss ")private local datetime myLocalDateTime;

  •  类似资料:
    • 我把这三门课分别放在不同的文件中 我有下面的映射器 这目前仅映射lastName并起作用,我想将Book中的作者字符串映射为 我怎么能这么做?我在MapStruct文档中找不到任何东西。

    • “想要解决方案B” 有什么办法可以做到这一点吗?

    • 我有4张桌子: 库存(库存ID、可用数量) 一个客户可以有多个订单,而一个订单由多个orderDetails项目组成。我正在尝试将库存项目存储在由库存项目和数量整数组成的映射中。 当我尝试以这种方式持久化它时,第一个库存项目将以1的orderID添加到Order详细信息表中。但是下一个是使用2的orderID插入的(不存在)。 有什么帮助吗?

    • 我有两个输入字段fromDate和toDate(都是date)。我使用datepicker作为输入字段fromDate。toDate是只读的,并且依赖于fromDate。也就是说,toDate的日期是6+。例如,如果fromDate是11/30/2014,则toDate是12/6/2014。 我的jsp代码是 和js代码为: 谢谢

    • 我在寻找更“改进的方法”来实现这一点,我有一种方法,从一个id中获取所有记录,然后“映射”到一个类中,我有大约200个“标记”要映射,这将是一个非常长的if链。。。例子:

    • 考虑以下POJO: 使用MapSTRt,我创建了一个映射器,将映射到。由于“业务”“逻辑”,我需要将和约束为的和字段值。这是我使用另一个类得出的结论: 有没有其他方法可以实现这一点(即另一种映射器、装饰器等)?如何将多个值(xml附表、讲座)传递给映射器?