2

我使用公共 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 的转换(即我将只编写一次处理程序),所以我每次需要时都会从中得到正确的时间戳?

编辑以增加清晰度。

因此,当我将带有字段的 java 对象保存XMLGregorianCalendar到 DB(MySQL 日期时间类型)时,我使用了 MyBatis 处理程序的实现:

XMLGregorianCalendarDateTypeHandler implements TypeHandler<XMLGregorianCalendar>
...

我在这样的INSERT查询中指定:

    ..., #{creationDate,
           javaType=javax.xml.datatype.XMLGregorianCalendar,
           jdbcType=TIMESTAMP,                
           typeHandler=...XMLGregorianCalendarTypeHandler},...

有没有办法为SELECT类型查询指定反向转换处理程序?

4

2 回答 2

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" />

不确定这是错误还是功能。

于 2012-10-20T17:57:43.667 回答
0

我不知道 MyBatis,但这会有帮助吗?

DatatypeFactory factory = DatatypeFactory.newInstance();
XMLGregorianCalendar calendar = factory.newXMLGregorianCalendar();
calendar.setMillisecond(tstamp.getTime());
于 2012-10-19T17:55:30.993 回答