- 测试类
@SpringBootTest
class DemompApplicationTests {
@Autowired
private UserMapper userMapper;
//查询操作,查询所有
@Test
public void findAll() {
List<User> users = userMapper.selectList(null);
System.out.println(users);
}
@Test
void contextLoads() {
}
}
- 查看sql输出日志
#mybatis 日志输出sql
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
运行测试类,查看测试结果,并查看输出日志。
- 插入操作
// 插入操作 @Test public void add() { User user = new User(); //id在插入时,Mybatis会默认帮我们生成 user.setName("李剑桥就是铁憨憨"); user.setAge(20); user.setEmail("lijianqiao@ccit.edu"); // 返回影响行数,插入1个数据,就影响一行 int insert = userMapper.insert(user); System.out.println("影响行数"+insert); }
由上述Springboot会自动帮助我们生成主键(也就是User.id)说起,那么又引发了一个问题,主键的生成
该如何把握呢?或者该如何设计呢?
这里就不得不讨论一下主键生成策略
。
主键策略
- 在实体类User添加注解
@TableId(type = IdType.ASSIGN_ID)
,可以使用@TableId确定主键,使用type属性规定主键策略:
@Data
public class User {
@TableId(type = IdType.ASSIGN_ID)
//
private Long id;
private String name;
private Integer age;
private String email;
}
- 这里的添加策略共有8种,但是后面的3种已经弃用(没有学习得必要了),这里只学习使用前面的5种,比较常用的是
AUTO
、ASSIGN_UUID
、ASSIGN_ID
、INPUT
、NONE
| 值 | 描述 | | —- | —- | | AUTO | 数据库ID自增 | | NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) | | INPUT | insert前自行set主键值 | | ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口
IdentifierGenerator
的方法nextId
(默认实现类为DefaultIdentifierGenerator
雪花算法) | | ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator
的方法nextUUID
(默认default方法) | |ID_WORKER|分布式全局唯一ID 长整型类型(please use ~~`ASSIGN_ID`)~~ | |UUID|32位UUID字符串(please use ~~`ASSIGN_UUID`)~~ | |ID_WORKER_STR|分布式全局唯一ID 字符串类型(please use ~~`ASSIGN_ID`)~~ |
在这里我们可以查看一下IdType
的源码,就能简单知道主键的生成策略。
/**
* 生成ID类型枚举类
*
*/
@Getter
public enum IdType {
/**
* 数据库ID自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4),
/**
*
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER_STR(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
*/
@Deprecated
UUID(4);
private final int key;
IdType(int key) {
this.key = key;
}
}
PS:如果您有兴趣,可以了解一下的雪花策略。
来看看使用主键策略
后,插入的数据有什么不同?准确说是ID值的不同。再来执行一遍插入操作,看看有什么不同?
这里的Id
长度为19
位Long型值。
配置主键策略的方式
1.全局配置
#这里的全局配置在application.yaml文件中修改
mybatis-plus:
global-config:
db-config:
id-type: AUTO
2.局部配置
// 直接在实体类中添加注解
@TableId(type = IdType.AUTO) //指定主键
private Long id;