0

There is no default handler for java.sql.Blob. The documentation recommends using a byte[] array but I have a legacy class that makes use of Blob.

How can I define a custom handler for Blob?

Kshitiz Sharma
  • 17,947
  • 26
  • 98
  • 169

1 Answers1

2

You can override BaseTypeHandler to support Blob handling like this:

@MappedTypes(Blob.class)
public class CustomBlobTypeHandler extends BaseTypeHandler<Blob> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            Blob parameter, JdbcType jdbcType) throws SQLException {
        InputStream is = parameter.getBinaryStream();
        try {
            ps.setBinaryStream(i, is, is.available());
        } catch (IOException e) {
            throw new SQLException(e);
        }
    }

    @Override
    public Blob getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        return rs.getBlob(columnName);
    }

    @Override
    public Blob getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        return rs.getBlob(columnIndex);
    }

    @Override
    public Blob getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return cs.getBlob(columnIndex);
    }

}

Then register it with the SqlSessionFactoryBean using the typeHandlersPackage property:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="in.ksharma.model" />
        <property name="typeHandlersPackage" value="in.ksharma.mybatis.typehandlers" />
        <property name="mapperLocations" value="classpath*:*-mapper*.xml" />
    </bean>
Kshitiz Sharma
  • 17,947
  • 26
  • 98
  • 169