可能發(fā)生的報(bào)錯(cuò)信息:
Cause: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.time.LocalDate栽烂;
解決方案:
mybatis-spring-boot-starter 升級(jí)至->2.1.1
com.alibaba.druid 升級(jí)至->1.2.1
mysql-connector-java 升級(jí)至->5.1.46,
升級(jí)之前的版本是:
mybatis-spring-boot-starter 1.3.0
com.alibaba.druid 1.0.7
mysql-connector-java 5.1.30
升級(jí)之后如果如果還有問(wèn)題
查詢(xún)可能會(huì)有以下報(bào)錯(cuò):
org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'orderTime' from result set. Cause: java.sql.SQLFeatureNotSupportedException: getObject with type
; SQL []; getObject with type; nested exception is java.sql.SQLFeatureNotSupportedException: getObject with type
Caused by: java.sql.SQLFeatureNotSupportedException: getObject with type
at io.shardingjdbc.core.jdbc.unsupported.AbstractUnsupportedOperationResultSet.getObject(AbstractUnsupportedOperationResultSet.java:223)
at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
解決方案:
在自己項(xiàng)目下創(chuàng)建mybatis相同包路徑org.apache.ibatis.type的LocalDateTimeTypeHandler類(lèi).
package org.apache.ibatis.type;
import java.sql.*;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
* @className: LocalDateTimeTypeHandler
* @author: 112609
* @date: 2022-04-08 17:39
* @description: TODO
*/
public class LocalDateTimeTypeHandler implements TypeHandler<LocalDateTime> {
? ? private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
? ? @Override
? ? public void setParameter(PreparedStatement preparedStatement, int i, LocalDateTime localDateTime, JdbcType jdbcType) throws SQLException {
? ? ? ? if(localDateTime == null) {
? ? ? ? ? ? preparedStatement.setTimestamp(i, null);
? ? ? ? } else {
? ? ? ? ? ? long epochMilli = localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
? ? ? ? ? ? Timestamp date = new Timestamp(epochMilli);
? ? ? ? ? ? preparedStatement.setTimestamp(i, date);
? ? ? ? }
? ? }
? ? @Override
? ? public LocalDateTime getResult(ResultSet resultSet, String columnName) throws SQLException {
? ? ? ? Timestamp timestamp = resultSet.getTimestamp(columnName);
? ? ? ? if(timestamp == null){
? ? ? ? ? ? return null;
? ? ? ? }else {
? ? ? ? ? ? final Instant instant = timestamp.toInstant();
? ? ? ? ? ? return instant.atZone(ZoneOffset.of("+8")).toLocalDateTime();
? ? ? ? }
? ? }
? ? @Override
? ? public LocalDateTime getResult(ResultSet resultSet, int columnIndex) throws SQLException {
? ? ? ? Date date = resultSet.getDate(columnIndex);
? ? ? ? if (date == null) {
? ? ? ? ? ? return null;
? ? ? ? } else {
? ? ? ? ? ? final Instant instant = date.toInstant();
? ? ? ? ? ? return instant.atZone(ZoneOffset.of("+8")).toLocalDateTime();
? ? ? ? }
? ? }
? ? @Override
? ? public LocalDateTime getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
? ? ? ? Date date = callableStatement.getDate(columnIndex);
? ? ? ? if (date == null) {
? ? ? ? ? ? return null;
? ? ? ? } else {
? ? ? ? ? ? final Instant instant = date.toInstant();
? ? ? ? ? ? return instant.atZone(ZoneOffset.of("+8")).toLocalDateTime();
? ? ? ? }
? ? }
}
如果使用sharedingJdbc分表組件時(shí)
用了LocalDate類(lèi)型的字段作為分表邏輯渺氧,則可能還會(huì)出現(xiàn)java.sql.Date can not be cast to java.time.localDate, 此時(shí)localDate類(lèi)型的分表字段應(yīng)使用 java.sql.Date晦毙,而不應(yīng)該使用LocalDate, 原因也是顯而易見(jiàn)的乒裆,因?yàn)榉直磉壿嬙赑reparedStatment.setParameter()之后卷员,代碼清單如下所示:
public final class DayShardingTableAlgorithm implements PreciseShardingAlgorithm<Date> {
? ? @Override
? ? public String doSharding(Collection<String> tableNames, PreciseShardingValue<Date> shardingValue) {
? ? ? ? java.util.Date date = new java.util.Date(shardingValue.getValue().getTime());
? ? ? ? final LocalDate localDate = date.toInstant().atZone(ZoneOffset.of("+8")).toLocalDate();
? ? ? ? return tableNames.stream().filter(e ->e.endsWith(String.valueOf(localDate.getDayOfMonth()))).findFirst().orElseThrow(() -> new UnsupportedOperationException());
? ? }
}
如果這篇文章解決了你的問(wèn)題匣沼,請(qǐng)不要白嫖我泉唁,來(lái)個(gè)一鍵三連哦