当前位置:   article > 正文

解决动态数据源mybatis-plus.type-handlers-package配置不生效问题

type-handlers-package

1.去掉mybatis-plus.type-handlers-package=com.zcloud.sl.flood.model.handler.LocalDateTimeHandler

2.自定义时间转换器

  1. import org.apache.ibatis.type.BaseTypeHandler;
  2. import org.apache.ibatis.type.JdbcType;
  3. import org.springframework.stereotype.Component;
  4. import java.sql.*;
  5. import java.time.LocalDateTime;
  6. import java.time.ZoneId;
  7. import java.time.ZonedDateTime;
  8. /**
  9. * 不用注入容器,是因为在 MyBatis中,类型处理器是通过反射进行实例化的
  10. */
  11. public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {
  12. /**
  13. * 将 LocalDateTime 转换为中国时间(东八区),并设置到 PreparedStatement 中
  14. */
  15. @Override
  16. public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
  17. // 将 LocalDateTime 转换为 UTC 时间
  18. ZonedDateTime zonedDateTime = parameter.atZone(ZoneId.of("UTC"));
  19. // 将 UTC 时间转换为中国时间(东八区)
  20. ZonedDateTime cnZonedDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
  21. // 将 LocalDateTime 转换为 Timestamp,并设置到 PreparedStatement 中
  22. ps.setTimestamp(i, Timestamp.valueOf(cnZonedDateTime.toLocalDateTime()));
  23. }
  24. /**
  25. * 从 ResultSet 中获取 columnName 列对应的值,并将其转换为 LocalDateTime
  26. */
  27. @Override
  28. public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
  29. return getLocalDateTime(rs.getTimestamp(columnName));
  30. }
  31. /**
  32. * 从 ResultSet 中获取 columnIndex 列对应的值,并将其转换为 LocalDateTime
  33. */
  34. @Override
  35. public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  36. return getLocalDateTime(rs.getTimestamp(columnIndex));
  37. }
  38. /**
  39. * 从 CallableStatement 中获取 columnIndex 列对应的值,并将其转换为 LocalDateTime
  40. */
  41. @Override
  42. public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  43. return getLocalDateTime(cs.getTimestamp(columnIndex));
  44. }
  45. /**
  46. * 将 Timestamp 转换为 LocalDateTime
  47. */
  48. private LocalDateTime getLocalDateTime(Timestamp timestamp) {
  49. if (timestamp != null) {
  50. return timestamp.toLocalDateTime();
  51. }
  52. return null;
  53. }
  54. }

3.mybatisplus注册自定义转换器

  1. import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;
  2. import com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropertiesCustomizer;
  3. import com.zcloud.sl.flood.model.handler.LocalDateTimeHandler;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * 自定义 Mybatis 配置定制器,注入容器是因为要获取MybatisPlusProperties属性
  8. */
  9. @Configuration
  10. public class CustomMybatisConfigurationCustomizer implements MybatisPlusPropertiesCustomizer {
  11. @Override
  12. public void customize(MybatisPlusProperties properties) {
  13. // 注册自定义类型处理器
  14. properties.getConfiguration().getTypeHandlerRegistry().register(LocalDateTimeHandler.class);
  15. }
  16. @Bean
  17. public CustomMybatisConfigurationCustomizer mybatisConfigurationCustomizer() {
  18. return new CustomMybatisConfigurationCustomizer();
  19. }
  20. }

这样就解决问题了

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号