Re: Mybatis. Выбрать из БД byte[]
От: r0nd  
Дата: 19.09.23 18:03
Оценка: 4 (1)
Здравствуйте, karbofos42, Вы писали:

K>Как-то можно прописать, чтобы вариант с byte[] работал?


Проблема здесь связана с тем, что MyBatis не знает, как правильно маппить столбец типа bytea в Postgresql на тип byte[] в Java. Вам нужно использовать org.apache.ibatis.type.TypeHandler для корректного маппинга bytea в byte[].

Далее, создайте класс, который реализует org.apache.ibatis.type.TypeHandler<byte[]> для маппинга столбцов типа bytea на массивы байтов byte[]:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ByteArrayTypeHandler extends BaseTypeHandler<byte[]> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType) throws SQLException {
        PGobject pgObject = new PGobject();
        pgObject.setType("bytea");
        pgObject.setValue(new String(parameter));
        ps.setObject(i, pgObject);
    }

    @Override
    public byte[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        PGobject pgObject = (PGobject) rs.getObject(columnName);
        if (pgObject != null) {
            return pgObject.getValue().getBytes();
        }
        return null;
    }

    @Override
    public byte[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        PGobject pgObject = (PGobject) rs.getObject(columnIndex);
        if (pgObject != null) {
            return pgObject.getValue().getBytes();
        }
        return null;
    }

    @Override
    public byte[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        PGobject pgObject = (PGobject) cs.getObject(columnIndex);
        if (pgObject != null) {
            return pgObject.getValue().getBytes();
        }
        return null;
    }
}


Зарегистрируйте этот обработчик типов в вашем конфигурационном файле MyBatis (например, mybatis-config.xml):


<typeHandlers>
    <typeHandler handler="your.package.name.ByteArrayTypeHandler"/>
</typeHandlers>


Где your.package.name — это имя пакета, в котором находится ByteArrayTypeHandler.

Теперь вы можете использовать byte[] в вашем интерфейсе Mapper и в XML-запросах без каких-либо изменений:

byte[] getContent(long id);


<select id="getContent">
  select content
  from table1
  where id = #{id}
  limit 1
</select>


С этими настройками MyBatis должен корректно маппить столбцы типа bytea на массивы байтов byte[].
...<< Dementor 1.4.2 ✪ Lets Play a Game ⚀⚀⚂⚂⚃>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.