新增一条记录时,数据库表中会有一个gmt_created 的字段,存放创建时间。
该值在数据库中的默认值为:CURRENT_TIMESTAMP
在对应的JavaBean中,该值为 gmtCreated


那么问题来了:

如何让在表中的Date类型,查出来的时候自动转为 String"yyyy-MM-dd HH:mm:ss") 类型呢?
最好是可以自动全部转换,不要一个个配置mapper.xml文件。

交代一下框架背景:
springboot + mybatis-plus

如下步骤操作即可:

  1. 先编写一个 TypeHandler 类
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    import org.apache.ibatis.type.TypeHandler;
    
    import java.sql.*;
    import java.text.SimpleDateFormat;
    
    @MappedTypes(String.class)
    @MappedJdbcTypes(JdbcType.DATE)
    public class DateTimeStringTypeHandler implements TypeHandler<String> {
    
        private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        private String getDateTimeAsString(Timestamp timestamp) {
            if (timestamp != null) {
                return dateFormat.format(timestamp);
            }
            return null;
        }
    
        @Override
        public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
            // 插入操作时不使用
        }
    
        @Override
        public String getResult(ResultSet rs, String columnName) throws SQLException {
            return getDateTimeAsString(rs.getTimestamp(columnName));
        }
    
        @Override
        public String getResult(ResultSet rs, int columnIndex) throws SQLException {
            return getDateTimeAsString(rs.getTimestamp(columnIndex));
        }
    
        @Override
        public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
            return getDateTimeAsString(cs.getTimestamp(columnIndex));
        }
    }
    
    
  2. 在application.yml 中,指定TypeHandler所在的包的位置
    mybatis-plus:
      type-handlers-package: com.infrastructure.db.DateTimeStringTypeHandler
    
  3. 实体Bean的写法
    @Data
    @TableName(value = "social_follow")
    public class SocialFollow implements Serializable {
    
        private Long id;
    
        private String followedUid;
    
        private String fansUid;
    
        @TableField(value = "gmt_created", typeHandler = DateTimeStringTypeHandler.class)
        private String gmtCreated;
    

注:

  • 数据表结构:
CREATE TABLE `social_follow` (
  `id` bigint NOT NULL,
  `followed_uid` varchar(45) DEFAULT NULL COMMENT '被关注用户标识',
  `fans_uid` varchar(45) DEFAULT NULL COMMENT '粉丝用户标识',
  `gmt_created` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `IDX_UNIQUE` (`followed_uid`,`fans_uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='朋友圈关注'
  • mapper.xml文件:(空的)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.social.SocialFollowMapper">
</mapper>

以上三步,就可以实现让所有的gmtCreate 从表里取出后即为 String 的 yyyy-MM-dd HH:mm:ss 格式了!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐