我使用公共StackOverflow转储并将所有内容存储在MySQL中。现在,我想使用Java和MyBATIS进行一些分析。对于其中一些,我需要为用户或特定问题等提取时间序列。所以,为此,让我们说帖子及其时间戳,我有一个MyBatis查询:
<select id="GetAllPostsTimeStamps" resultType="java.util.Date">
SELECT creationDate from posts
</select>
将时间戳数据传递给MyBatis ResultHandler,我在这里进行了这次转换:
@Override
public void handleResult(ResultContext context) {
TimeZone tz = TimeZone.getTimeZone("UTC");
TimeZone.setDefault(tz);
Date tstamp = (Date) context.getResultObject();
XMLGregorianCalendar xmlTstam = Tstamp.makeTimestamp(tstamp.getTime());
...etc...
}
我真的需要使用XMLGregorianCalendar
因为我的所有下游逻辑都依赖于这种类型。
是否有可能通过其处理程序功能告诉MyBatis在内部将SQL日期时间转换为XMLGregorianCalendar(即我只会对处理程序进行一次编码),所以每次需要时我都会得到适当的时间戳?
编辑以增加更多清晰度。
因此,当我将带有XMLGregorianCalendar
字段的java对象保存到DB(MySQL日期时间类型)时,我使用了MyBatis处理程序的实现:
XMLGregorianCalendarDateTypeHandler implements TypeHandler<XMLGregorianCalendar>
...
我在INSERT
查询中指定的内容如下:
..., #{creationDate,
javaType=javax.xml.datatype.XMLGregorianCalendar,
jdbcType=TIMESTAMP,
typeHandler=...XMLGregorianCalendarTypeHandler},...
有没有办法为SELECT
类型查询指定后向变换处理程序?
答案 0 :(得分:1)
我发现为什么它不工作,也许它会帮助某人:
因此,当我配置一个指定两种类型的处理程序时:JDBC和Java,这不起作用:
<typeHandler javaType="javax.xml.datatype.XMLGregorianCalendar"
jdbcType="TIMESTAMP"
handler="my.package.XMLGregorianCalendarTimestampTypeHandler" />
但如果我只指定Java类型就可以了。魔术:
<typeHandler javaType="javax.xml.datatype.XMLGregorianCalendar"
handler="my.package.XMLGregorianCalendarTimestampTypeHandler" />
不确定是否是错误或功能。
答案 1 :(得分:0)
我不了解MyBatis,但这会有帮助吗?
DatatypeFactory factory = DatatypeFactory.newInstance();
XMLGregorianCalendar calendar = factory.newXMLGregorianCalendar();
calendar.setMillisecond(tstamp.getTime());