2012-10-19 36 views
2

我使用公共的StackOverflow轉儲工作,並將所有內容都存儲在MySQL中。現在,我想用Java和MyBATIS進行一些分析。對於其中一些我需要提取時間序列的用戶,或一個特定的問題等,所以對於這一點,可以說帖和它們的時間戳,我有一個MyBatis的查詢:是否可以直接從MyBATIS獲取XMLGregorianCalendar?

<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 datetime轉換爲XMLGregorianCalendar(即,我將僅處理一次該處理程序),因此每次需要時我都會得到適當的時間戳?

編輯添加更多的清晰度。

所以,當我保存XMLGregorianCalendar領域的Java對象到數據庫(MySQL的日期時間類型),我使用的MyBatis的處理程序的實現:

XMLGregorianCalendarDateTypeHandler implements TypeHandler<XMLGregorianCalendar> 
... 

我在INSERT這樣的查詢指定:

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

有沒有辦法指定SELECT類型查詢的向後轉換處理程序?

回答

0

我不知道MyBatis,但這會有幫助嗎?

DatatypeFactory factory = DatatypeFactory.newInstance(); 
XMLGregorianCalendar calendar = factory.newXMLGregorianCalendar(); 
calendar.setMillisecond(tstamp.getTime()); 
+0

它與我所做的非常相似,但是我需要一個處理程序才能處理DATETIME到XMLGregorianCalendar。我想到了,所以我會爲我自己的問題發表一個答案。 – seninp

1

我發現爲什麼它不是工作,也許這將幫助別人:

所以,當我配置的處理程序指定兩種類型:JDBC和Java,這並不工作:

<typeHandler javaType="javax.xml.datatype.XMLGregorianCalendar" 
     jdbcType="TIMESTAMP" 
     handler="my.package.XMLGregorianCalendarTimestampTypeHandler" /> 

但是,如果我指定它只是Java類型的作品。 Magic:

<typeHandler javaType="javax.xml.datatype.XMLGregorianCalendar" 
     handler="my.package.XMLGregorianCalendarTimestampTypeHandler" /> 

不知道它是一個錯誤還是一個功能。

相關問題