diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml index e22dd90b..32b67e43 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/pom.xml @@ -29,6 +29,12 @@ spring-boot-starter-web + + com.alibaba.fastjson2 + fastjson2 + 2.0.32 + + diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/CloneTest.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/CloneTest.java index 9a06c427..4a59fe0b 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/CloneTest.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/CloneTest.java @@ -16,6 +16,8 @@ package com.mybatisflex.test.common; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONWriter; import com.mybatisflex.core.query.QueryWrapper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -23,7 +25,7 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.function.Supplier; -import static com.mybatisflex.core.query.QueryMethods.case_; +import static com.mybatisflex.core.query.QueryMethods.count; import static com.mybatisflex.core.query.QueryMethods.distinct; import static com.mybatisflex.test.model.table.RoleTableDef.ROLE; import static com.mybatisflex.test.model.table.UserRoleTableDef.USER_ROLE; @@ -35,18 +37,27 @@ import static com.mybatisflex.test.model.table.UserTableDef.USER; */ class CloneTest { + @Test + void test03() { + String jsonString = JSON.toJSONString(newQueryWrapper(), JSONWriter.Feature.FieldBased, JSONWriter.Feature.ReferenceDetection); + System.out.println(jsonString); + } + @Test void test() { QueryWrapper queryWrapper = newQueryWrapper(); + Class queryWrapperClass = QueryWrapper.class; int count = 10000; /* - * new: 50 ms - * clone: 68 ms - * serial: 2634 ms + * new: 41ms + * clone: 65ms + * fastjson: 620ms + * serial: 2003ms */ calcTime(count, "new", this::newQueryWrapper); calcTime(count, "clone", queryWrapper::clone); + calcTime(count, "fastjson", () -> SerialUtil.cloneObject(queryWrapper, queryWrapperClass)); calcTime(count, "serial", () -> SerialUtil.cloneObject(queryWrapper)); } @@ -55,12 +66,16 @@ class CloneTest { QueryWrapper queryWrapper = newQueryWrapper(); QueryWrapper queryWrapper1 = queryWrapper.clone(); QueryWrapper queryWrapper2 = SerialUtil.cloneObject(queryWrapper); + QueryWrapper queryWrapper3 = SerialUtil.cloneObject(queryWrapper, QueryWrapper.class); + System.err.println(SerialUtil.toJSONString(queryWrapper)); System.out.println(queryWrapper.toSQL()); System.out.println(queryWrapper1.toSQL()); System.out.println(queryWrapper2.toSQL()); + System.out.println(queryWrapper3.toSQL()); - Assertions.assertEquals(queryWrapper.toSQL(),queryWrapper1.toSQL()); - Assertions.assertEquals(queryWrapper.toSQL(),queryWrapper2.toSQL()); + Assertions.assertEquals(queryWrapper.toSQL(), queryWrapper1.toSQL()); + Assertions.assertEquals(queryWrapper.toSQL(), queryWrapper2.toSQL()); + Assertions.assertEquals(queryWrapper.toSQL(), queryWrapper3.toSQL()); } private void calcTime(int count, String type, Supplier supplier) { @@ -74,13 +89,13 @@ class CloneTest { private QueryWrapper newQueryWrapper() { return QueryWrapper.create() - .select(case_() + .select(count(distinct(USER.USER_ID))/*case_() .when(USER.USER_ID.eq(3)).then("x3") .when(USER.USER_ID.eq(5)).then("x4") .end(), distinct(USER.USER_ID.add(4)), USER.USER_NAME, - ROLE.ALL_COLUMNS) + ROLE.ALL_COLUMNS*/) .from(USER.as("u")) .leftJoin(USER_ROLE).as("ur").on(USER_ROLE.USER_ID.eq(USER.USER_ID)) .leftJoin(ROLE).as("r").on(USER_ROLE.ROLE_ID.eq(ROLE.ROLE_ID)) diff --git a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java index 7859baf3..3eb135ed 100644 --- a/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java +++ b/mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/SerialUtil.java @@ -16,6 +16,10 @@ package com.mybatisflex.test.common; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; + import java.io.*; /** @@ -51,4 +55,20 @@ public class SerialUtil { return (T) readObject(writeObject(obj)); } + public static String toJSONString(Object obj) { + return JSON.toJSONString(obj, JSONWriter.Feature.FieldBased, + JSONWriter.Feature.WriteClassName, + JSONWriter.Feature.NotWriteRootClassName, + JSONWriter.Feature.ReferenceDetection); + } + + public static T parseObject(String str, Class tClass) { + return JSON.parseObject(str, tClass, JSONReader.Feature.FieldBased, + JSONReader.Feature.SupportClassForName); + } + + public static T cloneObject(Object obj, Class tClass) { + return parseObject(toJSONString(obj), tClass); + } + } \ No newline at end of file