فهرست منبع

主键类型增加BigDecimal,BigInteger支持

https://github.com/baomidou/mybatis-plus/issues/3852
nieqiurong 3 سال پیش
والد
کامیت
778f554612

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

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.core;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
@@ -33,6 +34,8 @@ import org.apache.ibatis.type.TypeException;
 import org.apache.ibatis.type.TypeHandler;
 import org.apache.ibatis.type.TypeHandlerRegistry;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Arrays;
@@ -127,8 +130,22 @@ public class MybatisParameterHandler implements ParameterHandler {
             Object idValue = metaObject.getValue(keyProperty);
             if (StringUtils.checkValNull(idValue)) {
                 if (idType.getKey() == IdType.ASSIGN_ID.getKey()) {
-                    if (Number.class.isAssignableFrom(tableInfo.getKeyType())) {
-                        metaObject.setValue(keyProperty, identifierGenerator.nextId(entity));
+                    Class<?> keyType = tableInfo.getKeyType();
+                    if (Number.class.isAssignableFrom(keyType)) {
+                        Number id = identifierGenerator.nextId(entity);
+                        if (keyType == id.getClass()) {
+                            metaObject.setValue(keyProperty, id);
+                        } else if (Integer.class == keyType) {
+                            metaObject.setValue(keyProperty, id.intValue());
+                        } else if (Long.class == keyType) {
+                            metaObject.setValue(keyProperty, id.longValue());
+                        } else if (BigDecimal.class.isAssignableFrom(keyType)) {
+                            metaObject.setValue(keyProperty, new BigDecimal(id.longValue()));
+                        } else if (BigInteger.class.isAssignableFrom(keyType)) {
+                            metaObject.setValue(keyProperty, new BigInteger(id.toString()));
+                        } else {
+                            throw new MybatisPlusException("Key type '" + keyType + "' not supported");
+                        }
                     } else {
                         metaObject.setValue(keyProperty, identifierGenerator.nextId(entity).toString());
                     }

+ 15 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/IdentifierGeneratorTest.java → mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/IdentifierGeneratorTest.java

@@ -1,4 +1,4 @@
-package com.baomidou.mybatisplus.test.h2;
+package com.baomidou.mybatisplus.test.h2.idgenerator;
 
 import com.baomidou.mybatisplus.test.h2.idgenerator.mapper.*;
 import com.baomidou.mybatisplus.test.h2.idgenerator.model.*;
@@ -30,6 +30,12 @@ class IdentifierGeneratorTest {
 
     @Autowired
     private IntegerStringIdGeneratorMapper integerStringIdGeneratorMapper;
+    
+    @Autowired
+    private BigDecimalIdGeneratorMapper bigDecimalIdGeneratorMapper;
+    
+    @Autowired
+    private BigIntegerIdGeneratorMapper bigIntegerIdGeneratorMapper;
 
     @Test
     void test() {
@@ -68,5 +74,13 @@ class IdentifierGeneratorTest {
         IntegerStringIdGeneratorModel integerStringIdGeneratorModel2 = new IntegerStringIdGeneratorModel("靓仔");
         integerStringIdGeneratorMapper.insert(integerStringIdGeneratorModel2);
         Assertions.assertEquals("777", integerStringIdGeneratorModel2.getId());
+        
+        BigDecimalIdGeneratorModel bigDecimalIdGeneratorModel = new BigDecimalIdGeneratorModel("测试");
+        bigDecimalIdGeneratorMapper.insert(bigDecimalIdGeneratorModel);
+        bigDecimalIdGeneratorMapper.deleteById(bigDecimalIdGeneratorModel);
+        
+        BigIntegerIdGeneratorModel bigIntegerIdGeneratorModel = new BigIntegerIdGeneratorModel("测试");
+        bigIntegerIdGeneratorMapper.insert(bigIntegerIdGeneratorModel);
+        bigIntegerIdGeneratorMapper.deleteById(bigIntegerIdGeneratorModel);
     }
 }

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/BigDecimalIdGeneratorMapper.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.BigDecimalIdGeneratorModel;
+
+public interface BigDecimalIdGeneratorMapper extends BaseMapper<BigDecimalIdGeneratorModel> {
+
+}

+ 8 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/idgenerator/mapper/BigIntegerIdGeneratorMapper.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.BigIntegerIdGeneratorModel;
+
+public interface BigIntegerIdGeneratorMapper extends BaseMapper<BigIntegerIdGeneratorModel> {
+
+}

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

@@ -0,0 +1,21 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_bigdecimal")
+public class BigDecimalIdGeneratorModel {
+
+    private BigDecimal id;
+
+    private String name;
+
+    public BigDecimalIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

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

@@ -0,0 +1,21 @@
+package com.baomidou.mybatisplus.test.h2.idgenerator.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigInteger;
+
+@Data
+@NoArgsConstructor
+@TableName(value = "t_id_generator_biginteger")
+public class BigIntegerIdGeneratorModel {
+
+    private BigInteger id;
+
+    private String name;
+
+    public BigIntegerIdGeneratorModel(String name) {
+        this.name = name;
+    }
+}

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

@@ -4,6 +4,18 @@ CREATE TABLE IF NOT EXISTS  t_id_generator_long (
 	PRIMARY KEY (id)
 );
 
+CREATE TABLE IF NOT EXISTS  t_id_generator_bigdecimal (
+	id BIGINT(20) NOT NULL,
+	name VARCHAR(30) NULL DEFAULT NULL ,
+	PRIMARY KEY (id)
+);
+
+CREATE TABLE IF NOT EXISTS  t_id_generator_biginteger (
+	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 ,