给表添加创建时间,修改时间字段

有时间我们需要指定表的某一行记录的创建时间,和最后更新时间。
但是我们又不主动 set 这个时间,则可以使用下面方式自动创建,更新时间。

SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DROP TABLE  IF EXISTS `course`;

CREATE TABLE `course` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`course_name` VARCHAR ( 255 ) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE = INNODB AUTO_INCREMENT = 10 DEFAULT CHARSET = utf8;

---------------------------
-----以下为 SQL测试---------
---------------------------
INSERT INTO course VALUES(NULL,NULL,NULL,NULL);-- id 自增,其他为 null
INSERT INTO course VALUES(NULL,"语文",NULL,NULL);-- id 自增,course_name 语文,其他为 null
INSERT INTO course(course_name) VALUES("数学");-- id 自增,course_name 数学,创建/修改时间为当前时间
INSERT INTO course(course_name) VALUES("英语");-- id 自增,course_name 英语,创建/修改时间为当前时间

UPDATE course SET course_name="英语-1" where id=13;-- course_name 英语-1,修改时间为当前时间,创建时间不变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2021-12-08 17:03:22 更新说明
查询 MySQL 版本:select version();

对于这两个是只有 5.5之后的版本才可以。如果是 5.5 或者 5.5 以下版本则不支持。
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'

对于 5.5 版本只可以使用一个默认值,并且类型要是 TIMESTAMP(不可以存在两个字段为 DEFAULT CURRENT_TIMESTAMP)。
下面是 5.5 版本的可执行方案(建议升级版本至 8.0,至少官方也是这么说的)。
CREATE TABLE `compose_additional_page` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`project_id` bigint(20) unsigned NOT NULL COMMENT 'compose_project.id',
`title` varchar(64) NOT NULL COMMENT '文档标题',
`content` text COMMENT '文档内容',
`order_index` int(11) NOT NULL DEFAULT '0' COMMENT '排序值',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1:启用,0:禁用',
`is_deleted` tinyint(4) NOT NULL DEFAULT '0',
`gmt_create` TIMESTAMP,
`gmt_modified` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_projectid` (`project_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='聚合文档附加页';

代码

entity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

/**
* 测试 DB createTime updateTime
*
* @author 陶攀峰
* @date 2021/3/22 下午3:24
*/
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@TableName("course")
public class CourseEntity implements Serializable {
private static final long serialVersionUID = 1L;

@TableId(type = IdType.AUTO)
private Integer id;
private String courseName;
private Date createTime;
private Date updateTime;

}

dao

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.decathlon.easypromo.entity.CourseEntity;
import org.apache.ibatis.annotations.Mapper;

/**
* 测试 DB createTime updateTime
*
* @author 陶攀峰
* @date 2021/3/22 下午3:24
*/
@Mapper
public interface CourseDao extends BaseMapper<CourseEntity> {

}

mapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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.decathlon.easypromo.dao.CourseDao">

<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.decathlon.easypromo.entity.CourseEntity" id="courseMap">
<result property="id" column="id"/>
<result property="courseName" column="course_name"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>


</mapper>

App

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.decathlon.easypromo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* 主启动类
*
* @author 陶攀峰
* @version 1.0
* @date 2021-03-03 09:51
*/
@SpringBootApplication
@MapperScan("com.decathlon.easypromo.dao")
public class App {

public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

}

test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import cn.hutool.json.JSONUtil;
import com.decathlon.easypromo.dao.CourseDao;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

/**
* 单元测试类
*
* @author 陶攀峰
* @version 1.0
* @date 2021-03-03 09:51
*/
@SpringBootTest
class AppTests {

@Resource
private CourseDao courseDao;

@Test
void test_db_time() {
//courseDao.insert(new CourseEntity(null, "1", null, null));
//10 11 2021-03-22 07:22:05 2021-03-22 07:22:05

//courseDao.updateById(new CourseEntity(10, "11", null, null));
//10 11 2021-03-22 07:22:05 2021-03-22 07:23:21
}
}