让天下没有难学的技术
实体类的名字是User,数据库表名是t_user
@TableName(value = "t_user")
public class User {
默认情况下数据库的id列使用的是基于雪花算法的策略生成
随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。
将不同业务数据分散存储到不同的数据库服务器,能够支撑百万甚至千万用户规模的业务,但如果业务继续发展,同一业务的单表数据也会达到单台数据库服务器的处理瓶颈。例如,淘宝的几亿用户数据,如果全部存放在一台数据库服务器的一张表中,肯定是无法满足性能要求的,此时就需要对单表数据进行拆分。
单表数据拆分有两种方式:垂直分表和水平分表。示意图如下:
垂直分表:
水平分表:
水平分表相比垂直分表,会引入更多的复杂性,例如数据id:
主键自增:
Hash :
*雪花算法:*
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。
核心思想:
实体类的属性名是 id,数据库的列名是 uid,此时使用 value 属性将属性名映射到列名
@TableId(value = "uid")
private String id;
type属性用来定义主键策略
@TableId(type = IdType.ASSIGN_ID)
private Long id;
注意:当对象的id被明确赋值时,不会使用雪花算法
@TableId(type = IdType.AUTO)
private Long id;
注意:该类型请确保数据库设置了 ID自增 否则无效
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
三、@TableField
功能同TableId的value属性
注意:MP会自动将数据库中的下划线命名风格转化为实体类中的驼峰命名风格
**例如,**数据库中的列 create_time 和 update_time 自动对应实体类中的 createTime 和 updateTime
private LocalDateTime createTime;
private LocalDateTime updateTime;
扩展知识:为什么建议使用你 LocalDateTime ,而不是 Date?https://zhuanlan.zhihu.com/p/87555377
需求描述:
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。
**例如,**阿里巴巴的开发手册中建议每个数据库表必须要有create_time 和 update_time字段,我们可以使用自动填充功能维护这两个字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
注意:不要忘记添加 @Component 注解
package com.atguigu.mybatisplus.handler;
@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