@TableName设定表名
-
MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致
-
若实体类类型的类名和要操作的表的表名不一致,访问数据库表将会报错

- 在实体类上添加@TableName("表名"),标识实体类对应的表解决

- 在全局配置中为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName标识实体类对应的表
bash
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
@TableId设定主键
-
MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认基于雪花算法的策略生成id
-
若实体类或表中表示主键的不是id,而是其他字段例如uid,此时将报错

- 在实体类中uid属性上通过@TableId将其标识为主键

- @TableId的value属性
- 若实体类中主键对应的属性为id,而表中表示主键的字段为uid,此时若只在属性id上添加注解 @TableId,则抛出异常Unknown column 'id' in 'field list',即MyBatis-Plus仍然会将id作为表的 主键操作,而表中表示主键的是字段uid
- 此时需要通过@TableId注解的value属性,指定表中的主键字段,@TableId("uid")或 @TableId(value="uid")
- @TableId的type属性
- 用来定义主键策略
- 常用的主键策略
|-----------------------|--------------------------------------|
| 值 | 描述 |
| IdType.ASSIGN_ID(默 认) | 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关 |
| IdType.AUTO | 使用数据库的自增策略,注意,该类型请确保数据库设置了id自增, 否则无效 |
- 全局配置主键策略
bash
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置MyBatis-Plus的全局配置
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
# 设置统一的主键生成策略
id-type: auto
雪花算法
-
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表主键的有序性
-
整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高
-
长度共64bit(一个long型)
- 1bit标识符号位,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。
- 41bit时间截(毫秒级),存储的是时间截的差值(当前时间截-开始时间截),结果约等于69.73年
- 10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)
- 12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)

@TableField设定表字段
设置实体类的属性所对应表的字段名

@TableLogic设定逻辑删除
-
逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为"被删除状态",之后在数据库 中仍旧能看到此条数据记录
-
数据库中创建逻辑删除状态列,设置默认值为0

- 实体类中添加逻辑删除属性

@Version设定表数据版本号
- 乐观锁版本号,每次修改后自动version+1

- 配置乐观锁插件
java
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
interceptor.addInnerInterceptor(new
PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
@EnumValue设定枚举类型插入数据库的值
- 枚举类定义

- 配置扫描通用枚举
bash
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 扫描通用枚举的包
type-enums-package: com.my.mybatisplus.enums
- 测试
java
@Test
public void testSexEnum(){
User user = new User();
user.setName("Enum");
user.setAge(20);
//设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
user.setSex(SexEnum.MALE);
//INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? )
//Parameters: Enum(String), 20(Integer), 1(Integer)
userMapper.insert(user);
}
@DS设定操作的数据源
- 引入多数据源依赖
bash
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
- 数据源配置
bash
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
- service层指定访问数据源
java
@DS("master") //指定所操作的数据源
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements
UserService {
}