是否可以直接从MyBATIS获取XMLGregorianCalendar?

时间:2012-10-19 16:10:48

标签: java mybatis

我使用公共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类型查询指定后向变换处理程序?

2 个答案:

答案 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());