Как отобразить AtomicLong в MyBatis? - PullRequest
0 голосов
/ 17 июня 2019

Я использую файлы xml mapper в MyBatis, чтобы поместить все мои классы POJO в базу данных. Однако один из этих объектов имеет поле AtomicLong в качестве поля, и MyBatis, похоже, не знает, как с ним справиться.

Я попытался сделать довольно стандартный маппер для класса POJO, и у меня получилась карта результата, которая выглядела так:

<resultMap id="result" type="MyPojo">
   <result property="myAtomicLongVal" column="myLongValColumn"/>
</resultMap>

Когда я это делаю, я получаю сообщение об ошибке.

org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML.  Cause: java.lang.IllegalStateException:  No typehandler found for property myAtomicLongVal

1 Ответ

1 голос
/ 18 июня 2019

Нет встроенного обработчика типа для AtomicLong, поэтому вам может потребоваться написать его.

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.AtomicLong;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

@MappedTypes(AtomicLong.class)
public class AtomicLongTypeHandler
    extends BaseTypeHandler<AtomicLong>{
  @Override
  public void setNonNullParameter(PreparedStatement ps, int i,
      AtomicLong parameter, JdbcType jdbcType)
      throws SQLException {
    ps.setLong(i, parameter.get());
  }

  @Override
  public AtomicLong getNullableResult(ResultSet rs,
    String columnName) throws SQLException {
    return new AtomicLong(rs.getLong(columnName));
  }

  @Override
  public AtomicLong getNullableResult(ResultSet rs,
    int columnIndex) throws SQLException {
    return new AtomicLong(rs.getLong(columnIndex));
  }

  @Override
  public AtomicLong getNullableResult(CallableStatement cs,
    int columnIndex) throws SQLException {
    return new AtomicLong(cs.getLong(columnIndex));
  }
}

Вы можете зарегистрировать обработчик типа глобально в конфигурации.например,

<typeHandlers>
  <typeHandler handler="pkg.AtomicLongTypeHandler" />
</typeHandlers>

Карта результатов должна работать как есть.

...