From 928e266860a087e9f274128da47cd18094f55f74 Mon Sep 17 00:00:00 2001 From: liuzh Date: Sat, 16 Dec 2023 00:45:39 +0800 Subject: [PATCH] =?UTF-8?q?GenId=E6=94=AF=E6=8C=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8F=92=E5=85=A5=EF=BC=8C=E4=BF=AE=E6=94=B9=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?id=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E6=9C=89=E5=80=BC=EF=BC=8C=E5=88=99=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=96=B0=E7=9A=84ID=E8=A6=86=E7=9B=96=EF=BC=8Cclosed?= =?UTF-8?q?=20#https://github.com/mybatis-mapper/mapper/issues/94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../provider/keysql/GenIdKeyGenerator.java | 35 +++++++++++++++---- .../provider/test/User123MapperTest.java | 3 ++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/mybatis/provider/keysql/GenIdKeyGenerator.java b/src/main/java/io/mybatis/provider/keysql/GenIdKeyGenerator.java index ff192cd..425b540 100644 --- a/src/main/java/io/mybatis/provider/keysql/GenIdKeyGenerator.java +++ b/src/main/java/io/mybatis/provider/keysql/GenIdKeyGenerator.java @@ -26,6 +26,10 @@ import org.apache.ibatis.session.Configuration; import java.sql.Statement; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; /** @@ -76,9 +80,30 @@ public void processAfter(Executor executor, MappedStatement ms, Statement stmt, } } + @SuppressWarnings({"rawtypes", "unchecked"}) public void genId(Object parameter) { - Object id = genId.genId(table, column); - configuration.newMetaObject(parameter).setValue(column.property(), id); + if (parameter != null) { + if (table.entityClass().isInstance(parameter)) { + MetaObject metaObject = configuration.newMetaObject(parameter); + if (metaObject.getValue(column.property()) == null) { + Object id = genId.genId(table, column); + metaObject.setValue(column.property(), id); + } + } else if (parameter instanceof Map) { + new HashSet<>(((Map) parameter).values()).forEach(this::genId); + } else if (parameter instanceof Iterator) { + Iterator iterator = (Iterator) parameter; + Set set = new HashSet(); + while (iterator.hasNext()) { + set.add(iterator.next()); + } + set.forEach(this::genId); + } else if (parameter instanceof Iterable) { + Set set = new HashSet(); + ((Iterable) parameter).forEach(set::add); + set.forEach(this::genId); + } + } } /** @@ -94,11 +119,7 @@ public void prepare(Object parameter) { if (executeBefore) { if (count.get() < getConcurrency()) { count.incrementAndGet(); - MetaObject metaObject = configuration.newMetaObject(parameter); - if (metaObject.getValue(column.property()) == null) { - Object id = genId.genId(table, column); - metaObject.setValue(column.property(), id); - } + genId(parameter); } } } diff --git a/src/test/java/io/mybatis/provider/test/User123MapperTest.java b/src/test/java/io/mybatis/provider/test/User123MapperTest.java index 2b6bbcd..9116d4c 100644 --- a/src/test/java/io/mybatis/provider/test/User123MapperTest.java +++ b/src/test/java/io/mybatis/provider/test/User123MapperTest.java @@ -68,10 +68,13 @@ public void testInsert() { u3.setUsername("hello"); Assert.assertEquals(1, userMapper.insertUser3(u3)); Assert.assertNotNull(u3.getId()); + u3.setId(null); Assert.assertEquals(1, userMapper.insertUser3(u3)); Assert.assertNotNull(u3.getId()); + u3.setId(null); Assert.assertEquals(1, userMapper.insertUser3(u3)); Assert.assertNotNull(u3.getId()); + u3.setId(null); Assert.assertEquals(1, userMapper.insertUser3(u3)); Assert.assertNotNull(u3.getId()); }