MybatisPlus是简化开发,基本的增删改查都不需要开发人员写,insert插入是怎么样的过程呢?
1、测试insert @Test
void TestInsert() {
tb_user user = new tb_user();
user.setName("李四");
user.setPsw("123");
int i = userMapper.insert(user);
if(i > 0){
System.out.println("插入成功!!!");
}
System.out.println(user);
System.out.println(user.getUserId());
}
2、查看控制台输出日志
JDBC Connection [HikariProxyConnection@1856128687 wrapping com.mysql.cj.jdbc.ConnectionImpl@2e4389ed] will not be managed by Spring ==> Preparing: INSERT INTO tb_user ( user_id, psw, name ) VALUES ( ?, ?, ? ) ==> Parameters: 1462266553855746050(Long), 123(String), 张三1(String) <== Updates: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@692dba54] 插入成功!!! tb_user(userId=1462266553855746050, name=张三1, psw=123) 1462266553855746050 2021-11-21 10:52:20.473 INFO 19488 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2021-11-21 10:52:20.493 INFO 19488 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
需要在spring boot的配置文件中加入输出日志配置信息
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
插入成功,但是并没有设置id值,肯定是主键自动生产的,这个主键自动生成有不同,有个枚举类列举主键id生成模式,而且还是生成一堆类似UUID的主键id,MybatisPlus默认的id主键自动生成是ID_WORKER。
public enum IdType {
AUTO(0),
NONE(1),
INPUT(2),
ASSIGN_ID(3),
ASSIGN_UUID(4),
@Deprecated
ID_WORKER(3),
@Deprecated
ID_WORKER_STR(3),
@Deprecated
UUID(4);
private final int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
是否非常疑惑,为什么是生成一串类似UUID的数字,其实MybatisPlus默认id主键生成使用雪花算法,那么何为雪花算法呢
3、具体分析ID主键生成机制 3.1、雪花算法:SnowFlake算法,是Twitter开源的分布式id生成算法,核心思想:使用64 bit 的long类型的数字作为全局唯一id
具体详细过程分析参考文章:https://blog.csdn.net/lq18050010830/article/details/89845790
1)AUTO:自增的,数据库的表id也必须自增的
@TableId(type = IdType.AUTO) private Long userId;
2)NONE:无状态,该类型没有设置主键类型
@TableId(type = IdType.NONE) private Long userId;
3)INPUT:插入时必须手动setId()设置id的值
@TableId(type = IdType.INPUT) private Long userId;
4)ID_WORKER:默认的全局唯一id,雪花算法生成的
@TableId(type = IdType.ID_WORKER) private Long userId;
5)UUID:32位UUID字符串
@TableId(type = IdType.UUID) private Long userId;
字符串无法转为Long类型
'userId' of 'class sz.kingdom.testmybatisplus.pojo.tb_user' with value '038681c3c560fba688693469b72bbb2d' Cause: java.lang.IllegalArgumentException: argument type mismatch4、注意点
数据库表的id值类型需要设置成bigint类型,对应的JavaBean的类型设置成对应的Long类型,不然不会使用雪花算法生成自增id值



