认清现实,放弃幻想,准备斗争
实体类的名字是User,数据库表名是t_user
- @TableName(value = "t_user")
- public class User {
默认情况下数据库的id列使用的是基于雪花算法的策略生成

随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。
将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。例如,淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。
单表数据拆分有两种方式:垂直分表和水平分表。示意图如下:

垂直分表:
水平分表:
水平分表相比垂直分表,会引入更多的复杂性,例如数据id:
主键自增:
Hash :
雪花算法:
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。


实体类的属性名是 id,数据库的列名是 uid,此时使用 value 属性将属性名映射到列名
- @TableId(value = "uid")
- private String id;
- @TableId(type = IdType.ASSIGN_ID)
- private Long id;
- @TableId(type = IdType.AUTO)
- private Long id;
- #全局设置主键生成策略
- mybatis-plus.global-config.db-config.id-type=auto
功能同TableId的value属性
注意:MP会自动将数据库中的下划线命名风格转化为实体类中的驼峰命名风格
例如,数据库中的列 create_time 和 update_time 自动对应实体类中的 createTime 和 updateTime
![]()
- private LocalDateTime createTime;
- private LocalDateTime updateTime;
扩展知识:为什么建议使用你 LocalDateTime ,而不是 Date?为什么建议使用你 LocalDateTime ,而不是 Date? - 知乎
- @TableField(fill = FieldFill.INSERT)
- private LocalDateTime createTime;
-
- @TableField(fill = FieldFill.INSERT_UPDATE)
- private LocalDateTime updateTime;
step2:实现元对象处理器接口 -> 创建handler包,创建MyMetaObjectHandler类
- @Slf4j
- @Component
- public class MyMetaObjectHandler implements MetaObjectHandler {
-
- @Override
- public void insertFill(MetaObject metaObject) {
- log.info("start insert fill ....");
- this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
- this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
- }
-
- @Override
- public void updateFill(MetaObject metaObject) {
- log.info("start update fill ....");
- this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
- }
- }
- @Override
- public void insertFill(MetaObject metaObject) {
-
- //其他代码
-
- //判断是否具备author属性
- boolean hasAuthor = metaObject.hasSetter("author");
- if(hasAuthor){
- log.info("start insert fill author....");
- this.strictInsertFill(metaObject, "author", String.class, "Helen");
- }
- }
- @TableField(fill = FieldFill.INSERT)
- private Integer age;
- @Override
- public void insertFill(MetaObject metaObject) {
-
- //其他代码
-
- //判断age是否赋值
- Object age = this.getFieldValByName("age", metaObject);
- if(age == null){
- log.info("start insert fill age....");
- this.strictInsertFill(metaObject, "age", String.class, "18");
- }
-
- }
- @TableLogic
- @TableField(value = "is_deleted")
- private Integer deleted;
- 测试删除:删除功能被转变为更新功能
- -- 实际执行的SQL
update user set is_deleted=1 where id = 1 and is_deleted=0
- 测试查询:被逻辑删除的数据默认不会被查询
- -- 实际执行的SQL
select id,name,is_deleted from user where is_deleted=0