In questa ultima puntata di MyBatis, vedremo come impostare un Type Handler per tipi personalizzati. Supponiamo di avere una tabella con un campo Date e di doverlo mappare in un GregorianCalendar: come fare?


MyBatis consente l’impostazione di un Type Handler nel quale mappare qualunque tipo di dato tra SQL e Java. Vediamo come.

Nel configuration.xml, bisogna impostare l’Handler, così:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="com/toastedtech/mybatis/conf/db.properties" />
	<typeAliases>
		<typeAlias type="com.toastedtech.mybatis.dto.ContattoDTO" alias="contatto" />
	</typeAliases>
	<typeHandlers>
		<typeHandler javaType="java.util.GregorianCalendar" handler="com.toastedtech.mybatis.util.GregorianCalendarTypeHandler" />
	</typeHandlers>
	<mappers>
		<mapper resource="com/toastedtech/mybatis/conf/ContattoMapper.xml" />
	</mappers>
</configuration>

Viene così definita la classe GregorianCalendarTypeHandler, che sarà così strutturata:

package com.toastedtech.mybatis.util;

import java.sql.CallableStatement;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.GregorianCalendar;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

public class GregorianCalendarTypeHandler implements TypeHandler {

    @Override
    public Object getResult(final ResultSet rs, final String columnName) throws SQLException {
        return this.createCalendar(rs.getObject(columnName));
    }

    @Override
    public Object getResult(final CallableStatement cs, final int columnIndex) throws SQLException {
        return this.createCalendar(cs.getObject(columnIndex));
    }

    @Override
    public void setParameter(final PreparedStatement ps, final int i, final Object parameter, final JdbcType jdbcType) throws SQLException {
        final Calendar calendar = (Calendar) parameter;
        ps.setDate(i, new Date(calendar.getTimeInMillis()), calendar);
    }

    public GregorianCalendar createCalendar(final Object sqlDate) throws SQLException {
        if (!(sqlDate instanceof java.util.Date)) {
            return null;
        }

        GregorianCalendar gc = new GregorianCalendar();
        gc.setTime((java.util.Date) sqlDate);

        return gc;
    }
}

A questo punto tutto è ok :)

Ecco il progetto aggiornato: mybatis-helloworld-eclipse-v0.4