首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mybatis XMLGregorianCalendar处理程序

Mybatis XMLGregorianCalendar处理程序
EN

Stack Overflow用户
提问于 2013-07-12 15:11:47
回答 1查看 2.2K关注 0票数 0

映射器文件employeeMapper.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxxx.sample.test.dao.TestDAO">
<select id="selectEmployee" parameterType="int" resultMap="com.viasat.sample.domain.CreateDate" >
select createdate from employee where id = #{id}
</select>
</mapper>

映射器接口TestDAO.java

代码语言:javascript
复制
public interface TestDAO {
public com.viasat.sample.domain.CreateDate selectEmployee(int id);
}

POJO Bean CreateDate.java

代码语言:javascript
复制
public class CreateDate {
private XMLGregorianCalendar createdate;
public XMLGregorianCalendar getCreatedate() {
return createdate;
}
public void setCreatedate(XMLGregorianCalendar createdate) {
this.createdate = createdate;
}
}

Main方法MainClass.java

代码语言:javascript
复制
public class MainClass {
public static void main(String[] args) {
SqlSession session = sqlSessionFactory.openSession();
try {
TestDAO tm = session.getMapper(TestDAO.class);
Map emp = tm.selectEmployee(123);
} catch (Exception e) {
e.printStackTrace();
}
finally {
session.close();
}
}
}

问题:从中检索的日期值( createdate )未映射/设置为CreateDate bean中的XMLGregorianCalendar类型CreateDate。如果createdate的数据类型是Date,则可以很好地工作。简而言之,在Mybatis中,XMLGregorianCalendar类型中没有设置日期数据类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-15 13:14:50

创建自定义处理程序:

代码语言:javascript
复制
import java.sql.CallableStatement; 
import java.sql.Date; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar; 
import org.apache.ibatis.type.JdbcType; 
import org.apache.ibatis.type.TypeHandler; 
public class CustomDateTypeHandler implements TypeHandler { 
@Override 
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) 
throws SQLException { 
if (null != parameter) { 
long time = ((XMLGregorianCalendar) parameter).toGregorianCalendar().getTimeInMillis(); 
Date date = new java.sql.Date(time); 
ps.setDate(i, date); 
} 
else { 
ps.setTimestamp(i, null); 
} 
} 
@Override 
public Object getResult(ResultSet rs, String columnName) throws SQLException { 
Date date = rs.getDate(columnName); 
if (null == date) { 
return null; 
} 
XMLGregorianCalendar date2 = null;
GregorianCalendar c = new GregorianCalendar();
c.setTime(date);
try {
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
} catch (DatatypeConfigurationException e) {
e.printStackTrace();
}
return date2;
} 
@Override 
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { 
return "";
} 
} 

在Mybatis配置xml文件中添加此处理程序:

代码语言:javascript
复制
<typeHandler handler="com.viasat.cmdb.common.utils.CustomDateTypeHandler" javaType="javax.xml.datatype.XMLGregorianCalendar" />
</typeHandlers>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17609406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档