首頁 > 軟體

mybatis-plus雪花演演算法生成Id使用詳解

2022-07-05 18:05:39

前言

在實際開發過程中,資料庫自增主鍵生成Id能滿足大部分的場景。
但是隨著分散式應用場景的增多,表資料的增大導致分表分庫的大量應用。
資料庫自增主鍵的生成規則無法滿足對應的業務場景,於是誕生了越來越多的分散式ID生成演演算法,其中雪花演演算法是目前最為流行的。
今天說一下在mybatis-plus中如何使用雪花演演算法生成Id。

一、mybatis-plus官網

官方檔案:https://baomidou.com/

Git地址:https://github.com/baomidou/mybatis-plus

TIP⚠️:

推薦學習框架的使用的時候,都多研究下官網,獲取第一手資料。

二、雪花演演算法實戰

1.建表

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主鍵ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年齡',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
    PRIMARY KEY (id)
);

注意⚠️:
這裡的主鍵欄位沒有設定自增生成策略,所以執行新增操作的時候,需要給id欄位設定值,才能新增成功。類似如下:

INSERT INTO user ( id, name, age, email ) VALUES ( 123434, 'test', 13, '101@qq.com')

相關程式碼:
maven依賴:

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

實體User:

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

mapper:

public interface UserMapper extends BaseMapper<User> {

}

啟動類Application:

@SpringBootApplication
@Slf4j
@MapperScan("com.laowan.mybatis_plus.mapper")
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
        log.info("mybatis_plus_demo 啟動成功");
    }
}

注意⚠️:
這裡在啟動類上設定了@MapperScan(“mapper介面目錄”),所以在UserMapper介面上沒有條件@Mapper註解。
@Mapper設定方法:

@Mapper
public interface UserMapper extends BaseMapper<User> {

}

兩者任意選擇一種方式設定即可,如果都不設定,那麼在執行dao層方法進行資料操作時,會出現在spring容器中找不到對應的bean的異常。

@Mapper和@MapperScan都不設定呼叫mapper方法時出現的異常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.laowan.mybatis_plus.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

設定屬性:

server.port=8080
logging.level.com.laowan.mybatis_plus.mapper=debug
spring.datasource.url = jdbc:mysql://localst:3306/seckill?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
spring.datasource.username = root
spring.datasource.password = 123456

3.測試

@SpringBootTest
class MybatisPlusApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert() {
        System.out.println(("----- insert method test ------"));
        User user = new User();
        user.setName("test");
        user.setAge(13);
        user.setEmail("101@qq.com");
        userMapper.insert(user);
        System.out.println(user.toString());
    }

執行結果:

User(id=728666272023183375, name=test, age=13, email=101@qq.com)

多次執行,發現主鍵ID的確呈趨勢遞增。

結論:
主鍵id的生成策略已經採用了雪花演演算法,呈趨勢遞增。

三、實現分析

很多人可能疑惑


IT145.com E-mail:sddin#qq.com