如何在MyBatis中映射AtomicLong?

时间:2019-06-17 19:29:25

标签: java mybatis

我在MyBatis中使用xml映射器文件将所有POJO类推送到数据库中。但是,这些对象之一将AtomicLong作为字段,而MyBatis似乎不知道如何处理它。

我尝试为POJO类做一个非常标准的映射器,并且有一个看起来像这样的resultMap:

<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 个答案:

答案 0 :(得分:1)

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>

结果图应按原样工作。