MyBatis实现 Java 对象和数据库中日期类型之间的转换(超详细)

背景

数据库存储的时间字段的类型是datetime

Java实体类的时间字段类型是Date

需求:响应前端的时间字段格式为”yyyy-MM-dd HH:mm:ss“

步骤

1、定义resultMap

定义 Java 对象和数据库表字段的对应关系,在 mapper.xml 文件中使用 #{属性名,jdbcType=数据库字段类型} 来进行参数传递和结果集映射,例如:

    

2、实体类时间字段上添加JsonFormat注解

@JsonFormat日期格式化你的pattern格式,timezone设置时区

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

注:时区也可以在application.yml或application.propertites配置文件中添加,一劳永逸,@JsonFormat就不需要配置timezone了

spring:
  jackson:
    time-zone: Asia/Shanghai

特殊解决方式如下

步骤1和2没有解决的话,继续如下三个步骤

3、自定义类型处理器(MyBatis支持)

public class MyDateTypeHandler implements TypeHandler { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public void setParameter(PreparedStatement ps, int i, Date date, JdbcType jdbcType) throws SQLException { if (date == null) { ps.setNull(i, jdbcType.TYPE_CODE);
        } else { ps.setString(i, sdf.format(date));
        }
    }
    @Override
    public Date getResult(ResultSet rs, String columnName) throws SQLException { Timestamp ts = rs.getTimestamp(columnName);
        return ts == null ? null : new Date(ts.getTime());
    }
    @Override
    public Date getResult(ResultSet rs, int columnIndex) throws SQLException { Timestamp ts = rs.getTimestamp(columnIndex);
        return ts == null ? null : new Date(ts.getTime());
    }
    @Override
    public Date getResult(CallableStatement cs, int columnIndex) throws SQLException { Timestamp ts = cs.getTimestamp(columnIndex);
        return ts == null ? null : new Date(ts.getTime());
    }
}

4、将类型处理器Bean注入容器(在MyBatis配置类中)

@Configuration
@MapperScan({"com.example.mapper"})
public class MyBatisConfig { @Bean
    public TypeHandler myDateTypeHandler() { return new MyDateTypeHandler();
    }
}

5、mapper.xml文件中修改

  

结果SUCCESS

结束语:当你在做你热爱的事情时,你永远不会感到疲惫。