LocalDateTimeHandler.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package com.backendsys.config.Mybatis.handler.timezone;
  2. import org.apache.ibatis.type.BaseTypeHandler;
  3. import org.apache.ibatis.type.JdbcType;
  4. import org.apache.ibatis.type.MappedJdbcTypes;
  5. import org.apache.ibatis.type.MappedTypes;
  6. import org.springframework.stereotype.Component;
  7. import java.sql.*;
  8. import java.time.LocalDateTime;
  9. import java.time.ZoneId;
  10. import java.time.format.DateTimeFormatter;
  11. @MappedTypes(LocalDateTime.class)
  12. @MappedJdbcTypes(JdbcType.VARCHAR) // 关键:对应数据库 VARCHAR
  13. @Component
  14. public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {
  15. private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  16. /* ====== 写入:LocalDateTime -> VARCHAR ====== */
  17. @Override
  18. public void setNonNullParameter(PreparedStatement ps, int i,
  19. LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
  20. ps.setString(i, parameter.format(FMT));
  21. }
  22. /* 允许 null */
  23. @Override
  24. public void setParameter(PreparedStatement ps, int i,
  25. LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
  26. if (parameter == null) {
  27. ps.setNull(i, Types.VARCHAR);
  28. } else {
  29. super.setParameter(ps, i, parameter, jdbcType);
  30. }
  31. }
  32. /* ====== 读取:VARCHAR -> LocalDateTime ====== */
  33. @Override
  34. public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
  35. return strToLocalDateTime(rs.getString(columnName));
  36. }
  37. @Override
  38. public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
  39. return strToLocalDateTime(rs.getString(columnIndex));
  40. }
  41. @Override
  42. public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
  43. return strToLocalDateTime(cs.getString(columnIndex));
  44. }
  45. private LocalDateTime strToLocalDateTime(String val) {
  46. if (val == null || val.trim().isEmpty()) {
  47. return null;
  48. }
  49. // 按自己的格式解析
  50. return LocalDateTime.parse(val.trim(), FMT)
  51. .atZone(ZoneId.of("UTC"))
  52. .withZoneSameInstant(ZoneId.of(TimezoneContextHolder.getTimeZone()))
  53. .toLocalDateTime();
  54. }
  55. }