瀏覽代碼

支持自定义Id生成.

聂秋秋 5 年之前
父節點
當前提交
ff32fdf437
共有 19 個文件被更改,包括 383 次插入5 次删除
  1. 2 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java
  2. 23 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/incrementer/IdGenerator.java
  3. 1 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/incrementer/SnowflakeIdGenerator.java
  4. 1 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/IdWorker.java
  5. 72 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/IdGeneratorTest.java
  6. 44 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/CustomIdGenerator.java
  7. 53 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/IdGeneratorConfig.java
  8. 8 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/IntegerIdGeneratorMapper.java
  9. 8 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/IntegerStringIdGeneratorMapper.java
  10. 8 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/LongIdGeneratorMapper.java
  11. 8 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/LongStringIdGeneratorMapper.java
  12. 8 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/StringIdGeneratorMapper.java
  13. 19 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/IntegerIdGeneratorModel.java
  14. 22 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/IntegerStringIdGeneratorModel.java
  15. 19 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/LongIdGeneratorModel.java
  16. 22 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/LongStringIdGeneratorModel.java
  17. 22 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/StringIdGeneratorModel.java
  18. 14 0
      mybatis-plus/src/test/resources/h2/spring-id-generator-h2.xml
  19. 29 0
      mybatis-plus/src/test/resources/idgenerator/init.ddl.sql

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java

@@ -162,9 +162,9 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
                     if (tableInfo.getIdType() == IdType.ID_WORKER) {
                         metaObject.setValue(tableInfo.getKeyProperty(), idGenerator.nextId(parameterObject));
                     } else if (tableInfo.getIdType() == IdType.ID_WORKER_STR) {
-                        metaObject.setValue(tableInfo.getKeyProperty(), String.valueOf(idGenerator.nextId(parameterObject)));
+                        metaObject.setValue(tableInfo.getKeyProperty(), idGenerator.nextIdStr(parameterObject));
                     } else if (tableInfo.getIdType() == IdType.UUID) {
-                        metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.get32UUID());
+                        metaObject.setValue(tableInfo.getKeyProperty(), idGenerator.nextUUID(parameterObject));
                     }
                 }
             }

+ 23 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/incrementer/IdGenerator.java

@@ -15,6 +15,8 @@
  */
 package com.baomidou.mybatisplus.core.incrementer;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+
 /**
  * Id 生成器接口
  * 可以自定义id生成方式,如 baidu 的UidGenerator,美团的leaf 等
@@ -30,5 +32,25 @@ public interface IdGenerator {
      * @param entity 实体
      * @return id
      */
-    long nextId(Object entity);
+    Number nextId(Object entity);
+
+    /**
+     * 生成Id
+     *
+     * @param entity 实体
+     * @return id
+     */
+    default String nextIdStr(Object entity) {
+        return String.valueOf(nextId(entity));
+    }
+
+    /**
+     * 获取uuid
+     *
+     * @param entity 实体
+     * @return uuid
+     */
+    default String nextUUID(Object entity) {
+        return IdWorker.get32UUID();
+    }
 }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/incrementer/SnowflakeIdGenerator.java

@@ -40,7 +40,7 @@ public class SnowflakeIdGenerator implements IdGenerator {
     }
 
     @Override
-    public long nextId(Object entity) {
+    public Long nextId(Object entity) {
         return sequence.nextId();
     }
 }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/IdWorker.java

@@ -53,7 +53,7 @@ public class IdWorker {
      */
     @Deprecated
     public static long getId() {
-        return ID_GENERATOR.nextId(new Object());
+        return Long.parseLong(ID_GENERATOR.nextId(new Object()).toString());
     }
 
     /**

+ 72 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/IdGeneratorTest.java

@@ -0,0 +1,72 @@
+package com.baomidou.mybatisplus.test.h2;
+
+import com.baomidou.mybatisplus.test.h2.idgenerator.mapper.*;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.*;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(locations = {"classpath:h2/spring-id-generator-h2.xml"})
+class IdGeneratorTest {
+
+    @Autowired
+    private LongIdGeneratorMapper longIdGeneratorMapper;
+
+    @Autowired
+    private IntegerIdGeneratorMapper integerIdGeneratorMapper;
+
+    @Autowired
+    private StringIdGeneratorMapper stringIdGeneratorMapper;
+
+    @Autowired
+    private LongStringIdGeneratorMapper longStringIdGeneratorMapper;
+
+    @Autowired
+    private IntegerStringIdGeneratorMapper integerStringIdGeneratorMapper;
+
+    @Test
+    void test() {
+        LongIdGeneratorModel longIdGeneratorModel1 = new LongIdGeneratorModel("旺仔");
+        longIdGeneratorMapper.insert(longIdGeneratorModel1);
+        Assertions.assertEquals(666L, longIdGeneratorModel1.getId());
+        LongIdGeneratorModel longIdGeneratorModel2 = new LongIdGeneratorModel("靓仔");
+        longIdGeneratorMapper.insert(longIdGeneratorModel2);
+        Assertions.assertEquals(777L, longIdGeneratorModel2.getId());
+
+        IntegerIdGeneratorModel integerIdGeneratorModel1 = new IntegerIdGeneratorModel("旺仔");
+        integerIdGeneratorMapper.insert(integerIdGeneratorModel1);
+        Assertions.assertEquals(666, integerIdGeneratorModel1.getId());
+        IntegerIdGeneratorModel integerIdGeneratorModel2 = new IntegerIdGeneratorModel("靓仔");
+        integerIdGeneratorMapper.insert(integerIdGeneratorModel2);
+        Assertions.assertEquals(777, integerIdGeneratorModel2.getId());
+
+        StringIdGeneratorModel stringIdGeneratorModel1 = new StringIdGeneratorModel("旺仔");
+        stringIdGeneratorMapper.insert(stringIdGeneratorModel1);
+        Assertions.assertEquals("66666666666", stringIdGeneratorModel1.getId());
+        StringIdGeneratorModel stringIdGeneratorModel2 = new StringIdGeneratorModel("靓仔");
+        stringIdGeneratorMapper.insert(stringIdGeneratorModel2);
+        Assertions.assertEquals("77777777777", stringIdGeneratorModel2.getId());
+
+        LongStringIdGeneratorModel longStringIdGeneratorModel1 = new LongStringIdGeneratorModel("旺仔");
+        longStringIdGeneratorMapper.insert(longStringIdGeneratorModel1);
+        Assertions.assertEquals("666", longStringIdGeneratorModel1.getId());
+        LongStringIdGeneratorModel longStringIdGeneratorModel2 = new LongStringIdGeneratorModel("靓仔");
+        longStringIdGeneratorMapper.insert(longStringIdGeneratorModel2);
+        Assertions.assertEquals("777", longStringIdGeneratorModel2.getId());
+
+
+        IntegerStringIdGeneratorModel integerStringIdGeneratorModel1 = new IntegerStringIdGeneratorModel("旺仔");
+        integerStringIdGeneratorMapper.insert(integerStringIdGeneratorModel1);
+        Assertions.assertEquals("666", integerStringIdGeneratorModel1.getId());
+        IntegerStringIdGeneratorModel integerStringIdGeneratorModel2 = new IntegerStringIdGeneratorModel("靓仔");
+        integerStringIdGeneratorMapper.insert(integerStringIdGeneratorModel2);
+        Assertions.assertEquals("777", integerStringIdGeneratorModel2.getId());
+    }
+}

+ 44 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/CustomIdGenerator.java

@@ -0,0 +1,44 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator;
+
+import com.baomidou.mybatisplus.core.incrementer.IdGenerator;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import org.apache.ibatis.reflection.SystemMetaObject;
+
+public class CustomIdGenerator implements IdGenerator {
+
+    @Override
+    public String nextUUID(Object entity) {
+        String name = (String) SystemMetaObject.forObject(entity).getValue("name");
+        if ("旺仔".equals(name)) {
+            return "66666666666";
+        } else if ("靓仔".equals(name)) {
+            return "77777777777";
+        }
+        return IdWorker.get32UUID();
+    }
+
+    @Override
+    public Number nextId(Object entity) {
+        TableInfo tableInfo = TableInfoHelper.getTableInfo(entity.getClass());
+        String name = (String) SystemMetaObject.forObject(entity).getValue("name");
+        //long test
+        if (tableInfo.getKeyType() == Long.class) {
+            if ("旺仔".equals(name)) {
+                return 666L;
+            } else if ("靓仔".equals(name)) {
+                return 777L;
+            }
+            return 1L;
+        } else {
+            // int test
+            if ("旺仔".equals(name)) {
+                return 666;
+            } else if ("靓仔".equals(name)) {
+                return 777;
+            }
+            return 1;
+        }
+    }
+}

+ 53 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/IdGeneratorConfig.java

@@ -0,0 +1,53 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator;
+
+import com.baomidou.mybatisplus.core.MybatisConfiguration;
+import com.baomidou.mybatisplus.core.config.GlobalConfig;
+import com.baomidou.mybatisplus.core.incrementer.IdGenerator;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.type.EnumOrdinalTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan("com.baomidou.mybatisplus.test.h2.idgenerator.mapper")
+public class IdGeneratorConfig {
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource, GlobalConfig globalConfig) throws Exception {
+        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
+        sqlSessionFactory.setDataSource(dataSource);
+        MybatisConfiguration configuration = new MybatisConfiguration();
+        configuration.setJdbcTypeForNull(JdbcType.NULL);
+        configuration.setMapUnderscoreToCamelCase(true);
+        configuration.setDefaultExecutorType(ExecutorType.REUSE);
+        configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
+        sqlSessionFactory.setConfiguration(configuration);
+        PaginationInterceptor pagination = new PaginationInterceptor();
+        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
+        sqlSessionFactory.setPlugins(
+            pagination,
+            sqlExplainInterceptor);
+        sqlSessionFactory.setGlobalConfig(globalConfig);
+        return sqlSessionFactory.getObject();
+    }
+
+    @Bean
+    public GlobalConfig globalConfiguration() {
+        GlobalConfig conf = new GlobalConfig();
+        //自定义Id生成器
+        conf.setIdGenerator(new CustomIdGenerator());
+        return conf;
+    }
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/IntegerIdGeneratorMapper.java

@@ -0,0 +1,8 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.IntegerIdGeneratorModel;
+
+public interface IntegerIdGeneratorMapper extends BaseMapper<IntegerIdGeneratorModel> {
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/IntegerStringIdGeneratorMapper.java

@@ -0,0 +1,8 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.IntegerStringIdGeneratorModel;
+
+public interface IntegerStringIdGeneratorMapper extends BaseMapper<IntegerStringIdGeneratorModel> {
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/LongIdGeneratorMapper.java

@@ -0,0 +1,8 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.LongIdGeneratorModel;
+
+public interface LongIdGeneratorMapper extends BaseMapper<LongIdGeneratorModel> {
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/LongStringIdGeneratorMapper.java

@@ -0,0 +1,8 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.LongStringIdGeneratorModel;
+
+public interface LongStringIdGeneratorMapper extends BaseMapper<LongStringIdGeneratorModel> {
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/StringIdGeneratorMapper.java

@@ -0,0 +1,8 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.test.h2.idgenerator.model.StringIdGeneratorModel;
+
+public interface StringIdGeneratorMapper extends BaseMapper<StringIdGeneratorModel> {
+
+}

+ 19 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/IntegerIdGeneratorModel.java

@@ -0,0 +1,19 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_int")
+public class IntegerIdGeneratorModel {
+
+    private Integer id;
+
+    private String name;
+
+    public IntegerIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

+ 22 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/IntegerStringIdGeneratorModel.java

@@ -0,0 +1,22 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_int_string")
+public class IntegerStringIdGeneratorModel {
+
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+
+    private String name;
+
+    public IntegerStringIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

+ 19 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/LongIdGeneratorModel.java

@@ -0,0 +1,19 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_long")
+public class LongIdGeneratorModel {
+
+    private Long id;
+
+    private String name;
+
+    public LongIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

+ 22 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/LongStringIdGeneratorModel.java

@@ -0,0 +1,22 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_long_string")
+public class LongStringIdGeneratorModel {
+
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+
+    private String name;
+
+    public LongStringIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

+ 22 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/model/StringIdGeneratorModel.java

@@ -0,0 +1,22 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_string")
+public class StringIdGeneratorModel {
+
+    @TableId(type = IdType.UUID)
+    private String id;
+
+    private String name;
+
+    public StringIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

+ 14 - 0
mybatis-plus/src/test/resources/h2/spring-id-generator-h2.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+    <context:component-scan base-package="com.baomidou.mybatisplus.test.h2.idgenerator"/>
+
+    <bean class="com.baomidou.mybatisplus.test.h2.config.DBConfig">
+        <property name="locationPattern" value="classpath:/idgenerator/*.sql"/>
+    </bean>
+
+</beans>

+ 29 - 0
mybatis-plus/src/test/resources/idgenerator/init.ddl.sql

@@ -0,0 +1,29 @@
+CREATE TABLE IF NOT EXISTS  t_id_generator_long (
+	id BIGINT(20) NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);
+
+CREATE TABLE IF NOT EXISTS  t_id_generator_long_string (
+	id varchar NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);
+
+CREATE TABLE IF NOT EXISTS  t_id_generator_int (
+	id int NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);
+
+CREATE TABLE IF NOT EXISTS  t_id_generator_int_string (
+	id varchar NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);
+
+CREATE TABLE IF NOT EXISTS  t_id_generator_string (
+	id varchar (50) NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);