我需要有关Spring Boot和MyBatis集成的帮助。我对自定义BaseTypeHandler有问题。我创建了一个映射器:

@MappedTypes({LocalDateTime.class})
public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {


我添加了一个类型处理程序:

sqlSessionFactory.setTypeHandlers(new LocalDateTimeHandler[]{new LocalDateTimeHandler()});


我有下一个错误:

org.apache.ibatis.executor.ExecutorException: No constructor found in com.some.space.SomeObject matching [java.lang.Integer, java.sql.Timestamp, java.sql.Timestamp]


SomeObject看起来像这样:

public class SomeObject {
    private Long id;
    private LocalDateTime created;
    private LocalDateTime updated;

    public SomeObject(Integer id, LocalDateTime created, LocalDateTime updated){
    //..........
    }
}


我使用的是mybatis-spring和spring-boot-starter-web版本1.3.2。

有关使用TypeHandlers的所有示例均在XML配置上,但是我需要使用Java配置方法。我做错了什么?



UPD:

我的映射器:

@Component
@Mapper
public interface SomeObjectRepository {

    @Select("SELECT * FROM some_objects")
    @Results(value = {
            @Result(property = "created", column = "created_date", typeHandler = LocalDateTimeTypeHandler.class, jdbcType = JdbcType.TIMESTAMP),
            @Result(property = "updated", column = "updated_date", typeHandler = LocalDateTimeTypeHandler.class, jdbcType = JdbcType.TIMESTAMP)
    })
    List<SomeObject> getAll();
}

最佳答案

您尚未指示mybatis将类型处理程序用于时间戳字段。因此,它将使用该JDBC类型的默认类型处理程序从数据库转换时间戳记字段。

如果只想在某些查询中执行此操作,请对xml映射执行以下操作:

<result property="created" column="created"
    typeHandler="com.mycompany.myapp.LocalDateTimeHandler"/>


或通过注释:

@Result(property = "created", column = "created",
        typeHandler=LocalDateTimeHandler.class)


如果要使其全局化,并将其用于特定JDBC类型的所有字段,请向您添加@MappedJdbcTypes TypeHandler

@MappedJdbcTypes({JdbcType.TIMESTAMP})
@MappedTypes({LocalDateTime.class})
public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {


根据使用的mybatis版本,您可能需要在includeNullJdbcType=true注释上设置@MappedJdbcTypes

有关详细信息,请参见documentation

关于mybatis - MyBatis Spring Boot自定义类型处理程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53205366/

10-12 03:27