我很长一段时间没有使用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课上我有:
最后,我有一个存储库类,其中有这个方法:
@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表达式吗?)这是可能的。我可以使用此语法执行此操作,还是必须实现行映射器类来实现此行为?
我会这样做:
>
不要再使用旧的“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附表、讲座)传递给映射器?