今天在搭建ShardingJdbc
模块的时候遇到了一个类型转换的问题,问题如下:
在结果集的映射的时候报错了。在网上搜索的解决方案是更新mybatis
的版本或者是什么更新Druid
的版本,都尝试了,目前使用的版本如下:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
然并卵
后面只能自己去看什么原因了。Debug
追踪后发现问题出来的LocalDateTimeTypeHandler
里面,如图:
但是在ShardingResultSet
并没有实现 getObject(String columnLabel, Class<T> type)
这个方法,是直接抛出异常的
所以没办法,只能自己去实现typeHandler
的了,实现如下:
/**
* @description: LocalDateTime是为了解决shardingResultSet转换LocalDateTime的问题
* @author: xiao7
* @date: 2021/5/27 10:59
*/
@Component
@MappedTypes(LocalDateTime.class)
@MappedJdbcTypes(value = JdbcType.DATE, includeNullJdbcType = true)
public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType)
throws SQLException {
ps.setObject(i, parameter);
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Convert.toLocalDateTime(rs.getObject(columnName));
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Convert.toLocalDateTime(rs.getObject(columnIndex));
}
@Override
public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Convert.toLocalDateTime(cs.getObject(columnIndex));
}
}
有没有新的影响也还不知道,应该没有。反正是可以了