From 468a28f8365c0b48e2fd2c13c093132feab8edea Mon Sep 17 00:00:00 2001 From: yulichang Date: Mon, 23 Oct 2023 00:15:25 +0800 Subject: [PATCH 01/88] =?UTF-8?q?fix=20select=E5=AD=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../github/yulichang/kt/KtLambdaWrapper.java | 4 +- .../yulichang/wrapper/MPJLambdaWrapper.java | 3 +- .../yulichang/wrapper/segments/SelectSub.java | 125 ++ .../test/join/LambdaWrapperTest.java | 6 +- .../yulichang/test/kt/LambdaWrapperTest.kt | 1232 +++++++++-------- 5 files changed, 752 insertions(+), 618 deletions(-) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java index 8ab8c81..04f7d6d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java @@ -12,7 +12,6 @@ import com.github.yulichang.toolkit.KtUtils; import com.github.yulichang.toolkit.KtWrapperUtils; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.support.ColumnCache; -import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.resultmap.Label; @@ -218,8 +217,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName()), hasAlias, this.alias)); return typedThis; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 33e157b..16d171c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -217,8 +217,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias)), hasAlias, this.alias)); return typedThis; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java new file mode 100644 index 0000000..6b35a8d --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java @@ -0,0 +1,125 @@ +package com.github.yulichang.wrapper.segments; + +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.github.yulichang.wrapper.enums.BaseFuncEnum; +import org.apache.ibatis.type.TypeHandler; + +import java.util.Objects; +import java.util.function.Supplier; + +/** + * 子查询列 + * + * @author yulichang + * @since 1.4.7 + */ +public class SelectSub implements Select { + + private final Supplier column; + + private final boolean hasTableAlias; + + private final String tableAlias; + + public SelectSub(Supplier column, boolean hasTableAlias, String tableAlias) { + this.column = column; + this.hasTableAlias = hasTableAlias; + this.tableAlias = tableAlias; + } + + @Override + public Class getClazz() { + return null; + } + + @Override + public Integer getIndex() { + return null; + } + + @Override + public boolean isHasTableAlias() { + return this.hasTableAlias; + } + + @Override + public String getTableAlias() { + return this.tableAlias; + } + + @Override + public boolean isPk() { + return false; + } + + @Override + public String getColumn() { + return Objects.isNull(column) ? StringPool.EMPTY : column.get(); + } + + @Override + public Class getColumnType() { + return null; + } + + @Override + public String getTagColumn() { + return null; + } + + @Override + public String getColumProperty() { + return null; + } + + @Override + public boolean hasTypeHandle() { + return false; + } + + @Override + public TypeHandler getTypeHandle() { + return null; + } + + @Override + public boolean isHasAlias() { + return false; + } + + @Override + public String getAlias() { + return null; + } + + @Override + public TableFieldInfo getTableFieldInfo() { + return null; + } + + @Override + public boolean isFunc() { + return false; + } + + @Override + public SelectFunc.Arg[] getArgs() { + return null; + } + + @Override + public BaseFuncEnum getFunc() { + return null; + } + + @Override + public boolean isLabel() { + return false; + } + + @Override + public boolean isStr() { + return true; + } +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index de21cd0..1989687 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -1047,10 +1047,10 @@ class LambdaWrapperTest { .le(UserDO::getId, 100); wrapper.list(); - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); + ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) - .selectSub(AddressDO.class, w -> w.select(AddressDO::getId) - .eq(AddressDO::getId, UserDO::getId) + .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) + .eq(AreaDO::getId, AddressDO::getId) .last("limit 1"), UserDO::getId) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) .le(UserDO::getId, 100); diff --git a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt index b6097b0..e974a64 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt @@ -55,48 +55,48 @@ class LambdaWrapperTest { @Test fun testJoin() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id,\n" + - " t1.user_id,\n" + - " t1.area_id,\n" + - " t1.tel,\n" + - " t1.address,\n" + - " t1.del AS joina_del,\n" + - " t2.id AS joinb_id,\n" + - " t2.province,\n" + - " t2.city,\n" + - " t2.area,\n" + - " t2.postcode,\n" + - " t2.del AS joinb_del\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND t2.del = false\n" + - " AND (t.id <= ?)\n" + - "ORDER BY t.id DESC" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id,\n" + + " t1.user_id,\n" + + " t1.area_id,\n" + + " t1.tel,\n" + + " t1.address,\n" + + " t1.del AS joina_del,\n" + + " t2.id AS joinb_id,\n" + + " t2.province,\n" + + " t2.city,\n" + + " t2.area,\n" + + " t2.postcode,\n" + + " t2.del AS joinb_del\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND t2.del = false\n" + + " AND (t.id <= ?)\n" + + "ORDER BY t.id DESC" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> - addr.association(AreaDO::class.java, AddressDTO::area) - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> + addr.association(AreaDO::class.java, AddressDTO::area) + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) assert(list[0].addressList != null && list[0]!!.addressList!![0].id != null) list.forEach(System.out::println) @@ -105,34 +105,34 @@ class LambdaWrapperTest { @Test fun testJoinField() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND (t.id <= ?)\n" + - "ORDER BY t.id DESC" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND (t.id <= ?)\n" + + "ORDER BY t.id DESC" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressIds) { e -> - e.id(AddressDO::id) - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressIds) { e -> + e.id(AddressDO::id) + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) assert(list[0].addressIds != null) list.forEach(System.out::println) @@ -142,46 +142,46 @@ class LambdaWrapperTest { @Test fun testJoin1() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id,\n" + - " t1.user_id,\n" + - " t1.area_id,\n" + - " t1.tel,\n" + - " t1.address,\n" + - " t1.del AS joina_del,\n" + - " t2.id AS joinb_id,\n" + - " t2.province,\n" + - " t2.city,\n" + - " t2.area,\n" + - " t2.postcode,\n" + - " t2.del AS joinb_del\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND t2.del = false\n" + - "ORDER BY t.id DESC" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id,\n" + + " t1.user_id,\n" + + " t1.area_id,\n" + + " t1.tel,\n" + + " t1.address,\n" + + " t1.del AS joina_del,\n" + + " t2.id AS joinb_id,\n" + + " t2.province,\n" + + " t2.city,\n" + + " t2.area,\n" + + " t2.postcode,\n" + + " t2.del AS joinb_del\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND t2.del = false\n" + + "ORDER BY t.id DESC" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> - addr.association(AreaDO::class.java, AddressDTO::area) - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .orderByDesc(UserDO::id) + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> + addr.association(AreaDO::class.java, AddressDTO::area) + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .orderByDesc(UserDO::id) val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) assert(list[0]!!.addressList!![0].id != null) list.forEach(System.out::println) @@ -190,40 +190,41 @@ class LambdaWrapperTest { /** * 基本数据类型测试 */ + @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") @Test fun testWrapper() { ThreadLocalUtils.set( - "SELECT t.id\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND t2.del = false" + "SELECT t.id\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND t2.del = false" ) //基本数据类型 和 String val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .select(UserDO::id) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .select(UserDO::id) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) val list: List = userMapper!!.selectJoinList(Integer::class.java, wrapper) println(list) ThreadLocalUtils.set( - "SELECT t.create_time\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND t2.del = false" + "SELECT t.create_time\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND t2.del = false" ) //java.sql包下的类 val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .select(UserDO::createTime) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .select(UserDO::createTime) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) val list1: List = userMapper.selectJoinList(Timestamp::class.java, wrapper1) println(list1) } @@ -233,30 +234,30 @@ class LambdaWrapperTest { @SuppressWarnings("unchecked") fun testMSCache() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by\n" + - "FROM `user` t\n" + - "WHERE t.id = ?\n" + - " AND t.del = false\n" + - " AND (t.id <= ?)\n" + - "ORDER BY t.id ASC, t.`name` ASC" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by\n" + + "FROM `user` t\n" + + "WHERE t.id = ?\n" + + " AND t.del = false\n" + + " AND (t.id <= ?)\n" + + "ORDER BY t.id ASC, t.`name` ASC" ) val user = UserDO() user.id = 1 val wrapper: KtLambdaWrapper = KtWrappers.query(user) - .selectAll(UserDO::class.java) - .le(UserDO::id, 100) - .orderByAsc(UserDO::id, UserDO::name) + .selectAll(UserDO::class.java) + .le(UserDO::id, 100) + .orderByAsc(UserDO::id, UserDO::name) val list = userMapper!!.selectList(wrapper) list.forEach(System.out::println) } @@ -264,35 +265,35 @@ class LambdaWrapperTest { @Test fun testTableAliasR() { ThreadLocalUtils.set( - "SELECT tt.id,\n" + - " tt.user_id,\n" + - " tt.create_by,\n" + - " tt.update_by,\n" + - " ua.`name` AS userName,\n" + - " ub.`name` AS createName,\n" + - " uc.`name` AS updateName\n" + - "FROM user_dto tt\n" + - " LEFT JOIN `user` ua ON (ua.id = tt.user_id)\n" + - " LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + - " LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + - "WHERE ua.del = false\n" + - " AND ub.del = false\n" + - " AND uc.del = false\n" + - " AND (ua.id <= ? AND ub.id >= ?)" + "SELECT tt.id,\n" + + " tt.user_id,\n" + + " tt.create_by,\n" + + " tt.update_by,\n" + + " ua.`name` AS userName,\n" + + " ub.`name` AS createName,\n" + + " uc.`name` AS updateName\n" + + "FROM user_dto tt\n" + + " LEFT JOIN `user` ua ON (ua.id = tt.user_id)\n" + + " LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + + " LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + + "WHERE ua.del = false\n" + + " AND ub.del = false\n" + + " AND uc.del = false\n" + + " AND (ua.id <= ? AND ub.id >= ?)" ) val wrapper: KtLambdaWrapper = KtWrappers.query("tt", UserDto::class.java) - .selectAll(UserDto::class.java) - .leftJoin(UserDO::class.java, "ua", UserDO::id, UserDto::userId) { ext -> - ext.selectAs(UserDO::name, UserDto::userName) - .le(UserDO::id, 100) - } - .leftJoin(UserDO::class.java, "ub", UserDO::id, UserDto::createBy) { ext -> - ext.selectAs(UserDO::name, UserDto::createName) - .ge(UserDO::id, 0) - } - .leftJoin(UserDO::class.java, "uc", UserDO::id, UserDto::updateBy) { ext -> - ext.selectAs(UserDO::name, UserDto::updateName) - } + .selectAll(UserDto::class.java) + .leftJoin(UserDO::class.java, "ua", UserDO::id, UserDto::userId) { ext -> + ext.selectAs(UserDO::name, UserDto::userName) + .le(UserDO::id, 100) + } + .leftJoin(UserDO::class.java, "ub", UserDO::id, UserDto::createBy) { ext -> + ext.selectAs(UserDO::name, UserDto::createName) + .ge(UserDO::id, 0) + } + .leftJoin(UserDO::class.java, "uc", UserDO::id, UserDto::updateBy) { ext -> + ext.selectAs(UserDO::name, UserDto::updateName) + } val userDtos: List = userDTOMapper!!.selectJoinList(UserDto::class.java, wrapper) assert(StringUtils.isNotBlank(userDtos[0].userName)) assert(StringUtils.isNotBlank(userDtos[0].createName)) @@ -300,41 +301,41 @@ class LambdaWrapperTest { ThreadLocalUtils.set( - "SELECT tt.id,\n" + - " tt.pid,\n" + - " tt.`name`,\n" + - " tt.`json`,\n" + - " tt.sex,\n" + - " tt.head_img,\n" + - " tt.create_time,\n" + - " tt.address_id,\n" + - " tt.address_id2,\n" + - " tt.del,\n" + - " tt.create_by,\n" + - " tt.update_by,\n" + - " ua.id,\n" + - " ub.head_img\n" + - "FROM `user` tt\n" + - " LEFT JOIN `user` ua ON (ua.id = tt.pid)\n" + - " LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + - " LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + - "WHERE tt.del = false\n" + - " AND ua.del = false\n" + - " AND ub.del = false\n" + - " AND uc.del = false\n" + - " AND (ua.head_img = tt.`name` AND tt.id = ua.id)" + "SELECT tt.id,\n" + + " tt.pid,\n" + + " tt.`name`,\n" + + " tt.`json`,\n" + + " tt.sex,\n" + + " tt.head_img,\n" + + " tt.create_time,\n" + + " tt.address_id,\n" + + " tt.address_id2,\n" + + " tt.del,\n" + + " tt.create_by,\n" + + " tt.update_by,\n" + + " ua.id,\n" + + " ub.head_img\n" + + "FROM `user` tt\n" + + " LEFT JOIN `user` ua ON (ua.id = tt.pid)\n" + + " LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + + " LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + + "WHERE tt.del = false\n" + + " AND ua.del = false\n" + + " AND ub.del = false\n" + + " AND uc.del = false\n" + + " AND (ua.head_img = tt.`name` AND tt.id = ua.id)" ) val w: KtLambdaWrapper = KtWrappers.query("tt", UserDO::class.java) - .selectAll(UserDO::class.java) - .leftJoin(UserDO::class.java, "ua", UserDO::id, UserDO::pid) { ext -> - ext.select(UserDO::id) - .eq(UserDO::img, UserDO::name) - } - .leftJoin(UserDO::class.java, "ub", UserDO::id, UserDO::createBy) { ext -> - ext.select(UserDO::img) - } - .leftJoin(UserDO::class.java, "uc", UserDO::id, UserDO::updateBy) - .eq(UserDO::id, UserDO::id) + .selectAll(UserDO::class.java) + .leftJoin(UserDO::class.java, "ua", UserDO::id, UserDO::pid) { ext -> + ext.select(UserDO::id) + .eq(UserDO::img, UserDO::name) + } + .leftJoin(UserDO::class.java, "ub", UserDO::id, UserDO::createBy) { ext -> + ext.select(UserDO::img) + } + .leftJoin(UserDO::class.java, "uc", UserDO::id, UserDO::updateBy) + .eq(UserDO::id, UserDO::id) userMapper!!.selectJoinList(UserDO::class.java, w) println(1) } @@ -345,139 +346,139 @@ class LambdaWrapperTest { @Test fun testInner() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id,\n" + - " t1.pid AS joina_pid,\n" + - " t1.`name` AS joina_name,\n" + - " t1.`json` AS joina_json,\n" + - " t1.sex AS joina_sex,\n" + - " t1.head_img AS joina_head_img,\n" + - " t1.create_time AS joina_create_time,\n" + - " t1.address_id AS joina_address_id,\n" + - " t1.address_id2 AS joina_address_id2,\n" + - " t1.del AS joina_del,\n" + - " t1.create_by AS joina_create_by,\n" + - " t1.update_by AS joina_update_by\n" + - "FROM `user` t\n" + - " LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + - "WHERE t.del = false\n" + - " AND (t.id > ?)" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id,\n" + + " t1.pid AS joina_pid,\n" + + " t1.`name` AS joina_name,\n" + + " t1.`json` AS joina_json,\n" + + " t1.sex AS joina_sex,\n" + + " t1.head_img AS joina_head_img,\n" + + " t1.create_time AS joina_create_time,\n" + + " t1.address_id AS joina_address_id,\n" + + " t1.address_id2 AS joina_address_id2,\n" + + " t1.del AS joina_del,\n" + + " t1.create_by AS joina_create_by,\n" + + " t1.update_by AS joina_update_by\n" + + "FROM `user` t\n" + + " LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + + "WHERE t.del = false\n" + + " AND (t.id > ?)" ) //自连接 val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .disableSubLogicDel()//关闭副表逻辑删除 - .selectAll(UserDO::class.java) - .selectCollection(UserDO::class.java, UserDO::children) - .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) - .gt(UserDO::id, 0) + .disableSubLogicDel()//关闭副表逻辑删除 + .selectAll(UserDO::class.java) + .selectCollection(UserDO::class.java, UserDO::children) + .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) + .gt(UserDO::id, 0) val list: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) println(list) ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.`name` AS createName,\n" + - " t2.`name` AS updateName\n" + - "FROM `user` t\n" + - " LEFT JOIN `user` t1 ON (t1.id = t.create_by)\n" + - " LEFT JOIN `user` t2 ON (t2.id = t.update_by)\n" + - "WHERE (t2.id = t.update_by AND t.id = t1.id)" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.`name` AS createName,\n" + + " t2.`name` AS updateName\n" + + "FROM `user` t\n" + + " LEFT JOIN `user` t1 ON (t1.id = t.create_by)\n" + + " LEFT JOIN `user` t2 ON (t2.id = t.update_by)\n" + + "WHERE (t2.id = t.update_by AND t.id = t1.id)" ) //关联一张表多次 val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .disableLogicDel() - .disableSubLogicDel() - .selectAll(UserDO::class.java) - .leftJoin(UserDO::class.java, UserDO::id, UserDO::createBy) { ext -> - ext.selectAs(UserDO::name, UserDO::createName) - } - .leftJoin(UserDO::class.java) { on, ext -> - on.eq(UserDO::id, UserDO::updateBy) - ext.selectAs(UserDO::name, UserDO::updateName) - .eq(UserDO::id, UserDO::updateBy) - } - .eq(UserDO::id, UserDO::id) + .disableLogicDel() + .disableSubLogicDel() + .selectAll(UserDO::class.java) + .leftJoin(UserDO::class.java, UserDO::id, UserDO::createBy) { ext -> + ext.selectAs(UserDO::name, UserDO::createName) + } + .leftJoin(UserDO::class.java) { on, ext -> + on.eq(UserDO::id, UserDO::updateBy) + ext.selectAs(UserDO::name, UserDO::updateName) + .eq(UserDO::id, UserDO::updateBy) + } + .eq(UserDO::id, UserDO::id) val dos: List = userMapper.selectJoinList(UserDO::class.java, wrapper1) assert(dos[0].createName != null && dos[0].updateName != null) ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.`name` AS alias,\n" + - " t1.id AS joina_id,\n" + - " t1.pid AS joina_pid,\n" + - " t1.`name` AS joina_name,\n" + - " t1.`json` AS joina_json,\n" + - " t1.sex AS joina_sex,\n" + - " t1.head_img AS joina_head_img,\n" + - " t1.create_time AS joina_create_time,\n" + - " t1.address_id AS joina_address_id,\n" + - " t1.address_id2 AS joina_address_id2,\n" + - " t1.del AS joina_del,\n" + - " t1.create_by AS joina_create_by,\n" + - " t1.update_by AS joina_update_by,\n" + - " t2.id AS joinb_id,\n" + - " t2.pid AS joinb_pid,\n" + - " t2.`name` AS joinb_name,\n" + - " t2.`json` AS joinb_json,\n" + - " t2.sex AS joinb_sex,\n" + - " t2.head_img AS joinb_head_img,\n" + - " t2.create_time AS joinb_create_time,\n" + - " t2.address_id AS joinb_address_id,\n" + - " t2.address_id2 AS joinb_address_id2,\n" + - " t2.del AS joinb_del,\n" + - " t2.create_by AS joinb_create_by,\n" + - " t2.update_by AS joinb_update_by\n" + - "FROM `user` t\n" + - " LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + - " LEFT JOIN `user` t2 ON (t2.pid = t1.id)\n" + - "WHERE t.del = false\n" + - " AND (t1.id <= ? AND t.id <= ?)" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.`name` AS alias,\n" + + " t1.id AS joina_id,\n" + + " t1.pid AS joina_pid,\n" + + " t1.`name` AS joina_name,\n" + + " t1.`json` AS joina_json,\n" + + " t1.sex AS joina_sex,\n" + + " t1.head_img AS joina_head_img,\n" + + " t1.create_time AS joina_create_time,\n" + + " t1.address_id AS joina_address_id,\n" + + " t1.address_id2 AS joina_address_id2,\n" + + " t1.del AS joina_del,\n" + + " t1.create_by AS joina_create_by,\n" + + " t1.update_by AS joina_update_by,\n" + + " t2.id AS joinb_id,\n" + + " t2.pid AS joinb_pid,\n" + + " t2.`name` AS joinb_name,\n" + + " t2.`json` AS joinb_json,\n" + + " t2.sex AS joinb_sex,\n" + + " t2.head_img AS joinb_head_img,\n" + + " t2.create_time AS joinb_create_time,\n" + + " t2.address_id AS joinb_address_id,\n" + + " t2.address_id2 AS joinb_address_id2,\n" + + " t2.del AS joinb_del,\n" + + " t2.create_by AS joinb_create_by,\n" + + " t2.update_by AS joinb_update_by\n" + + "FROM `user` t\n" + + " LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + + " LEFT JOIN `user` t2 ON (t2.pid = t1.id)\n" + + "WHERE t.del = false\n" + + " AND (t1.id <= ? AND t.id <= ?)" ) val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .disableSubLogicDel() - .selectAll(UserDO::class.java) - .selectCollection("t1", UserDO::class.java, UserDO::children) { c -> - c.collection("t2", UserDO::class.java, UserDO::children) - } - .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) { ext -> - ext.selectAs(UserDO::name, UserDO::alias) - .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) - .le(UserDO::id, 5) - } - .le(UserDO::id, 4) + .disableSubLogicDel() + .selectAll(UserDO::class.java) + .selectCollection("t1", UserDO::class.java, UserDO::children) { c -> + c.collection("t2", UserDO::class.java, UserDO::children) + } + .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) { ext -> + ext.selectAs(UserDO::name, UserDO::alias) + .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) + .le(UserDO::id, 5) + } + .le(UserDO::id, 4) val list1: List = userMapper.selectJoinList(UserDO::class.java, wrapper2) println(list1) } @@ -491,7 +492,7 @@ class LambdaWrapperTest { assert(l1.size == 14) val l2: List = userMapper.selectJoinList( - UserDTO::class.java, KtWrappers.query(UserDO::class.java) + UserDTO::class.java, KtWrappers.query(UserDO::class.java) .selectAll(UserDO::class.java) .select(AddressDO::address) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) @@ -499,7 +500,7 @@ class LambdaWrapperTest { assert(l2.size == 10) val l3: List = userMapper.selectJoinList( - UserDTO::class.java, KtWrappers.query(UserDO::class.java) + UserDTO::class.java, KtWrappers.query(UserDO::class.java) .disableSubLogicDel() .selectAll(UserDO::class.java) .selectCollection(AddressDO::class.java, UserDTO::addressList) @@ -508,15 +509,15 @@ class LambdaWrapperTest { assert(l3.size == 14 && l3[0].addressList!!.size == 9) val l4: List = userMapper.selectJoinList( - UserDTO::class.java, - KtWrappers.query(UserDO::class.java) - .disableSubLogicDel() - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressList) - .leftJoin(AddressDO::class.java) { on -> - on.eq(AddressDO::userId, UserDO::id) - .eq(AddressDO::del, false) - } + UserDTO::class.java, + KtWrappers.query(UserDO::class.java) + .disableSubLogicDel() + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressList) + .leftJoin(AddressDO::class.java) { on -> + on.eq(AddressDO::userId, UserDO::id) + .eq(AddressDO::del, false) + } ) assert(l4.size == 14 && l4[0].addressList!!.size == 5) } @@ -528,9 +529,9 @@ class LambdaWrapperTest { @Test fun testAlias() { val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectCollection(UserDO::class.java, UserDO::children) - .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) + .selectAll(UserDO::class.java) + .selectCollection(UserDO::class.java, UserDO::children) + .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) val list: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) assert(list[0].name != null && list[0].children!![0].name != null) assert(list[0].img != null && list[0].children!![0].img != null) @@ -540,33 +541,33 @@ class LambdaWrapperTest { @Test fun testTableAlias() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " aa.id,\n" + - " aa.user_id,\n" + - " aa.area_id,\n" + - " aa.tel,\n" + - " aa.address,\n" + - " aa.del\n" + - "FROM `user` t\n" + - " LEFT JOIN address aa ON (aa.user_id = t.id)\n" + - "WHERE t.del = false\n" + - " AND aa.del = false" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " aa.id,\n" + + " aa.user_id,\n" + + " aa.area_id,\n" + + " aa.tel,\n" + + " aa.address,\n" + + " aa.del\n" + + "FROM `user` t\n" + + " LEFT JOIN address aa ON (aa.user_id = t.id)\n" + + "WHERE t.del = false\n" + + " AND aa.del = false" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectAll(AddressDO::class.java, "aa") - .leftJoin(AddressDO::class.java, "aa", AddressDO::userId, UserDO::id) + .selectAll(UserDO::class.java) + .selectAll(AddressDO::class.java, "aa") + .leftJoin(AddressDO::class.java, "aa", AddressDO::userId, UserDO::id) val list: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) println(list) } @@ -574,12 +575,12 @@ class LambdaWrapperTest { @Test fun testLabel() { val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .disableSubLogicDel() - .selectAll(UserDO::class.java) - .selectCollection("t1", AddressDO::class.java, UserDO::addressList) - .selectCollection("t2", AddressDO::class.java, UserDO::addressList2) - .leftJoin(AddressDO::class.java, AddressDO::id, UserDO::addressId) - .leftJoin(AddressDO::class.java, AddressDO::id, UserDO::addressId2) + .disableSubLogicDel() + .selectAll(UserDO::class.java) + .selectCollection("t1", AddressDO::class.java, UserDO::addressList) + .selectCollection("t2", AddressDO::class.java, UserDO::addressList2) + .leftJoin(AddressDO::class.java, AddressDO::id, UserDO::addressId) + .leftJoin(AddressDO::class.java, AddressDO::id, UserDO::addressId2) val list: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) assert(list[0].addressList!![0].address != null) @@ -596,15 +597,15 @@ class LambdaWrapperTest { val page: Page = Page(1, 10) page.setSearchCount(false) val iPage: IPage = userMapper!!.selectJoinPage( - page, UserDTO::class.java, - KtWrappers.query(UserDO::class.java) - .selectAll( - UserDO::class.java - ) - .select(AddressDO::address) - .select(AreaDO::province) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + page, UserDTO::class.java, + KtWrappers.query(UserDO::class.java) + .selectAll( + UserDO::class.java + ) + .select(AddressDO::address) + .select(AreaDO::province) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) ) iPage.records.forEach(System.out::println) } @@ -616,42 +617,42 @@ class LambdaWrapperTest { @Test fun test3() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.address\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)\n" + - "WHERE t.del = false\n" + - " AND t1.del = false\n" + - " AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)\n" + - "LIMIT ?" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.address\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)\n" + + "WHERE t.del = false\n" + + " AND t1.del = false\n" + + " AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)\n" + + "LIMIT ?" ) val page: IPage = userMapper!!.selectJoinPage( - Page(1, 10), UserDTO::class.java, - KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .select(AddressDO::address) - .leftJoin(AddressDO::class.java) { on -> - on.eq(UserDO::id, AddressDO::userId) - .eq(UserDO::id, AddressDO::userId) - } - .eq(UserDO::id, 1) - .and { i -> - i.eq(UserDO::img, "er") - .or() - .eq(AddressDO::userId, 1) - } - .eq(UserDO::id, 1) + Page(1, 10), UserDTO::class.java, + KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .select(AddressDO::address) + .leftJoin(AddressDO::class.java) { on -> + on.eq(UserDO::id, AddressDO::userId) + .eq(UserDO::id, AddressDO::userId) + } + .eq(UserDO::id, 1) + .and { i -> + i.eq(UserDO::img, "er") + .or() + .eq(AddressDO::userId, 1) + } + .eq(UserDO::id, 1) ) page.records.forEach(System.out::println) } @@ -662,7 +663,7 @@ class LambdaWrapperTest { @Test fun test4() { val one: UserDTO = userMapper!!.selectJoinOne( - UserDTO::class.java, KtWrappers.query(UserDO::class.java) + UserDTO::class.java, KtWrappers.query(UserDO::class.java) .selectSum(UserDO::id) .selectMax(UserDO::id, UserDTO::headImg) .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) @@ -677,10 +678,10 @@ class LambdaWrapperTest { @Test fun test6() { val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .selectFilter(AddressDO::class.java) { true } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .eq(UserDO::id, 1) + .selectAll(UserDO::class.java) + .selectFilter(AddressDO::class.java) { true } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .eq(UserDO::id, 1) val page: IPage = userMapper!!.selectJoinPage(Page(1, 10), UserDTO::class.java, wrapper) assert(page.records[0].address != null) page.records.forEach(System.out::println) @@ -693,8 +694,8 @@ class LambdaWrapperTest { fun test8() { ThreadLocalUtils.set("SELECT t.`name` FROM `user` t WHERE t.del=false AND (t.`name` = ?)") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .select(UserDO::name) - .eq(UserDO::name, "ref") + .select(UserDO::name) + .eq(UserDO::name, "ref") userMapper!!.selectList(wrapper) try { userMapper.insertBatchSomeColumn(ArrayList()) @@ -709,10 +710,10 @@ class LambdaWrapperTest { @Test fun test7() { val list: List> = userMapper!!.selectJoinMaps( - KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .select(AddressDO::address) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .select(AddressDO::address) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) ) assert(list[0]["ADDRESS"] != null || list[0]["address"] != null) list.forEach(System.out::println) @@ -724,20 +725,20 @@ class LambdaWrapperTest { @Test fun testMP() { val dos: MutableList? = userMapper!!.selectList( - KtWrappers.query(UserDO::class.java) - .gt(UserDO::id, 3) - .lt(UserDO::id, 8) + KtWrappers.query(UserDO::class.java) + .gt(UserDO::id, 3) + .lt(UserDO::id, 8) ) assert(dos!!.size == 4) ThreadLocalUtils.set( - "SELECT id,pid,`name`,`json`,sex,head_img,create_time,address_id,address_id2,del,create_by,update_by FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?)", - "SELECT * FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?) " + "SELECT id,pid,`name`,`json`,sex,head_img,create_time,address_id,address_id2,del,create_by,update_by FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?)", + "SELECT * FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?) " ) val dos1: MutableList? = userMapper.selectList( - KtWrappers.query(UserDO::class.java) - .gt(UserDO::id, 3) - .lt(UserDO::id, 8) + KtWrappers.query(UserDO::class.java) + .gt(UserDO::id, 3) + .lt(UserDO::id, 8) ) assert(dos1!!.size == 4) } @@ -749,14 +750,14 @@ class LambdaWrapperTest { fun testFunc() { ThreadLocalUtils.set("SELECT if(t1.user_id < 5,t1.user_id,t1.user_id + 100) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectFunc( - "if(%s < 5,%s,%s + 100)", - { arg -> arg.accept(AddressDO::userId, AddressDO::userId, AddressDO::userId) }, UserDO::id - ) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .selectFunc( + "if(%s < 5,%s,%s + 100)", + { arg -> arg.accept(AddressDO::userId, AddressDO::userId, AddressDO::userId) }, UserDO::id + ) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) try { - val dos: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) + userMapper!!.selectJoinList(UserDO::class.java, wrapper) } catch (_: BadSqlGrammarException) { } } @@ -767,15 +768,15 @@ class LambdaWrapperTest { @Test fun testGeneric() { val wrapper: KtLambdaWrapper = KtWrappers.query(AddressDO::class.java) - .selectAll(AddressDO::class.java) - .le(AddressDO::id, 10000) - .orderByDesc(AddressDO::id) + .selectAll(AddressDO::class.java) + .le(AddressDO::id, 10000) + .orderByDesc(AddressDO::id) val list: List = addressMapper!!.selectJoinList(AddressDTO::class.java, wrapper) assert( - Objects.equals( - "[AddressDTO(id=22, userId=22, areaId=10022, tel=10000000022, address=朝阳22, del=false, areaList=null, area=null), AddressDTO(id=21, userId=21, areaId=10021, tel=10000000021, address=朝阳21, del=false, areaList=null, area=null), AddressDTO(id=20, userId=20, areaId=10020, tel=10000000020, address=朝阳20, del=false, areaList=null, area=null), AddressDTO(id=19, userId=19, areaId=10019, tel=10000000019, address=朝阳19, del=false, areaList=null, area=null), AddressDTO(id=18, userId=18, areaId=10018, tel=10000000018, address=朝阳18, del=false, areaList=null, area=null), AddressDTO(id=17, userId=17, areaId=10017, tel=10000000017, address=朝阳17, del=false, areaList=null, area=null), AddressDTO(id=16, userId=16, areaId=10016, tel=10000000016, address=朝阳16, del=false, areaList=null, area=null), AddressDTO(id=15, userId=15, areaId=10015, tel=10000000015, address=朝阳15, del=false, areaList=null, area=null), AddressDTO(id=14, userId=14, areaId=10014, tel=10000000014, address=朝阳14, del=false, areaList=null, area=null), AddressDTO(id=13, userId=13, areaId=10013, tel=10000000013, address=朝阳13, del=false, areaList=null, area=null), AddressDTO(id=12, userId=12, areaId=10012, tel=10000000012, address=朝阳12, del=false, areaList=null, area=null), AddressDTO(id=11, userId=11, areaId=10011, tel=10000000011, address=朝阳11, del=false, areaList=null, area=null), AddressDTO(id=10, userId=10, areaId=10010, tel=10000000010, address=朝阳10, del=false, areaList=null, area=null), AddressDTO(id=5, userId=1, areaId=10005, tel=10000000005, address=朝阳05, del=false, areaList=null, area=null), AddressDTO(id=4, userId=1, areaId=10004, tel=10000000004, address=朝阳04, del=false, areaList=null, area=null), AddressDTO(id=3, userId=1, areaId=10003, tel=10000000003, address=朝阳03, del=false, areaList=null, area=null), AddressDTO(id=2, userId=1, areaId=10002, tel=10000000002, address=朝阳02, del=false, areaList=null, area=null), AddressDTO(id=1, userId=1, areaId=10001, tel=10000000001, address=朝阳01, del=false, areaList=null, area=null)]", - list.toString() - ) + Objects.equals( + "[AddressDTO(id=22, userId=22, areaId=10022, tel=10000000022, address=朝阳22, del=false, areaList=null, area=null), AddressDTO(id=21, userId=21, areaId=10021, tel=10000000021, address=朝阳21, del=false, areaList=null, area=null), AddressDTO(id=20, userId=20, areaId=10020, tel=10000000020, address=朝阳20, del=false, areaList=null, area=null), AddressDTO(id=19, userId=19, areaId=10019, tel=10000000019, address=朝阳19, del=false, areaList=null, area=null), AddressDTO(id=18, userId=18, areaId=10018, tel=10000000018, address=朝阳18, del=false, areaList=null, area=null), AddressDTO(id=17, userId=17, areaId=10017, tel=10000000017, address=朝阳17, del=false, areaList=null, area=null), AddressDTO(id=16, userId=16, areaId=10016, tel=10000000016, address=朝阳16, del=false, areaList=null, area=null), AddressDTO(id=15, userId=15, areaId=10015, tel=10000000015, address=朝阳15, del=false, areaList=null, area=null), AddressDTO(id=14, userId=14, areaId=10014, tel=10000000014, address=朝阳14, del=false, areaList=null, area=null), AddressDTO(id=13, userId=13, areaId=10013, tel=10000000013, address=朝阳13, del=false, areaList=null, area=null), AddressDTO(id=12, userId=12, areaId=10012, tel=10000000012, address=朝阳12, del=false, areaList=null, area=null), AddressDTO(id=11, userId=11, areaId=10011, tel=10000000011, address=朝阳11, del=false, areaList=null, area=null), AddressDTO(id=10, userId=10, areaId=10010, tel=10000000010, address=朝阳10, del=false, areaList=null, area=null), AddressDTO(id=5, userId=1, areaId=10005, tel=10000000005, address=朝阳05, del=false, areaList=null, area=null), AddressDTO(id=4, userId=1, areaId=10004, tel=10000000004, address=朝阳04, del=false, areaList=null, area=null), AddressDTO(id=3, userId=1, areaId=10003, tel=10000000003, address=朝阳03, del=false, areaList=null, area=null), AddressDTO(id=2, userId=1, areaId=10002, tel=10000000002, address=朝阳02, del=false, areaList=null, area=null), AddressDTO(id=1, userId=1, areaId=10001, tel=10000000001, address=朝阳01, del=false, areaList=null, area=null)]", + list.toString() + ) ) } @@ -785,20 +786,20 @@ class LambdaWrapperTest { @Test fun testCount() { ThreadLocalUtils.set( - "SELECT COUNT( 1 ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false", - "SELECT COUNT( * ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false", - "SELECT COUNT( * ) AS total FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false" + "SELECT COUNT( 1 ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false", + "SELECT COUNT( * ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false", + "SELECT COUNT( * ) AS total FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - val integer: Long = userMapper!!.selectCount(wrapper) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + userMapper!!.selectCount(wrapper) ThreadLocalUtils.set("SELECT COUNT( * ) FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false") val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - val aLong1: Long = userMapper.selectJoinCount(wrapper1) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + userMapper.selectJoinCount(wrapper1) } @@ -809,17 +810,17 @@ class LambdaWrapperTest { fun testTable() { ThreadLocalUtils.set("SELECT t.id FROM `user`bbbbbbb t LEFT JOIN addressaaaaaaaaaa t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false AND (t.id <= ?) ORDER BY t.id DESC") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .select(UserDO::id) - .leftJoin(AddressDO::class.java) { on -> - on.eq(AddressDO::userId, UserDO::id) - .setTableName { name -> name + "aaaaaaaaaa" } - } - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) - .setTableName { name -> name + "bbbbbbb" } + .select(UserDO::id) + .leftJoin(AddressDO::class.java) { on -> + on.eq(AddressDO::userId, UserDO::id) + .setTableName { name -> name + "aaaaaaaaaa" } + } + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) + .setTableName { name -> name + "bbbbbbb" } try { - val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) + userMapper!!.selectJoinList(UserDTO::class.java, wrapper) } catch (_: BadSqlGrammarException) { } } @@ -831,47 +832,47 @@ class LambdaWrapperTest { @Test fun logicDelType() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id,\n" + - " t1.user_id,\n" + - " t1.area_id,\n" + - " t1.tel,\n" + - " t1.address,\n" + - " t1.del AS joina_del,\n" + - " t2.id AS joinb_id,\n" + - " t2.province,\n" + - " t2.city,\n" + - " t2.area,\n" + - " t2.postcode,\n" + - " t2.del AS joinb_del\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + - "WHERE t.del = false\n" + - " AND (t.id <= ?)\n" + - "ORDER BY t.id DESC\n" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id,\n" + + " t1.user_id,\n" + + " t1.area_id,\n" + + " t1.tel,\n" + + " t1.address,\n" + + " t1.del AS joina_del,\n" + + " t2.id AS joinb_id,\n" + + " t2.province,\n" + + " t2.city,\n" + + " t2.area,\n" + + " t2.postcode,\n" + + " t2.del AS joinb_del\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + + "WHERE t.del = false\n" + + " AND (t.id <= ?)\n" + + "ORDER BY t.id DESC\n" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .logicDelToOn() - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> - addr.association(AreaDO::class.java, AddressDTO::area) - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) + .logicDelToOn() + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> + addr.association(AreaDO::class.java, AddressDTO::area) + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) println(wrapper.from) val list = userMapper!!.selectJoinList(UserDTO::class.java, wrapper) @@ -885,47 +886,47 @@ class LambdaWrapperTest { @Test fun joinWrapper() { ThreadLocalUtils.set( - "SELECT t.id,\n" + - " t.pid,\n" + - " t.`name`,\n" + - " t.`json`,\n" + - " t.sex,\n" + - " t.head_img,\n" + - " t.create_time,\n" + - " t.address_id,\n" + - " t.address_id2,\n" + - " t.del,\n" + - " t.create_by,\n" + - " t.update_by,\n" + - " t1.id AS joina_id,\n" + - " t1.user_id,\n" + - " t1.area_id,\n" + - " t1.tel,\n" + - " t1.address,\n" + - " t1.del AS joina_del,\n" + - " t2.id AS joinb_id,\n" + - " t2.province,\n" + - " t2.city,\n" + - " t2.area,\n" + - " t2.postcode,\n" + - " t2.del AS joinb_del\n" + - "FROM `user` t\n" + - " LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + - " LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + - "WHERE t.del = false\n" + - " AND (t.id <= ?)\n" + - "ORDER BY t.id DESC\n" + "SELECT t.id,\n" + + " t.pid,\n" + + " t.`name`,\n" + + " t.`json`,\n" + + " t.sex,\n" + + " t.head_img,\n" + + " t.create_time,\n" + + " t.address_id,\n" + + " t.address_id2,\n" + + " t.del,\n" + + " t.create_by,\n" + + " t.update_by,\n" + + " t1.id AS joina_id,\n" + + " t1.user_id,\n" + + " t1.area_id,\n" + + " t1.tel,\n" + + " t1.address,\n" + + " t1.del AS joina_del,\n" + + " t2.id AS joinb_id,\n" + + " t2.province,\n" + + " t2.city,\n" + + " t2.area,\n" + + " t2.postcode,\n" + + " t2.del AS joinb_del\n" + + "FROM `user` t\n" + + " LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + + " LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + + "WHERE t.del = false\n" + + " AND (t.id <= ?)\n" + + "ORDER BY t.id DESC\n" ) val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .logicDelToOn() - .selectAll(UserDO::class.java) - .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> - addr.association(AreaDO::class.java, AddressDTO::area) - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) + .logicDelToOn() + .selectAll(UserDO::class.java) + .selectCollection(AddressDO::class.java, UserDTO::addressList) { addr -> + addr.association(AreaDO::class.java, AddressDTO::area) + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) val list = wrapper.list(UserDTO::class.java) @@ -937,20 +938,20 @@ class LambdaWrapperTest { @Test fun joinRandomMap() { val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .logicDelToOn() - .selectAll(UserDO::class.java) - .selectCollection(UserDTO::addressList) { addr -> - addr.id(AddressDO::id, AddressDTO::id) - .result(UserDO::name, AddressDTO::address) - .collection(AddressDTO::areaList) { map -> - map.id(AreaDO::id) - .result(AreaDO::area, AreaDO::area) - } - } - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .le(UserDO::id, 10000) - .orderByDesc(UserDO::id) + .logicDelToOn() + .selectAll(UserDO::class.java) + .selectCollection(UserDTO::addressList) { addr -> + addr.id(AddressDO::id, AddressDTO::id) + .result(UserDO::name, AddressDTO::address) + .collection(AddressDTO::areaList) { map -> + map.id(AreaDO::id) + .result(AreaDO::area, AreaDO::area) + } + } + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .le(UserDO::id, 10000) + .orderByDesc(UserDO::id) val list: MutableList = wrapper.list(UserDTO::class.java) println(list) @@ -962,11 +963,11 @@ class LambdaWrapperTest { fun joinRandomMap111() { ThreadLocalUtils.set("SELECT t.id,t.user_id,t.area_id,t.tel,t.address,t.del FROM address t LEFT JOIN `user` t1 ON (t1.address_id = t.id) LEFT JOIN `user` t2 ON (t2.pid = t1.id) WHERE t.del=false AND t1.del=false AND t2.del=false") val wrapper: KtLambdaWrapper = KtWrappers.query(AddressDO::class.java) - .selectAll(AddressDO::class.java) - .leftJoin(UserDO::class.java, UserDO::addressId, AddressDO::id) - .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) + .selectAll(AddressDO::class.java) + .leftJoin(UserDO::class.java, UserDO::addressId, AddressDO::id) + .leftJoin(UserDO::class.java, UserDO::pid, UserDO::id) - val addressDOS: List = wrapper.list() + wrapper.list() } /** @@ -976,11 +977,11 @@ class LambdaWrapperTest { fun joinOwn() { ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t1.id = t1.id)") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .eq(AddressDO::id, AddressDO::id) + .selectAll(UserDO::class.java) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .eq(AddressDO::id, AddressDO::id) - val addressDOS: List = wrapper.list() + wrapper.list() } /** @@ -990,12 +991,12 @@ class LambdaWrapperTest { fun joinOwn1() { ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t LEFT JOIN address aaa ON (aaa.user_id = t.id) WHERE t.del=false AND aaa.del=false AND (aaa.id = t.id AND aaa.id = aaa.id)") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .leftJoin(AddressDO::class.java, "aaa", AddressDO::userId, UserDO::id) { ext -> - ext.eq(AddressDO::id, AddressDO::id) - } - .eq(AddressDO::id, AddressDO::id) - val addressDOS: List = wrapper.list() + .selectAll(UserDO::class.java) + .leftJoin(AddressDO::class.java, "aaa", AddressDO::userId, UserDO::id) { ext -> + ext.eq(AddressDO::id, AddressDO::id) + } + .eq(AddressDO::id, AddressDO::id) + wrapper.list() } /** @@ -1004,22 +1005,22 @@ class LambdaWrapperTest { @Test fun joinOrder() { ThreadLocalUtils.set( - "SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", - "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc" + "SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", + "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc" ) val wrapper: KtLambdaWrapper = KtWrappers.query(OrderDO::class.java) - val list: List = wrapper.list() + wrapper.list() ThreadLocalUtils.set( - "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC", - "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc" + "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC", + "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc" ) val w: KtLambdaWrapper = KtWrappers.query(OrderDO::class.java) - .selectAll(OrderDO::class.java) - .selectAs(UserDO::name, OrderDO::userName) - .leftJoin(UserDO::class.java, UserDO::id, OrderDO::userId) + .selectAll(OrderDO::class.java) + .selectAs(UserDO::name, OrderDO::userName) + .leftJoin(UserDO::class.java, UserDO::id, OrderDO::userId) println(wrapper.from) - val l: List = w.list() + w.list() } /** @@ -1030,8 +1031,8 @@ class LambdaWrapperTest { //物理删除 ThreadLocalUtils.set("DELETE t FROM order_t t LEFT JOIN user_dto t1 ON (t1.id = t.user_id) WHERE (t.id = ?)") val w: KtDeleteJoinWrapper = KtWrappers.delete(OrderDO::class.java) - .leftJoin(UserDto::class.java, UserDto::id, OrderDO::userId) - .eq(OrderDO::id, 1) + .leftJoin(UserDto::class.java, UserDto::id, OrderDO::userId) + .eq(OrderDO::id, 1) try { orderMapper!!.deleteJoin(w) } catch (_: BadSqlGrammarException) { @@ -1040,10 +1041,10 @@ class LambdaWrapperTest { //逻辑删除 ThreadLocalUtils.set("UPDATE `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) SET t.del=true ,t1.del=true,t2.del=true WHERE t.del=false AND t1.del=false AND t2.del=false AND (t.id = ?)") val wrapper: KtDeleteJoinWrapper = KtWrappers.delete(UserDO::class.java) - .deleteAll() - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) - .eq(OrderDO::id, 1) + .deleteAll() + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .leftJoin(AreaDO::class.java, AreaDO::id, AddressDO::areaId) + .eq(OrderDO::id, 1) try { userMapper!!.deleteJoin(wrapper) } catch (_: BadSqlGrammarException) { @@ -1068,14 +1069,14 @@ class LambdaWrapperTest { ThreadLocalUtils.set("UPDATE `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) SET t.update_by=?, t.`name`=?,t1.address=?,t1.tel=?,t1.address=?,t.`name`=?,t.update_by=?,t1.user_id=?,t1.area_id=?,t1.tel=?,t1.address=? WHERE t.del=false AND t1.del=false AND (t.id = ?)") val update: KtUpdateJoinWrapper = KtWrappers.update(UserDO::class.java) - .set(UserDO::name, "aaaaaa") - .set(AddressDO::address, "bbbbb") - .setUpdateEntity(address, user) - .setUpdateEntityAndNull(address1) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .eq(OrderDO::id, 1) + .set(UserDO::name, "aaaaaa") + .set(AddressDO::address, "bbbbb") + .setUpdateEntity(address, user) + .setUpdateEntityAndNull(address1) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .eq(OrderDO::id, 1) try { - val join = userMapper!!.updateJoin(user1, update) + userMapper!!.updateJoin(user1, update) } catch (_: BadSqlGrammarException) { //忽略异常 h2不支持连表删除 } @@ -1083,8 +1084,8 @@ class LambdaWrapperTest { ThreadLocalUtils.set("UPDATE `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) SET t.pid=?, t.`name`=?, t.`json`=?, t.sex=?, t.head_img=?, t.create_time=?, t.address_id=?, t.address_id2=?, t.create_by=?, t.update_by=? WHERE t.del=false AND t1.del=false AND (t.id = ?)") val update1: KtUpdateJoinWrapper = KtWrappers.update(UserDO::class.java) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .eq(OrderDO::id, 1) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .eq(OrderDO::id, 1) try { userMapper!!.updateJoinAndNull(UserDO(), update1) } catch (_: BadSqlGrammarException) { @@ -1099,27 +1100,38 @@ class LambdaWrapperTest { fun sub() { ThreadLocalUtils.set("SELECT ( SELECT st.id FROM `user` st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectSub( - UserDO::class.java, { w -> + .selectSub( + UserDO::class.java, { w -> w.select(UserDO::id) - .eq(UserDO::id, UserDO::id) - .last("limit 1") + .eq(UserDO::id, UserDO::id) + .last("limit 1") }, UserDO::id - ) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 100) + ) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 100) wrapper.list() - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") + ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectSub(AddressDO::class.java, { w -> - w.select(AddressDO::id) - .eq(AddressDO::id, UserDO::id) - .last("limit 1") - }, UserDO::id) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 100) + .selectSub(AreaDO::class.java, { w -> + w.select(AreaDO::id) + .eq(AreaDO::id, AddressDO::id) + .last("limit 1") + }, UserDO::id) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 100) wrapper1.list() + + ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") + val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectSub(AddressDO::class.java, { w -> + w.select(AddressDO::id) + .eq(AddressDO::id, AddressDO::id) + .last("limit 1") + }, UserDO::id) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 100) + wrapper2.list() } @@ -1129,14 +1141,14 @@ class LambdaWrapperTest { @Test fun union() { val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::id, 1) + .selectAll(UserDO::class.java) + .eq(UserDO::id, 1) val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::name, "张三 2") + .selectAll(UserDO::class.java) + .eq(UserDO::name, "张三 2") val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::pid, 2) + .selectAll(UserDO::class.java) + .eq(UserDO::pid, 2) wrapper.union(wrapper1, wrapper2) val list = wrapper.list() From c60e89ea7991803847c37ab837474b7e61ef53f9 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 23 Oct 2023 00:28:13 +0800 Subject: [PATCH 02/88] =?UTF-8?q?fix=20select=E5=AD=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MAPPING.md | 113 ----------------------------------------------------- README.md | 6 +-- 2 files changed, 3 insertions(+), 116 deletions(-) delete mode 100644 MAPPING.md diff --git a/MAPPING.md b/MAPPING.md deleted file mode 100644 index c3cb4b1..0000000 --- a/MAPPING.md +++ /dev/null @@ -1,113 +0,0 @@ -# mybatis-plus-join - -#### @EntityMapping 和 @FieldMapping 注解 - -UserDO.java - -```java - -@Data -@TableName("user") -public class UserDO { - - @TableId - private Integer id; - private Integer pid;//父id - /* 其他属性略 */ - - /** - * 查询上级 一对一 - */ - @TableField(exist = false) - @EntityMapping(thisField = "pid", joinField = "id") - private UserDO pUser; - - /** - * 查询下级 一对多 - */ - @TableField(exist = false) - @EntityMapping(thisField = "id", joinField = "pid") - private List childUser; - - /** - * 带条件的查询下级 一对多 - */ - @TableField(exist = false) - @EntityMapping(thisField = "id", joinField = "pid", - condition = { - @MPJMappingCondition(column = "sex", value = "0"),//sex = '0' 默认条件是等于 - @MPJMappingCondition(column = "name", value = "张三", keyWord = SqlKeyword.LIKE)//name like '%a%' - }, - apply = @MPJMappingApply(value = "id between 1 and 20"))//拼接sql 同 wrapper.apply() - private List childUserCondition; - - /** - * 查询地址 (一对多) - */ - @TableField(exist = false) - @EntityMapping(thisField = "id", joinField = "userId") - private List addressList; - - /** - * 绑定字段 (一对多) - */ - @TableField(exist = false) - @FieldMapping(tag = UserDO.class, thisField = "id", joinField = "pid", select = "id") - private List childIds; -} -``` - -使用 - -```java -/** - * 一对一,一对多关系映射查询 - * 如果不需要关系映射就使用mybatis plus原生方法即可,比如 getById listByIds 等 - *

- * 注意:关系映射不会去关联查询,而是执行多次单表查询(对结果汇总后使用in语句查询,再对结果进行匹配) - */ -@SpringBootTest -class MappingTest { - @Resource - private UserMapper userMapper; - - @Test - void test1() { - UserDO deep = userMapper.selectByIdDeep(2); - System.out.println(deep); - } - - @Test - void test2() { - List list = userMapper.selectRelation(mapper -> mapper.selectList(Wrappers.emptyWrapper())); - list.forEach(System.out::println); - } - - @Test - void test3() { - Page page = new Page<>(2, 2); - Page result = userMapper.selectRelation(mapper -> mapper.selectPage(page, Wrappers.emptyWrapper())); - result.getRecords().forEach(System.out::println); - } - - /* - 更多方法请查阅 MPJDeepMapper 或者 MPJDeepService - 使用方式与 mybatis plus 一致 - */ -} -``` - -MPJMapping 说明: - -* @EntityMapping / @FieldMapping tag 关联实体类 -* @EntityMapping / @FieldMapping thisField 当前类关联对应的字段的属性名,可以不填,默认为当前类的主键 -* @EntityMapping / @FieldMapping joinField 关联类对应的字段的属性名,可以不填,默认为关联类的主键 -* @EntityMapping / @FieldMapping isThrowExp 一对一查询时,如果查询到多条记录是否抛出异常,true:抛出异常,false:获取列表第一条数据 -* - -更多功能请看代码注释 [EntityMapping](https://gitee.com/best_handsome/mybatis-plus-join/blob/master/src/main/java/com/github/yulichang/annotation/EntityMapping.java) -[FieldMapping](https://gitee.com/best_handsome/mybatis-plus-join/blob/master/src/main/java/com/github/yulichang/annotation/FieldMapping.java) - - - - diff --git a/README.md b/README.md index 0c401cc..3eae84e 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ code style

-

mybatis-plus-join

+

MyBatis-Plus-Join

-对 mybatis-plus 多表查询的扩展 | +对 MyBatis-Plus 多表查询的扩展 | 演示工程 | 使用文档 | 点个Star支持一下吧 (☆▽☆) @@ -59,7 +59,7 @@ QQ群:1022221898 或者 ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
- 注意: mybatis plus version >= 3.3.0 + 注意: MyBatis Plus版本需要3.3.0+
### 使用 From 1ce8f68f299e00af6cc8ed41675298aa2d72eea4 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 23 Oct 2023 15:20:49 +0800 Subject: [PATCH 03/88] =?UTF-8?q?MP=E5=8D=87=E7=BA=A73.5.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis-plus-join-adapter-base/pom.xml | 8 +++- .../adapter/base/ITableInfoAdapter.java | 32 +++++++++++++--- .../adapter/base/metadata/OrderFieldInfo.java | 35 +++++++++++++++++ .../adapter/base/tookit}/VersionUtils.java | 2 +- .../adapter/v33x/TableInfoAdapterV33x.java | 13 ++++++- .../adapter/v3431/TableInfoAdapter3431.java | 25 ++++++++++++ mybatis-plus-join-boot-starter/pom.xml | 2 +- mybatis-plus-join-core/pom.xml | 2 +- .../yulichang/adapter/AdapterHelper.java | 12 ++++-- .../yulichang/adapter/TableInfoAdapter.java | 35 ----------------- .../yulichang/injector/MPJSqlInjector.java | 4 +- .../yulichang/interceptor/MPJInterceptor.java | 11 +++--- .../yulichang/method/MPJBaseMethod.java | 15 +++----- .../github/yulichang/toolkit/LambdaUtils.java | 6 ++- .../yulichang/toolkit/ReflectionKit.java | 33 +++++----------- .../toolkit/support/IdeaProxyLambdaMeta.java | 38 ++++--------------- .../toolkit/support/ReflectLambdaMeta.java | 36 +++--------------- mybatis-plus-join-extension/pom.xml | 2 +- .../mapping/mapper/MPJTableFieldInfo.java | 25 +++++++----- .../test/join/LambdaWrapperTest.java | 20 ++++++++-- 20 files changed, 190 insertions(+), 166 deletions(-) create mode 100644 mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java rename {mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit => mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit}/VersionUtils.java (96%) create mode 100644 mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index 07ecad3..c685062 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -46,7 +46,13 @@ com.baomidou mybatis-plus-extension - 3.5.3.2 + 3.5.4 + provided + + + org.projectlombok + lombok + 1.18.28 provided diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java index 1614f55..6a8e90d 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java @@ -2,10 +2,13 @@ package com.github.yulichang.adapter.base; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.github.yulichang.adapter.base.metadata.OrderFieldInfo; import org.apache.ibatis.session.Configuration; import java.lang.reflect.Field; +import java.util.List; import java.util.function.Supplier; +import java.util.stream.Collectors; /** * @author yulichang @@ -13,15 +16,32 @@ import java.util.function.Supplier; */ public interface ITableInfoAdapter { - boolean mpjHasLogic(TableInfo tableInfo); + default boolean mpjHasLogic(TableInfo tableInfo) { + return tableInfo.isWithLogicDelete(); + } - boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo); + default boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo) { + return tableFieldInfo.isPrimitive(); + } - TableFieldInfo mpjGetLogicField(TableInfo tableInfo); + default TableFieldInfo mpjGetLogicField(TableInfo tableInfo) { + return tableInfo.getLogicDeleteFieldInfo(); + } - boolean mpjHasPK(TableInfo tableInfo); + default boolean mpjHasPK(TableInfo tableInfo) { + return tableInfo.havePK(); + } - Configuration mpjGetConfiguration(TableInfo tableInfo); + default Configuration mpjGetConfiguration(TableInfo tableInfo) { + return tableInfo.getConfiguration(); + } - Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier); + default Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) { + return fieldInfo.getField(); + } + + default List mpjGetOrderField(TableInfo tableInfo) { + return tableInfo.getOrderByFields().stream().map(f -> + new OrderFieldInfo(f.getColumn(), f.getType(), f.getSort())).collect(Collectors.toList()); + } } diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java new file mode 100644 index 0000000..a73c045 --- /dev/null +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/metadata/OrderFieldInfo.java @@ -0,0 +1,35 @@ +package com.github.yulichang.adapter.base.metadata; + +import lombok.Data; + +/** + * 兼容MP 3.5.4 + * copy {@link com.baomidou.mybatisplus.core.metadata.OrderFieldInfo} + * + * @since 1.4.7 + */ +@Data +public class OrderFieldInfo { + + /** + * 字段 + */ + private String column; + + /** + * 排序类型 + */ + private String type; + + /** + * 排序顺序 + */ + private short sort; + + + public OrderFieldInfo(String column, String type, short orderBySort) { + this.column = column; + this.type = type; + this.sort = orderBySort; + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java similarity index 96% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java rename to mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java index a692bfd..6a38ff7 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/VersionUtils.java +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/tookit/VersionUtils.java @@ -1,4 +1,4 @@ -package com.github.yulichang.toolkit; +package com.github.yulichang.adapter.base.tookit; /** * 版本工具类 diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java index 73dc984..9aefe80 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java @@ -1,12 +1,16 @@ package com.github.yulichang.adapter.v33x; +import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.github.yulichang.adapter.base.ITableInfoAdapter; +import com.github.yulichang.adapter.base.metadata.OrderFieldInfo; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import org.apache.ibatis.session.Configuration; import java.lang.reflect.Field; +import java.util.List; import java.util.Objects; import java.util.function.Supplier; @@ -16,6 +20,8 @@ import java.util.function.Supplier; */ public class TableInfoAdapterV33x implements ITableInfoAdapter { + private static final boolean is330 = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.3.0") == 0; + @Override public boolean mpjHasLogic(TableInfo tableInfo) { return tableInfo.isLogicDelete(); @@ -45,6 +51,11 @@ public class TableInfoAdapterV33x implements ITableInfoAdapter { @Override public Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) { - return supplier.get(); + return is330 ? supplier.get() : ITableInfoAdapter.super.mpjGetField(fieldInfo, null); + } + + @Override + public List mpjGetOrderField(TableInfo tableInfo) { + throw new UnsupportedOperationException("不支持排序"); } } diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java new file mode 100644 index 0000000..eaf1081 --- /dev/null +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/TableInfoAdapter3431.java @@ -0,0 +1,25 @@ +package com.github.yulichang.adapter.v3431; + +import com.baomidou.mybatisplus.core.MybatisPlusVersion; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.github.yulichang.adapter.base.ITableInfoAdapter; +import com.github.yulichang.adapter.base.metadata.OrderFieldInfo; +import com.github.yulichang.adapter.base.tookit.VersionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author yulichang + * @since 1.4.7 + */ +public class TableInfoAdapter3431 implements ITableInfoAdapter { + + private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") < 0; + + @Override + public List mpjGetOrderField(TableInfo tableInfo) { + return v ? null : tableInfo.getOrderByFields().stream().map(f -> + new OrderFieldInfo(f.getColumn(), f.getOrderByType(), f.getOrderBySort())).collect(Collectors.toList()); + } +} diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index 6e177a0..dfd6c0a 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -58,7 +58,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.3.2 + 3.5.4 provided diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index 3d59ec3..19c687f 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -67,7 +67,7 @@ com.baomidou mybatis-plus-extension - 3.5.3.2 + 3.5.4 provided diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java index 09ca2a8..3b91ccf 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java @@ -1,9 +1,11 @@ package com.github.yulichang.adapter; import com.baomidou.mybatisplus.core.MybatisPlusVersion; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.github.yulichang.adapter.base.ITableInfoAdapter; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.adapter.v33x.TableInfoAdapterV33x; +import com.github.yulichang.adapter.v3431.TableInfoAdapter3431; /** * @author yulichang @@ -15,10 +17,14 @@ public class AdapterHelper { static { String version = MybatisPlusVersion.getVersion(); - if (StringUtils.isNotBlank(version) && version.startsWith("3.3.")) { + if (VersionUtils.compare(version, "3.5.4") >= 0) { + adapter = new TableInfoAdapter(); + } else if (VersionUtils.compare(version, "3.4.0") >= 0) { + adapter = new TableInfoAdapter3431(); + } else if (VersionUtils.compare(version, "3.3.0") >= 0) { adapter = new TableInfoAdapterV33x(); } else { - adapter = new TableInfoAdapter(); + throw ExceptionUtils.mpe("MPJ需要MP版本3.3.0+,当前MP版本%s", version); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java index 1b6ae41..145a51c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java @@ -1,12 +1,6 @@ package com.github.yulichang.adapter; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.github.yulichang.adapter.base.ITableInfoAdapter; -import org.apache.ibatis.session.Configuration; - -import java.lang.reflect.Field; -import java.util.function.Supplier; /** * @author yulichang @@ -14,33 +8,4 @@ import java.util.function.Supplier; */ public class TableInfoAdapter implements ITableInfoAdapter { - @Override - public boolean mpjHasLogic(TableInfo tableInfo) { - return tableInfo.isWithLogicDelete(); - } - - @Override - public boolean mpjIsPrimitive(TableFieldInfo tableFieldInfo) { - return tableFieldInfo.isPrimitive(); - } - - @Override - public TableFieldInfo mpjGetLogicField(TableInfo tableInfo) { - return tableInfo.getLogicDeleteFieldInfo(); - } - - @Override - public boolean mpjHasPK(TableInfo tableInfo) { - return tableInfo.havePK(); - } - - @Override - public Configuration mpjGetConfiguration(TableInfo tableInfo) { - return tableInfo.getConfiguration(); - } - - @Override - public Field mpjGetField(TableFieldInfo fieldInfo, Supplier supplier) { - return fieldInfo.getField(); - } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index 8bd84a2..b51e61c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -15,7 +15,7 @@ import com.github.yulichang.adapter.v3431.AbstractMethodV3431; import com.github.yulichang.method.*; import com.github.yulichang.toolkit.MPJTableMapperHelper; import com.github.yulichang.toolkit.TableHelper; -import com.github.yulichang.toolkit.VersionUtils; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; import lombok.Getter; import org.apache.ibatis.builder.MapperBuilderAssistant; @@ -38,9 +38,9 @@ import static java.util.stream.Collectors.toList; * @author yulichang * @see DefaultSqlInjector */ +@Getter public class MPJSqlInjector extends DefaultSqlInjector { - @Getter private AbstractSqlInjector sqlInjector; public MPJSqlInjector() { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index a5d881e..3eec2ec 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -1,14 +1,14 @@ package com.github.yulichang.interceptor; +import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.core.toolkit.*; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.method.MPJResultType; import com.github.yulichang.query.MPJQueryWrapper; -import com.github.yulichang.toolkit.Constant; -import com.github.yulichang.toolkit.MPJReflectionKit; -import com.github.yulichang.toolkit.MPJTableMapperHelper; -import com.github.yulichang.toolkit.TableHelper; +import com.github.yulichang.toolkit.*; import com.github.yulichang.toolkit.support.FieldCache; import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.resultmap.IResult; @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentHashMap; @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class MPJInterceptor implements Interceptor { + private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.1") > 0; private static final List EMPTY_RESULT_MAPPING = new ArrayList<>(0); @@ -286,7 +287,7 @@ public class MPJInterceptor implements Interceptor { childId.append("]"); } //双检 - String id = childId.toString(); + String id = v ? childId.toString() : childId.toString().replaceAll("\\.", "~"); if (!ms.getConfiguration().hasResultMap(id)) { ResultMap build = new ResultMap.Builder(ms.getConfiguration(), id, mybatisLabel.getOfType(), childMapping).build(); MPJInterceptor.addResultMap(ms, id, build); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java index 1b4eb67..c3c475e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java @@ -1,7 +1,6 @@ package com.github.yulichang.method; import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -10,9 +9,9 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.adapter.AdapterHelper; +import com.github.yulichang.adapter.base.metadata.OrderFieldInfo; import com.github.yulichang.annotation.DynamicTableName; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.toolkit.VersionUtils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -72,23 +71,19 @@ public interface MPJBaseMethod extends Constants { */ default String mpjSqlOrderBy(TableInfo tableInfo) { /* 不存在排序字段,直接返回空 */ - List orderByFields; + List orderByFields; try { - if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { - orderByFields = tableInfo.getOrderByFields(); - } else { - return StringPool.EMPTY; - } + orderByFields = AdapterHelper.getTableInfoAdapter().mpjGetOrderField(tableInfo); } catch (Exception e) { return StringPool.EMPTY; } if (CollectionUtils.isEmpty(orderByFields)) { return StringPool.EMPTY; } - orderByFields.sort(Comparator.comparingInt(TableFieldInfo::getOrderBySort)); + orderByFields.sort(Comparator.comparingInt(OrderFieldInfo::getSort)); String sql = NEWLINE + " ORDER BY " + orderByFields.stream().map(tfi -> String.format("${ew.alias}.%s %s", tfi.getColumn(), - tfi.getOrderByType())).collect(joining(",")); + tfi.getType())).collect(joining(",")); /* 当wrapper中传递了orderBy属性,@orderBy注解失效 */ return SqlScriptUtils.convertIf(sql, String.format("%s == null or %s", WRAPPER, WRAPPER_EXPRESSION_ORDER), true); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java index b1f9d53..4d12ebe 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.support.*; import org.apache.ibatis.reflection.property.PropertyNamer; +import java.lang.invoke.SerializedLambda; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Map; @@ -50,10 +51,11 @@ public final class LambdaUtils { // 2. 反射读取 try { Method method = func.getClass().getDeclaredMethod("writeReplace"); - return new ReflectLambdaMeta((java.lang.invoke.SerializedLambda) ReflectionKit.setAccessible(method).invoke(func)); + method.setAccessible(true); + return new ReflectLambdaMeta((SerializedLambda) method.invoke(func), func.getClass().getClassLoader()); } catch (Throwable e) { // 3. 反射失败使用序列化的方式读取 - return new ShadowLambdaMeta(SerializedLambda.extract(func)); + return new ShadowLambdaMeta(com.github.yulichang.toolkit.support.SerializedLambda.extract(func)); } } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java index 96603a2..8cbc3ed 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ReflectionKit.java @@ -20,10 +20,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; -import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.security.AccessController; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @@ -142,11 +140,11 @@ public final class ReflectionKit { * 中间表实体重写父类属性 ` private transient Date createTime; ` */ return fieldMap.values().stream() - /* 过滤静态属性 */ - .filter(f -> !Modifier.isStatic(f.getModifiers())) - /* 过滤 transient关键字修饰的属性 */ - .filter(f -> !Modifier.isTransient(f.getModifiers())) - .collect(Collectors.toList()); + /* 过滤静态属性 */ + .filter(f -> !Modifier.isStatic(f.getModifiers())) + /* 过滤 transient关键字修饰的属性 */ + .filter(f -> !Modifier.isTransient(f.getModifiers())) + .collect(Collectors.toList()); }); } @@ -161,12 +159,12 @@ public final class ReflectionKit { public static Map excludeOverrideSuperField(Field[] fields, List superFieldList) { // 子类属性 Map fieldMap = Stream.of(fields).collect(toMap(Field::getName, identity(), - (u, v) -> { - throw new IllegalStateException(String.format("Duplicate key %s", u)); - }, - LinkedHashMap::new)); + (u, v) -> { + throw new IllegalStateException(String.format("Duplicate key %s", u)); + }, + LinkedHashMap::new)); superFieldList.stream().filter(field -> !fieldMap.containsKey(field.getName())) - .forEach(f -> fieldMap.put(f.getName(), f)); + .forEach(f -> fieldMap.put(f.getName(), f)); return fieldMap; } @@ -186,17 +184,6 @@ public final class ReflectionKit { return (clazz.isPrimitive() && clazz != void.class ? PRIMITIVE_TYPE_TO_WRAPPER_MAP.get(clazz) : clazz); } - /** - * 设置可访问对象的可访问权限为 true - * - * @param object 可访问的对象 - * @param 类型 - * @return 返回设置后的对象 - */ - public static T setAccessible(T object) { - return AccessController.doPrivileged(new SetAccessibleAction<>(object)); - } - public static V computeIfAbsent(Map concurrentHashMap, K key, Function mappingFunction) { V v = concurrentHashMap.get(key); if (v != null) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java index a4c3482..103d6b0 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/IdeaProxyLambdaMeta.java @@ -15,11 +15,10 @@ */ package com.github.yulichang.toolkit.support; -import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationHandler; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandleProxies; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Executable; import java.lang.reflect.Proxy; /** @@ -28,35 +27,14 @@ import java.lang.reflect.Proxy; * Create by hcl at 2021/5/17 */ public class IdeaProxyLambdaMeta implements LambdaMeta { - private static final Field FIELD_MEMBER_NAME; - private static final Field FIELD_MEMBER_NAME_CLAZZ; - private static final Field FIELD_MEMBER_NAME_NAME; - - static { - try { - Class classDirectMethodHandle = Class.forName("java.lang.invoke.DirectMethodHandle"); - FIELD_MEMBER_NAME = ReflectionKit.setAccessible(classDirectMethodHandle.getDeclaredField("member")); - Class classMemberName = Class.forName("java.lang.invoke.MemberName"); - FIELD_MEMBER_NAME_CLAZZ = ReflectionKit.setAccessible(classMemberName.getDeclaredField("clazz")); - FIELD_MEMBER_NAME_NAME = ReflectionKit.setAccessible(classMemberName.getDeclaredField("name")); - } catch (ClassNotFoundException | NoSuchFieldException e) { - throw new MybatisPlusException(e); - } - } - private final Class clazz; private final String name; public IdeaProxyLambdaMeta(Proxy func) { - InvocationHandler handler = Proxy.getInvocationHandler(func); - try { - Object dmh = ReflectionKit.setAccessible(handler.getClass().getDeclaredField("val$target")).get(handler); - Object member = FIELD_MEMBER_NAME.get(dmh); - clazz = (Class) FIELD_MEMBER_NAME_CLAZZ.get(member); - name = (String) FIELD_MEMBER_NAME_NAME.get(member); - } catch (IllegalAccessException | NoSuchFieldException e) { - throw new MybatisPlusException(e); - } + MethodHandle dmh = MethodHandleProxies.wrapperInstanceTarget(func); + Executable executable = MethodHandles.reflectAs(Executable.class, dmh); + clazz = executable.getDeclaringClass(); + name = executable.getName(); } @Override diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java index a37c03c..74fbb6c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ReflectLambdaMeta.java @@ -16,36 +16,22 @@ package com.github.yulichang.toolkit.support; -import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.github.yulichang.toolkit.ClassUtils; -import com.github.yulichang.toolkit.ReflectionKit; import java.lang.invoke.SerializedLambda; -import java.lang.reflect.Field; /** * Created by hcl at 2021/5/14 */ public class ReflectLambdaMeta implements LambdaMeta { - private static final Field FIELD_CAPTURING_CLASS; - - static { - Field fieldCapturingClass; - try { - Class aClass = SerializedLambda.class; - fieldCapturingClass = ReflectionKit.setAccessible(aClass.getDeclaredField("capturingClass")); - } catch (Throwable e) { - // 解决高版本 jdk 的问题 gitee: https://gitee.com/baomidou/mybatis-plus/issues/I4A7I5 - fieldCapturingClass = null; - } - FIELD_CAPTURING_CLASS = fieldCapturingClass; - } - private final SerializedLambda lambda; - public ReflectLambdaMeta(SerializedLambda lambda) { + private final ClassLoader classLoader; + + public ReflectLambdaMeta(SerializedLambda lambda, ClassLoader classLoader) { this.lambda = lambda; + this.classLoader = classLoader; } @Override @@ -57,19 +43,7 @@ public class ReflectLambdaMeta implements LambdaMeta { public Class getInstantiatedClass() { String instantiatedMethodType = lambda.getInstantiatedMethodType(); String instantiatedType = instantiatedMethodType.substring(2, instantiatedMethodType.indexOf(StringPool.SEMICOLON)).replace(StringPool.SLASH, StringPool.DOT); - return ClassUtils.toClassConfident(instantiatedType, getCapturingClassClassLoader()); - } - - private ClassLoader getCapturingClassClassLoader() { - // 如果反射失败,使用默认的 classloader - if (FIELD_CAPTURING_CLASS == null) { - return null; - } - try { - return ((Class) FIELD_CAPTURING_CLASS.get(lambda)).getClassLoader(); - } catch (IllegalAccessException e) { - throw new MybatisPlusException(e); - } + return ClassUtils.toClassConfident(instantiatedType, this.classLoader); } } diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index e60c1ad..1a462ce 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -51,7 +51,7 @@ com.baomidou mybatis-plus-extension - 3.5.3.2 + 3.5.4 provided diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java index 53a038a..dd757f2 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; +import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.annotation.EntityMapping; import com.github.yulichang.annotation.FieldMapping; import com.github.yulichang.toolkit.SpringContentUtils; @@ -156,7 +157,7 @@ public class MPJTableFieldInfo { Assert.notNull(info, "未注册的实体类 <%s>", this.joinClass.getSimpleName()); //根据属性名查询 Field field = info.getFieldList().stream().filter(i -> i.getProperty().equals(bindName)) - .findFirst().map(TableFieldInfo::getField).orElse(null); + .findFirst().map(f -> getField(this.joinClass, f)).orElse(null); if (field == null && bindName.equals(info.getKeyProperty())) { field = ReflectionKit.getFieldList(joinClass).stream().filter(f -> f.getName().equals(info.getKeyProperty())).findFirst().orElse(null); @@ -165,7 +166,7 @@ public class MPJTableFieldInfo { //根据字段查询 field = info.getFieldList().stream() .filter(i -> i.getColumn().equals(bindName)) - .map(TableFieldInfo::getField).findFirst().orElse(null); + .map(f -> getField(this.joinClass, f)).findFirst().orElse(null); if (field == null && bindName.equals(info.getKeyColumn())) { field = ReflectionKit.getFieldList(joinClass).stream().filter(f -> f.getName().equals(info.getKeyProperty())).findFirst().orElse(null); @@ -175,6 +176,7 @@ public class MPJTableFieldInfo { } } this.bindField = field; + this.bindField.setAccessible(true); } private void initJoinField(String joinField) { @@ -188,16 +190,16 @@ public class MPJTableFieldInfo { TableInfo joinTableInfo = getTableInfo(this.joinClass); TableFieldInfo joinFieldInfo = joinTableInfo.getFieldList().stream().filter(f -> - f.getField().getName().equals(this.joinProperty)).findFirst().orElse(null); + f.getProperty().equals(this.joinProperty)).findFirst().orElse(null); if (joinFieldInfo == null) { - if (joinTableInfo.havePK() && this.joinProperty.equals(joinTableInfo.getKeyProperty())) { + if (AdapterHelper.getTableInfoAdapter().mpjHasPK(joinTableInfo) && this.joinProperty.equals(joinTableInfo.getKeyProperty())) { this.joinColumn = joinTableInfo.getKeyColumn(); this.joinField = ReflectionKit.getFieldList(this.joinClass).stream().filter(i -> i.getName().equals(joinTableInfo.getKeyProperty())).findFirst().orElse(null); } } else { this.joinColumn = joinFieldInfo.getColumn(); - this.joinField = joinFieldInfo.getField(); + this.joinField = getField(this.joinClass, joinFieldInfo); } Assert.notNull(this.joinField, "注解属性thisField不存在 %s , %s", this.joinClass.getName(), StringUtils.isBlank(this.joinProperty) ? "主键" : this.joinProperty); @@ -216,7 +218,7 @@ public class MPJTableFieldInfo { } TableInfo tableInfo = getTableInfo(this.entityType); - if (tableInfo.havePK() && this.thisProperty.equals(tableInfo.getKeyProperty())) { + if (AdapterHelper.getTableInfoAdapter().mpjHasPK(tableInfo) && this.thisProperty.equals(tableInfo.getKeyProperty())) { this.thisField = ReflectionKit.getFieldList(ClassUtils.getUserClass(entityType)).stream().filter(f -> f.getName().equals(tableInfo.getKeyProperty())).findFirst().orElse(null); Assert.notNull(this.thisField, "注解属性thisField不存在 %s , %s", entityType.getName(), @@ -224,10 +226,10 @@ public class MPJTableFieldInfo { this.thisColumn = tableInfo.getKeyColumn(); } else { TableFieldInfo fieldInfo = tableInfo.getFieldList().stream().filter(f -> - f.getField().getName().equals(this.thisProperty)).findFirst().orElse(null); + f.getProperty().equals(this.thisProperty)).findFirst().orElse(null); Assert.notNull(fieldInfo, "注解属性thisField不存在 %s , %s", entityType.getName(), StringUtils.isBlank(this.thisProperty) ? "主键" : this.thisProperty); - this.thisField = fieldInfo.getField(); + this.thisField = getField(this.entityType, fieldInfo); this.thisColumn = fieldInfo.getColumn(); } this.thisField.setAccessible(true); @@ -311,6 +313,11 @@ public class MPJTableFieldInfo { return tableInfo; } + private Field getField(Class table, TableFieldInfo tableFieldInfo) { + return AdapterHelper.getTableInfoAdapter().mpjGetField(tableFieldInfo, () -> + ReflectionKit.getFieldMap(table).get(tableFieldInfo.getProperty())); + } + public void fieldSet(Object o, Object val) { try { this.field.set(o, val); @@ -368,7 +375,7 @@ public class MPJTableFieldInfo { } else { if (data.size() > 1 && fieldInfo.isThrowExp()) { throw ExceptionUtils.mpe("Expected one result (or null) to be returned by select, but found: " + - data.size() + " , " + fieldInfo.getField().getName()); + data.size() + " , " + fieldInfo.getProperty()); } else { fieldInfo.fieldSet(i, data.stream().findFirst().orElse(null)); } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 1989687..e6082c8 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -1,9 +1,11 @@ package com.github.yulichang.test.join; +import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.test.join.dto.AddressDTO; import com.github.yulichang.test.join.dto.UserDTO; import com.github.yulichang.test.join.entity.*; @@ -959,13 +961,23 @@ class LambdaWrapperTest { */ @Test void joinOrder() { - ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", - "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc"); + if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { + ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", + "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc"); + } else { + ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t", + "SELECT id,user_id,name FROM order_t t"); + } MPJLambdaWrapper wrapper = JoinWrappers.lambda(OrderDO.class); List list = wrapper.list(); - ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC", - "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc"); + if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { + ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name DESC", + "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false ORDER BY t.name desc"); + } else { + ThreadLocalUtils.set("SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false", + "SELECT t.id,t.user_id,t.name,t1.`name` AS userName FROM order_t t LEFT JOIN `user` t1 ON (t1.id = t.user_id) WHERE t1.del=false"); + } MPJLambdaWrapper w = JoinWrappers.lambda(OrderDO.class) .selectAll(OrderDO.class) .selectAs(UserDO::getName, OrderDO::getUserName) From 46e04953bf7a9390a8863a2a84f4422dc07f9695 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 23 Oct 2023 16:51:45 +0800 Subject: [PATCH 04/88] 1.4.7 --- README.md | 4 ++-- .../mybatis-plus-join-adapter-base/pom.xml | 4 ++-- .../mybatis-plus-join-adapter-v33x/pom.xml | 6 +++--- .../mybatis-plus-join-adapter-v3431/pom.xml | 6 +++--- .../mybatis-plus-join-adapter-v352/pom.xml | 4 ++-- mybatis-plus-join-adapter/pom.xml | 4 ++-- mybatis-plus-join-annotation/pom.xml | 4 ++-- mybatis-plus-join-boot-starter/pom.xml | 6 +++--- mybatis-plus-join-core/pom.xml | 12 ++++++------ .../yulichang/config/MPJInterceptorConfig.java | 2 +- mybatis-plus-join-extension/pom.xml | 6 +++--- mybatis-plus-join-test/pom.xml | 12 +++--------- mybatis-plus-join-test/test-base/pom.xml | 4 ++-- mybatis-plus-join-test/test-collection/pom.xml | 4 ++-- mybatis-plus-join-test/test-join/pom.xml | 4 ++-- mybatis-plus-join-test/test-kotlin/pom.xml | 4 ++-- mybatis-plus-join-test/test-mapping/pom.xml | 4 ++-- .../test-springboot3-jdk17/pom.xml | 4 ++-- 18 files changed, 44 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 3eae84e..6ff9df2 100644 --- a/README.md +++ b/README.md @@ -50,12 +50,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.6 + 1.4.7 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.6' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index c685062..e1169de 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-base - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-base An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml index 76beec2..ec8297f 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v33x - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v33x An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.6 + 1.4.7 com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml index c3e8ced..fa1ae09 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v3431 - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v3431 An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.6 + 1.4.7 com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml index 7341246..aec3e55 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v352 - 1.4.6 + 1.4.7 mybatis-plus-join-adapter-v352 An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/pom.xml b/mybatis-plus-join-adapter/pom.xml index 167863d..cacc7ea 100644 --- a/mybatis-plus-join-adapter/pom.xml +++ b/mybatis-plus-join-adapter/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.6 + 1.4.7 pom - 1.4.6 + 1.4.7 mybatis-plus-join-adapter mybatis-plus-join-adapter diff --git a/mybatis-plus-join-annotation/pom.xml b/mybatis-plus-join-annotation/pom.xml index 022ec60..4b9189e 100644 --- a/mybatis-plus-join-annotation/pom.xml +++ b/mybatis-plus-join-annotation/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.6 + 1.4.7 - 1.4.6 + 1.4.7 mybatis-plus-join-annotation mybatis-plus-join-annotation diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index dfd6c0a..58cc3f2 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.6 + 1.4.7 - 1.4.6 + 1.4.7 mybatis-plus-join-boot-starter mybatis-plus-join-boot-starter @@ -47,7 +47,7 @@ com.github.yulichang mybatis-plus-join-extension - 1.4.6 + 1.4.7 org.springframework.boot diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index 19c687f..80f7a22 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.6 + 1.4.7 - 1.4.6 + 1.4.7 mybatis-plus-join-core mybatis-plus-join-core @@ -47,22 +47,22 @@ com.github.yulichang mybatis-plus-join-annotation - 1.4.6 + 1.4.7 com.github.yulichang mybatis-plus-join-adapter-v33x - 1.4.6 + 1.4.7 com.github.yulichang mybatis-plus-join-adapter-v3431 - 1.4.6 + 1.4.7 com.github.yulichang mybatis-plus-join-adapter-v352 - 1.4.6 + 1.4.7 com.baomidou diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index eddc1df..8867365 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.6"); + " 1.4.7"); } } diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index 1a462ce..b94d011 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.6 + 1.4.7 mybatis-plus-join-extension - 1.4.6 + 1.4.7 mybatis-plus-join-extension An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-core - 1.4.6 + 1.4.7 com.baomidou diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 543664c..64bef9b 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -13,7 +13,7 @@ com.github.yulichang mybatis-plus-join-test pom - 1.4.6 + 1.4.7 mybatis-plus-join-test @@ -82,14 +82,8 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.6 + 1.4.7 - - - - - - com.fasterxml.jackson.core jackson-databind @@ -98,7 +92,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.3.2 + 3.5.4 org.springframework diff --git a/mybatis-plus-join-test/test-base/pom.xml b/mybatis-plus-join-test/test-base/pom.xml index 7a031e3..60a0c5f 100644 --- a/mybatis-plus-join-test/test-base/pom.xml +++ b/mybatis-plus-join-test/test-base/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-test - 1.4.6 + 1.4.7 test-base - 1.4.6 + 1.4.7 test-base test-base diff --git a/mybatis-plus-join-test/test-collection/pom.xml b/mybatis-plus-join-test/test-collection/pom.xml index 26f26ae..4c4b3f6 100644 --- a/mybatis-plus-join-test/test-collection/pom.xml +++ b/mybatis-plus-join-test/test-collection/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.6 + 1.4.7 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.6 + 1.4.7 diff --git a/mybatis-plus-join-test/test-join/pom.xml b/mybatis-plus-join-test/test-join/pom.xml index efe14f5..1d35e18 100644 --- a/mybatis-plus-join-test/test-join/pom.xml +++ b/mybatis-plus-join-test/test-join/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.6 + 1.4.7 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.6 + 1.4.7 diff --git a/mybatis-plus-join-test/test-kotlin/pom.xml b/mybatis-plus-join-test/test-kotlin/pom.xml index a8ec68d..20593a2 100644 --- a/mybatis-plus-join-test/test-kotlin/pom.xml +++ b/mybatis-plus-join-test/test-kotlin/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.6 + 1.4.7 test-kotlin @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.6 + 1.4.7 com.mysql diff --git a/mybatis-plus-join-test/test-mapping/pom.xml b/mybatis-plus-join-test/test-mapping/pom.xml index 883b6f4..d0ec832 100644 --- a/mybatis-plus-join-test/test-mapping/pom.xml +++ b/mybatis-plus-join-test/test-mapping/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.6 + 1.4.7 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.6 + 1.4.7 diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml index feeb68a..31f631c 100644 --- a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml +++ b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.6 + 1.4.7 4.0.0 @@ -47,7 +47,7 @@ com.github.yulichang test-base - 1.4.6 + 1.4.7 From bc59b2329aa0e6668542d1889c2bdd4dacdc3d60 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 23 Oct 2023 16:56:25 +0800 Subject: [PATCH 05/88] 1.4.7 --- mybatis-plus-join/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 398beaf..209e077 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -10,13 +10,13 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.6 + 1.4.7 --> 4.0.0 com.github.yulichang mybatis-plus-join - 1.4.6 + 1.4.7 mybatis-plus-join An enhanced toolkit of Mybatis-Plus to simplify development. @@ -53,7 +53,7 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.6 + 1.4.7 From 91c67c5e8251420bb031e178f363089737449179 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 23 Oct 2023 18:37:04 +0800 Subject: [PATCH 06/88] 1.4.7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 26159d5..fe577bb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-root pom - 1.4.6 + 1.4.7 mybatis-plus-join-root An enhanced toolkit of Mybatis-Plus to simplify development. From bb93df99b48daaef1547741e88bae847cc6343bd Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 31 Oct 2023 01:38:06 +0800 Subject: [PATCH 07/88] =?UTF-8?q?fix=20union=E6=9D=A1=E4=BB=B6=E5=B5=8C?= =?UTF-8?q?=E5=A5=97=E5=8F=82=E6=95=B0=E5=90=8D=E9=97=AE=E9=A2=98=20https:?= =?UTF-8?q?//github.com/yulichang/mybatis-plus-join/issues/87=20https://gi?= =?UTF-8?q?tee.com/best=5Fhandsome/mybatis-plus-join/issues/I8C2QR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../github/yulichang/kt/KtAbstractWrapper.java | 16 ++++++++-------- .../com/github/yulichang/kt/KtLambdaWrapper.java | 10 ++++++---- .../wrapper/MPJAbstractLambdaWrapper.java | 5 +++-- .../yulichang/wrapper/MPJAbstractWrapper.java | 16 ++++++++-------- .../yulichang/wrapper/MPJLambdaWrapper.java | 10 ++++++---- .../yulichang/test/join/entity/UserTTT.java | 4 ---- .../yulichang/test/join/LambdaWrapperTest.java | 5 ++++- .../yulichang/test/kt/LambdaWrapperTest.kt | 1 + 8 files changed, 36 insertions(+), 31 deletions(-) delete mode 100644 mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTTT.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index 4bf7235..2c0f733 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -64,7 +64,7 @@ public abstract class KtAbstractWrapper extends KtAbstractLambdaWrapper entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, - Map paramNameValuePairs, MergeSegments mergeSegments, + Map paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, TableList tableList, Integer index, String keyWord, Class joinClass, String tableName) { super.setEntity(entity); @@ -134,6 +134,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper extends KtAbstractLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, KProperty alias) { KtLambdaWrapper wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new MergeSegments(), SharedString.emptyString(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), new TableList(), null, null, null, null) { }; wrapper.tableList.setAlias(st); @@ -348,7 +349,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new KtLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new MergeSegments(), SharedString.emptyString(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), this.tableList, index, keyWord, joinClass, tableName); } @@ -356,7 +357,8 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper> extends MPJAbstractWrapper implements QueryJoin { @@ -455,7 +456,7 @@ public abstract class MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, - Map paramNameValuePairs, MergeSegments mergeSegments, + Map paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, TableList tableList, Integer index, String keyWord, Class joinClass, String tableName) { super.setEntity(entity); @@ -132,6 +132,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, SFunction alias) { MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new TableList(), null, null, null, null) { }; wrapper.tableList.setAlias(st); @@ -348,7 +349,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), this.tableList, index, keyWord, joinClass, tableName); } @@ -359,7 +360,8 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) - .eq(UserDO::getName, "张三 2"); + .eq(UserDO::getName, "张三 2") + .and(w -> w.eq(UserDO::getName, "张三 2")); MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .eq(UserDO::getPid, 2); wrapper.union(wrapper1, wrapper2); + + System.out.println(wrapper.getUnionSql()); List list = wrapper.list(); assert list.size() == 7; diff --git a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt index e974a64..43b61de 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt @@ -1146,6 +1146,7 @@ class LambdaWrapperTest { val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) .selectAll(UserDO::class.java) .eq(UserDO::name, "张三 2") + .and { a -> a.eq(UserDO::name, "张三 2") } val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) .selectAll(UserDO::class.java) .eq(UserDO::pid, 2) From 51f2231e9d4ff006fb5113d0909a966db6e15fa9 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 31 Oct 2023 01:55:08 +0800 Subject: [PATCH 08/88] =?UTF-8?q?fix=20union=E9=80=BB=E8=BE=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=97=AE=E9=A2=98=20https://gitee.com/best=5Fhandsome?= =?UTF-8?q?/mybatis-plus-join/issues/I8C2QR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/github/yulichang/toolkit/WrapperUtils.java | 3 +++ .../github/yulichang/wrapper/MPJAbstractLambdaWrapper.java | 3 ++- .../com/github/yulichang/test/join/LambdaWrapperTest.java | 5 ++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java index e52896e..7603cc6 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/WrapperUtils.java @@ -124,6 +124,9 @@ public class WrapperUtils { } private static String mainLogic(boolean hasWhere, Class clazz, MPJLambdaWrapper wrapper) { + if (!wrapper.getLogicSql()) { + return StringPool.EMPTY; + } String info = LogicInfoUtils.getLogicInfo(null, clazz, true, wrapper.getAlias()); if (StringUtils.isNotBlank(info)) { if (hasWhere) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java index 38b5a75..47b7bf8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.OrderBy; import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; @@ -23,7 +24,6 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Function; @@ -340,6 +340,7 @@ public abstract class MPJAbstractLambdaWrapper LogicInfoUtils.getLogicInfoNoAnd( wrapper.getIndex(), wrapper.getJoinClass(), wrapper.isHasAlias(), wrapper.getAlias() diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 1d72f7e..0f78344 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -1088,20 +1088,19 @@ class LambdaWrapperTest { */ @Test void union() { - ThreadLocalUtils.set(); + ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.id = ?) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE (t.`name` = ? AND (t.`name` = ?)) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.pid = ?)"); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .eq(UserDO::getId, 1); MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) + .disableLogicDel() .eq(UserDO::getName, "张三 2") .and(w -> w.eq(UserDO::getName, "张三 2")); MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .eq(UserDO::getPid, 2); wrapper.union(wrapper1, wrapper2); - - System.out.println(wrapper.getUnionSql()); List list = wrapper.list(); assert list.size() == 7; From fbb7f05fcb1137c944e2e70c5d218d33896bc76f Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 31 Oct 2023 23:27:05 +0800 Subject: [PATCH 09/88] =?UTF-8?q?fix=20MP=E5=A4=9A=E7=A7=9F=E6=88=B7sqlPar?= =?UTF-8?q?se=E8=A7=A3=E6=9E=90=E5=BC=82=E5=B8=B8=20https://gitee.com/best?= =?UTF-8?q?=5Fhandsome/mybatis-plus-join/issues/I8CAGY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MPJInterceptorConfig.java | 2 +- .../yulichang/method/MPJAbstractMethod.java | 20 ++++++++++++++++ .../yulichang/method/SelectJoinCount.java | 2 +- .../yulichang/method/SelectJoinList.java | 2 +- .../yulichang/method/SelectJoinMap.java | 2 +- .../yulichang/method/SelectJoinMaps.java | 2 +- .../yulichang/method/SelectJoinMapsPage.java | 2 +- .../yulichang/method/SelectJoinOne.java | 2 +- .../yulichang/method/SelectJoinPage.java | 2 +- .../github/yulichang/method/UpdateJoin.java | 2 +- .../yulichang/method/UpdateJoinAndNull.java | 2 +- .../yulichang/method/mp/SelectList.java | 7 +++++- .../yulichang/method/mp/SelectMaps.java | 5 ++++ .../yulichang/method/mp/SelectMapsPage.java | 5 ++++ .../yulichang/method/mp/SelectObjs.java | 11 +++++++++ .../github/yulichang/method/mp/SelectOne.java | 11 +++++++++ .../yulichang/method/mp/SelectPage.java | 5 ++++ .../yulichang/query/MPJQueryWrapper.java | 10 +++++++- .../test/config/MybatisPlusConfig.java | 15 ++++++++++++ .../test/join/entity/UserTenantDO.java | 23 +++++++++++++++++++ .../test/join/mapper/UserTenantMapper.java | 10 ++++++++ .../test-join/src/main/resources/db/data.sql | 13 ++++++++++- .../src/main/resources/db/schema.sql | 9 ++++++++ .../test/join/LambdaWrapperTest.java | 13 +++++++---- .../yulichang/test/join/QueryWrapperTest.java | 23 ++++++++++++++++--- 25 files changed, 179 insertions(+), 21 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java create mode 100644 mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/UserTenantMapper.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index 8867365..22a510a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.7"); + " 1.4.8"); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java index feef86a..469abc9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJAbstractMethod.java @@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.adapter.v352.AbstractMethod352; import com.github.yulichang.config.ConfigProperties; +import org.apache.ibatis.builder.SqlSourceBuilder; import java.util.ArrayList; import java.util.List; +import java.util.StringTokenizer; /** * @author yulichang @@ -82,4 +84,22 @@ public abstract class MPJAbstractMethod extends AbstractMethod352 implements MPJ return ""; } } + + public String removeExtraWhitespaces(String sql) { + try { + return SqlSourceBuilder.removeExtraWhitespaces(sql); + } catch (Throwable t) { + StringTokenizer tokenizer = new StringTokenizer(sql); + StringBuilder builder = new StringBuilder(); + boolean hasMoreTokens = tokenizer.hasMoreTokens(); + while (hasMoreTokens) { + builder.append(tokenizer.nextToken()); + hasMoreTokens = tokenizer.hasMoreTokens(); + if (hasMoreTokens) { + builder.append(' '); + } + } + return builder.toString(); + } + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinCount.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinCount.java index 6fc295b..b8c5baa 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinCount.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinCount.java @@ -27,7 +27,7 @@ public class SelectJoinCount extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_COUNT; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlCount(), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Long.class); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinList.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinList.java index f18ca33..fcd4f17 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinList.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinList.java @@ -31,7 +31,7 @@ public class SelectJoinList extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_LIST; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMap.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMap.java index 74fd719..4c73c8b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMap.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMap.java @@ -32,7 +32,7 @@ public class SelectJoinMap extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAP; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMaps.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMaps.java index 7db4c14..446cf80 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMaps.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMaps.java @@ -33,7 +33,7 @@ public class SelectJoinMaps extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java index da609a2..60a1ed4 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinMapsPage.java @@ -33,7 +33,7 @@ public class SelectJoinMapsPage extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS_PAGE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinOne.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinOne.java index 3ded876..6b1042e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinOne.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinOne.java @@ -30,7 +30,7 @@ public class SelectJoinOne extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_ONE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinPage.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinPage.java index 49a512a..f531bcb 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinPage.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/SelectJoinPage.java @@ -31,7 +31,7 @@ public class SelectJoinPage extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_PAGE; String sql = String.format(sqlMethod.getSql(), sqlFirst(), sqlDistinct(), sqlSelectColumns(tableInfo, true), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), mpjSqlOrderBy(tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, MPJResultType.class); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoin.java index aee7f04..c9fd322 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoin.java @@ -31,7 +31,7 @@ public class UpdateJoin extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.UPDATE_JOIN; String sql = String.format(sqlMethod.getSql(), sqlFirst(), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), mpjSqlSet(true, true, tableInfo, true, ENTITY, ENTITY_DOT), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoinAndNull.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoinAndNull.java index 3796cb7..320c136 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoinAndNull.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/UpdateJoinAndNull.java @@ -30,7 +30,7 @@ public class UpdateJoinAndNull extends MPJAbstractMethod { SqlMethod sqlMethod = SqlMethod.UPDATE_JOIN_AND_NULL; String sql = String.format(sqlMethod.getSql(), sqlFirst(), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), mpjSqlSet(true, true, tableInfo, true, ENTITY, ENTITY_DOT), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectList.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectList.java index 90233ff..bfa8ed5 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectList.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectList.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -35,8 +36,12 @@ public class SelectList extends com.baomidou.mybatisplus.core.injector.methods.S @Override protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), - super.sqlOrderBy(table), mpjSqlOrderBy(table)); + orderBy, mpjSqlOrderBy(table)); } @Override diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMaps.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMaps.java index 3b3a312..ed4ab63 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMaps.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMaps.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -35,6 +36,10 @@ public class SelectMaps extends com.baomidou.mybatisplus.core.injector.methods.S @Override protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), super.sqlOrderBy(table), mpjSqlOrderBy(table)); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMapsPage.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMapsPage.java index b9df82d..e22e3a6 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMapsPage.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectMapsPage.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -35,6 +36,10 @@ public class SelectMapsPage extends com.baomidou.mybatisplus.core.injector.metho @Override protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), super.sqlOrderBy(table), mpjSqlOrderBy(table)); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectObjs.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectObjs.java index 00988ad..546793b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectObjs.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectObjs.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -48,6 +49,16 @@ public class SelectObjs extends com.baomidou.mybatisplus.core.injector.methods.S selectColumns, mpjSqlSelectColumns() + StringPool.SPACE + selectColumns); } + @Override + protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } + return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), + super.sqlOrderBy(table), mpjSqlOrderBy(table)); + } + @Override protected String sqlComment() { return super.sqlComment() + StringPool.NEWLINE + SqlScriptUtils.convertIf("${ew.unionSql}", String.format("%s != null and (%s instanceof %s)", diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectOne.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectOne.java index 1f93b0e..b8503e2 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectOne.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectOne.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -45,6 +46,16 @@ public class SelectOne extends com.baomidou.mybatisplus.core.injector.methods.Se selectColumns, mpjSqlSelectColumns() + StringPool.SPACE + selectColumns); } + @Override + protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } + return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), + super.sqlOrderBy(table), mpjSqlOrderBy(table)); + } + @Override protected String sqlComment() { return super.sqlComment() + StringPool.NEWLINE + SqlScriptUtils.convertIf("${ew.unionSql}", String.format("%s != null and (%s instanceof %s)", diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectPage.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectPage.java index 5d20d10..adf9e34 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectPage.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/mp/SelectPage.java @@ -3,6 +3,7 @@ package com.github.yulichang.method.mp; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import com.github.yulichang.interfaces.MPJBaseJoin; import org.apache.ibatis.mapping.MappedStatement; @@ -35,6 +36,10 @@ public class SelectPage extends com.baomidou.mybatisplus.core.injector.methods.S @Override protected String sqlOrderBy(TableInfo table) { + String orderBy = super.sqlOrderBy(table); + if (StringUtils.isBlank(orderBy)) { + return orderBy; + } return SqlScriptUtils.convertChoose(String.format("%s == null or !(%s instanceof %s)", Constants.WRAPPER, Constants.WRAPPER, MPJBaseJoin.class.getName()), super.sqlOrderBy(table), mpjSqlOrderBy(table)); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java index 20ce880..8cab848 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java @@ -1,5 +1,6 @@ package com.github.yulichang.query; +import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.query.Query; @@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; @@ -89,7 +91,13 @@ public class MPJQueryWrapper extends AbstractWrapper clazz) { - super.setEntityClass(clazz); + try { + super.setEntityClass(clazz); + } catch (NoSuchMethodError error) { + if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.3.0") > 0) { + throw error; + } + } super.initNeed(); } diff --git a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java index a0c2f95..2d9c743 100644 --- a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java +++ b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java @@ -8,11 +8,15 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.test.util.ThreadLocalUtils; import lombok.SneakyThrows; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; import org.apache.ibatis.builder.SqlSourceBuilder; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.executor.statement.StatementHandler; @@ -44,6 +48,17 @@ public class MybatisPlusConfig { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); PaginationInnerInterceptor page = new PaginationInnerInterceptor(DbType.H2); page.setOptimizeJoin(false); + interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { + @Override + public Expression getTenantId() { + return new LongValue(1); + } + + @Override + public boolean ignoreTable(String tableName) { + return !"user_tenant".equals(tableName); + } + })); interceptor.addInnerInterceptor(page); interceptor.addInnerInterceptor(new SqlInterceptor()); return interceptor; diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java new file mode 100644 index 0000000..91efc27 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java @@ -0,0 +1,23 @@ +package com.github.yulichang.test.join.entity; + + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; +import lombok.experimental.FieldNameConstants; + +@Data +@ToString +@FieldNameConstants +@TableName(value = "user_tenant") +public class UserTenantDO { + + @TableId + private Integer id; + + + private Integer userId; + + private Integer tenantId; +} diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/UserTenantMapper.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/UserTenantMapper.java new file mode 100644 index 0000000..dddf8d8 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/UserTenantMapper.java @@ -0,0 +1,10 @@ +package com.github.yulichang.test.join.mapper; + +import com.github.yulichang.test.join.entity.UserTenantDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserTenantMapper extends MyBaseMapper { + + +} diff --git a/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql b/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql index 55ec13a..e9e4427 100644 --- a/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql +++ b/mybatis-plus-join-test/test-join/src/main/resources/db/data.sql @@ -99,4 +99,15 @@ INSERT INTO order_t (id, user_id, age, name) VALUES (5, 5, 4, '5,4'), (6, 6, 3, '6,3'), (7, 7, 2, '7,2'), -(8, 8, 1, '8,1'); \ No newline at end of file +(8, 8, 1, '8,1'); + +DELETE FROM user_tenant; +INSERT INTO user_tenant (id,user_id, tenant_id) VALUES +(1, 1, 1), +(2, 2, 1), +(3, 3, 1), +(4, 4, 1), +(5, 5, 1), +(6, 6, 2), +(7, 7, 2), +(8, 8, 2); \ No newline at end of file diff --git a/mybatis-plus-join-test/test-join/src/main/resources/db/schema.sql b/mybatis-plus-join-test/test-join/src/main/resources/db/schema.sql index 9e9c7ef..64c7602 100644 --- a/mybatis-plus-join-test/test-join/src/main/resources/db/schema.sql +++ b/mybatis-plus-join-test/test-join/src/main/resources/db/schema.sql @@ -63,4 +63,13 @@ create table order_t user_id int null, age int null, name varchar(255) null +); + +DROP TABLE IF EXISTS user_tenant; +create table user_tenant +( + id int auto_increment + primary key, + user_id int null, + tenant_id int null ); \ No newline at end of file diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 0f78344..90b31b4 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -680,7 +680,9 @@ class LambdaWrapperTest { .eq(UserDO::getName, "ref"); userMapper.selectList(wrapper); try { - userMapper.insertBatchSomeColumn(new ArrayList<>()); + userMapper.insertBatchSomeColumn(new ArrayList() {{ + add(new UserDO()); + }}); } catch (BadSqlGrammarException ignored) { } } @@ -774,7 +776,7 @@ class LambdaWrapperTest { */ @Test void testTable() { - ThreadLocalUtils.set("SELECT t.id FROM `user`bbbbbbb t LEFT JOIN addressaaaaaaaaaa t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false AND (t.id <= ?) ORDER BY t.id DESC"); + ThreadLocalUtils.set("SELECT t.id FROM bbbbbbb t LEFT JOIN addressaaaaaaaaaa t1 ON (t1.user_id = t.id) LEFT JOIN area t2 ON (t2.id = t1.area_id) WHERE t.del=false AND t1.del=false AND t2.del=false AND (t.id <= ?) ORDER BY t.id DESC"); MPJLambdaWrapper wrapper = new MPJLambdaWrapper() .select(UserDO::getId) .leftJoin(AddressDO.class, on -> on @@ -783,10 +785,11 @@ class LambdaWrapperTest { .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId) .le(UserDO::getId, 10000) .orderByDesc(UserDO::getId) - .setTableName(name -> name + "bbbbbbb"); + .setTableName(name -> "bbbbbbb"); try { List list = userMapper.selectJoinList(UserDTO.class, wrapper); } catch (BadSqlGrammarException ignored) { + } } @@ -1050,7 +1053,7 @@ class LambdaWrapperTest { */ @Test void sub() { - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM `user` st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); + ThreadLocalUtils.set("SELECT (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .selectSub(UserDO.class, w -> w.select(UserDO::getId) .eq(UserDO::getId, UserDO::getId) @@ -1059,7 +1062,7 @@ class LambdaWrapperTest { .le(UserDO::getId, 100); wrapper.list(); - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); + ThreadLocalUtils.set("SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = t1.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) .eq(AreaDO::getId, AddressDO::getId) diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java index f29b628..43ec2cc 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java @@ -5,8 +5,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.test.join.dto.UserDTO; import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.join.entity.UserTenantDO; import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.join.mapper.UserTenantMapper; import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.BadSqlGrammarException; @@ -20,6 +23,10 @@ class QueryWrapperTest { @Resource private UserMapper userMapper; + @Resource + private UserTenantMapper userTenantMapper; + + /** * 链表查询 */ @@ -30,6 +37,16 @@ class QueryWrapperTest { .select("name AS nameName") .last("LIMIT 1")); System.out.println(dto); + + + IPage iPage1 = userTenantMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, + JoinWrappers.query(UserTenantDO.class) + .selectAll(UserTenantDO.class) + .select("t1.name as PName") + .leftJoin("(select * from `user` where id <> -1) t1 on t1.id = t.user_id") + .apply("t.id <> -1")); + + iPage1.getRecords().forEach(System.out::println); } /** @@ -37,11 +54,11 @@ class QueryWrapperTest { */ @Test void table() { - ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by,name AS nameName FROM `user`fwear t WHERE t.del=false LIMIT 1", - "SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img AS img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by,name AS nameName FROM `user`fwear t WHERE t.del=false LIMIT 1"); + ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by,name AS nameName FROM fwear t WHERE t.del=false LIMIT 1", + "SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img AS img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by,name AS nameName FROM fwear t WHERE t.del=false LIMIT 1"); MPJQueryWrapper wrapper = new MPJQueryWrapper() .selectAll(UserDO.class) - .setTableName(name -> name + "fwear") + .setTableName(name -> "fwear") .select("name AS nameName") .last("LIMIT 1"); try { From 4bf4d25c9cc4394b8bb67125e68cf36f3b35582d Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 1 Nov 2023 12:20:05 +0800 Subject: [PATCH 10/88] 1.4.7.1 --- README.md | 7 +++---- .../mybatis-plus-join-adapter-base/pom.xml | 4 ++-- .../mybatis-plus-join-adapter-v33x/pom.xml | 6 +++--- .../mybatis-plus-join-adapter-v3431/pom.xml | 6 +++--- .../mybatis-plus-join-adapter-v352/pom.xml | 4 ++-- mybatis-plus-join-adapter/pom.xml | 4 ++-- mybatis-plus-join-annotation/pom.xml | 4 ++-- mybatis-plus-join-boot-starter/pom.xml | 6 +++--- mybatis-plus-join-core/pom.xml | 12 ++++++------ .../yulichang/config/MPJInterceptorConfig.java | 2 +- mybatis-plus-join-extension/pom.xml | 6 +++--- mybatis-plus-join-test/pom.xml | 6 +++--- mybatis-plus-join-test/test-base/pom.xml | 4 ++-- mybatis-plus-join-test/test-collection/pom.xml | 4 ++-- mybatis-plus-join-test/test-join/pom.xml | 4 ++-- mybatis-plus-join-test/test-kotlin/pom.xml | 4 ++-- mybatis-plus-join-test/test-mapping/pom.xml | 4 ++-- .../test-springboot3-jdk17/pom.xml | 4 ++-- mybatis-plus-join/pom.xml | 6 +++--- pom.xml | 2 +- 20 files changed, 49 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 6ff9df2..9890240 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ Mybatis-Plus-Join-Logo

+

MyBatis-Plus-Join

为简化开发工作、提高生产率而生

-

@@ -24,7 +24,6 @@ code style

-

MyBatis-Plus-Join

MyBatis-Plus 多表查询的扩展 | 演示工程 | @@ -50,12 +49,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7 + 1.4.7.1 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.1' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index e1169de..5d1415a 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-base - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-base An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml index ec8297f..af5d43d 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v33x - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v33x An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.7 + 1.4.7.1 com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml index fa1ae09..01a9e3f 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v3431 - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v3431 An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.7 + 1.4.7.1 com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml index aec3e55..17c3240 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v352 - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter-v352 An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/pom.xml b/mybatis-plus-join-adapter/pom.xml index cacc7ea..2748f33 100644 --- a/mybatis-plus-join-adapter/pom.xml +++ b/mybatis-plus-join-adapter/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7 + 1.4.7.1 pom - 1.4.7 + 1.4.7.1 mybatis-plus-join-adapter mybatis-plus-join-adapter diff --git a/mybatis-plus-join-annotation/pom.xml b/mybatis-plus-join-annotation/pom.xml index 4b9189e..ccc0e0f 100644 --- a/mybatis-plus-join-annotation/pom.xml +++ b/mybatis-plus-join-annotation/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7 + 1.4.7.1 - 1.4.7 + 1.4.7.1 mybatis-plus-join-annotation mybatis-plus-join-annotation diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index 58cc3f2..53457b4 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7 + 1.4.7.1 - 1.4.7 + 1.4.7.1 mybatis-plus-join-boot-starter mybatis-plus-join-boot-starter @@ -47,7 +47,7 @@ com.github.yulichang mybatis-plus-join-extension - 1.4.7 + 1.4.7.1 org.springframework.boot diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index 80f7a22..f570f35 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7 + 1.4.7.1 - 1.4.7 + 1.4.7.1 mybatis-plus-join-core mybatis-plus-join-core @@ -47,22 +47,22 @@ com.github.yulichang mybatis-plus-join-annotation - 1.4.7 + 1.4.7.1 com.github.yulichang mybatis-plus-join-adapter-v33x - 1.4.7 + 1.4.7.1 com.github.yulichang mybatis-plus-join-adapter-v3431 - 1.4.7 + 1.4.7.1 com.github.yulichang mybatis-plus-join-adapter-v352 - 1.4.7 + 1.4.7.1 com.baomidou diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index 22a510a..c1ea47b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.8"); + " 1.4.7.1"); } } diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index b94d011..dd5650a 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7 + 1.4.7.1 mybatis-plus-join-extension - 1.4.7 + 1.4.7.1 mybatis-plus-join-extension An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-core - 1.4.7 + 1.4.7.1 com.baomidou diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 64bef9b..e8ac9ea 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -13,7 +13,7 @@ com.github.yulichang mybatis-plus-join-test pom - 1.4.7 + 1.4.7.1 mybatis-plus-join-test @@ -24,7 +24,7 @@ test-mapping - + test-kotlin @@ -82,7 +82,7 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7 + 1.4.7.1 com.fasterxml.jackson.core diff --git a/mybatis-plus-join-test/test-base/pom.xml b/mybatis-plus-join-test/test-base/pom.xml index 60a0c5f..1d229e8 100644 --- a/mybatis-plus-join-test/test-base/pom.xml +++ b/mybatis-plus-join-test/test-base/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7 + 1.4.7.1 test-base - 1.4.7 + 1.4.7.1 test-base test-base diff --git a/mybatis-plus-join-test/test-collection/pom.xml b/mybatis-plus-join-test/test-collection/pom.xml index 4c4b3f6..70d5cb3 100644 --- a/mybatis-plus-join-test/test-collection/pom.xml +++ b/mybatis-plus-join-test/test-collection/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7 + 1.4.7.1 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7 + 1.4.7.1 diff --git a/mybatis-plus-join-test/test-join/pom.xml b/mybatis-plus-join-test/test-join/pom.xml index 1d35e18..460f033 100644 --- a/mybatis-plus-join-test/test-join/pom.xml +++ b/mybatis-plus-join-test/test-join/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7 + 1.4.7.1 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7 + 1.4.7.1 diff --git a/mybatis-plus-join-test/test-kotlin/pom.xml b/mybatis-plus-join-test/test-kotlin/pom.xml index 20593a2..56d681b 100644 --- a/mybatis-plus-join-test/test-kotlin/pom.xml +++ b/mybatis-plus-join-test/test-kotlin/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7 + 1.4.7.1 test-kotlin @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7 + 1.4.7.1 com.mysql diff --git a/mybatis-plus-join-test/test-mapping/pom.xml b/mybatis-plus-join-test/test-mapping/pom.xml index d0ec832..a751e70 100644 --- a/mybatis-plus-join-test/test-mapping/pom.xml +++ b/mybatis-plus-join-test/test-mapping/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.7 + 1.4.7.1 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7 + 1.4.7.1 diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml index 31f631c..23b1217 100644 --- a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml +++ b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.7 + 1.4.7.1 4.0.0 @@ -47,7 +47,7 @@ com.github.yulichang test-base - 1.4.7 + 1.4.7.1 diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 209e077..fad59a0 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -10,13 +10,13 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7 + 1.4.7.1 --> 4.0.0 com.github.yulichang mybatis-plus-join - 1.4.7 + 1.4.7.1 mybatis-plus-join An enhanced toolkit of Mybatis-Plus to simplify development. @@ -53,7 +53,7 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7 + 1.4.7.1 diff --git a/pom.xml b/pom.xml index fe577bb..a14c1d9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-root pom - 1.4.7 + 1.4.7.1 mybatis-plus-join-root An enhanced toolkit of Mybatis-Plus to simplify development. From 289127c0f683843950c51fe76e08d891612b6a4a Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 1 Nov 2023 23:27:06 +0800 Subject: [PATCH 11/88] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=88=AB=E5=90=8D=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/interceptor/MPJInterceptor.java | 89 +++++++++++++------ .../test/join/entity/UserTenantDO.java | 9 +- .../test/join/LambdaWrapperTest.java | 18 ++-- 3 files changed, 80 insertions(+), 36 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index 3eec2ec..696d21a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -2,19 +2,24 @@ package com.github.yulichang.interceptor; import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.core.toolkit.*; import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.method.MPJResultType; import com.github.yulichang.query.MPJQueryWrapper; -import com.github.yulichang.toolkit.*; +import com.github.yulichang.toolkit.Constant; +import com.github.yulichang.toolkit.MPJReflectionKit; +import com.github.yulichang.toolkit.MPJTableMapperHelper; +import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.support.FieldCache; import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.resultmap.IResult; import com.github.yulichang.wrapper.resultmap.Label; import com.github.yulichang.wrapper.segments.Select; import com.github.yulichang.wrapper.segments.SelectLabel; +import lombok.AllArgsConstructor; +import lombok.Data; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ResultFlag; @@ -50,6 +55,9 @@ public class MPJInterceptor implements Interceptor { */ private static final Map> MS_CACHE = new ConcurrentHashMap<>(); + private static final Map MS_MAPPER_CACHE = new ConcurrentHashMap<>(); + + private static final Map RES_MAPPER_CACHE = new ConcurrentHashMap<>(); @Override @SuppressWarnings("Java8MapApi") @@ -60,14 +68,27 @@ public class MPJInterceptor implements Interceptor { if (args[1] instanceof Map) { Map map = (Map) args[1]; Object ew = map.containsKey(Constants.WRAPPER) ? map.get(Constants.WRAPPER) : null; - if (CollectionUtils.isNotEmpty(map) && map.containsKey(Constant.CLAZZ)) { - Class clazz = (Class) map.get(Constant.CLAZZ); - if (Objects.nonNull(clazz)) { - List list = ms.getResultMaps(); - if (CollectionUtils.isNotEmpty(list)) { - ResultMap resultMap = list.get(0); - if (resultMap.getType() == MPJResultType.class) { - args[0] = getMappedStatement(ms, clazz, ew); + if (Objects.nonNull(ew) && ew instanceof MPJBaseJoin) { + if (CollectionUtils.isNotEmpty(map)) { + Class rt = null; + if (map.containsKey(Constant.CLAZZ)) { + rt = (Class) map.get(Constant.CLAZZ); + } else { + if (CollectionUtils.isNotEmpty(ms.getResultMaps())) { + Class entity = MPJTableMapperHelper.getEntity(getMapper(ms.getId(), ms.getResource())); + Class type = ms.getResultMaps().get(0).getType(); + if (Objects.nonNull(entity) && Objects.nonNull(type) && entity == type) { + rt = type; + } + } + } + if (Objects.nonNull(rt)) { + List list = ms.getResultMaps(); + if (CollectionUtils.isNotEmpty(list)) { + ResultMap resultMap = list.get(0); + if (resultMap.getType() == MPJResultType.class) { + args[0] = getMappedStatement(ms, rt, ew); + } } } } @@ -87,7 +108,7 @@ public class MPJInterceptor implements Interceptor { if (ew instanceof SelectWrapper) { SelectWrapper wrapper = (SelectWrapper) ew; if (wrapper.getEntityClass() == null) { - wrapper.setEntityClass(MPJTableMapperHelper.getEntity(getEntity(ms.getId(), ms.getResource()))); + wrapper.setEntityClass(MPJTableMapperHelper.getEntity(getMapper(ms.getId(), ms.getResource()))); } if (wrapper.getSelectColumns().isEmpty() && wrapper.getEntityClass() != null) { wrapper.selectAll(wrapper.getEntityClass()); @@ -360,29 +381,37 @@ public class MPJInterceptor implements Interceptor { } } - private Class getEntity(String id, String resource) { - Class clazz = null; - try { - String className = id.substring(0, id.lastIndexOf(StringPool.DOT)); + private Class getMapper(String id, String resource) { + Class clazz = MS_MAPPER_CACHE.computeIfAbsent(id, key -> { try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - clazz = MPJTableMapperHelper.getMapperForName(className); + String className = key.substring(0, key.lastIndexOf(StringPool.DOT)); + try { + return new Val(Class.forName(className)); + } catch (ClassNotFoundException e) { + return new Val(MPJTableMapperHelper.getMapperForName(className)); + } + } catch (Exception ignored) { + return new Val(null); } - } catch (Exception ignored) { - } + }).getVal(); + if (Objects.nonNull(clazz)) { return clazz; } - try { - String className = resource.substring(0, id.lastIndexOf(StringPool.DOT)).replaceAll("/", StringPool.DOT); + + clazz = RES_MAPPER_CACHE.computeIfAbsent(resource, key -> { try { - clazz = Class.forName(className); - } catch (ClassNotFoundException e) { - clazz = MPJTableMapperHelper.getMapperForName(className); + String className = key.substring(0, key.lastIndexOf(StringPool.DOT)).replaceAll("/", StringPool.DOT); + try { + return new Val(Class.forName(className)); + } catch (ClassNotFoundException e) { + return new Val(MPJTableMapperHelper.getMapperForName(className)); + } + } catch (Exception ignored) { + return new Val(null); } - } catch (Exception ignored) { - } + }).getVal(); + return clazz; } @@ -410,4 +439,10 @@ public class MPJInterceptor implements Interceptor { } catch (Exception ignored) { } } + + @Data + @AllArgsConstructor + public static class Val { + private Class val; + } } diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java index 91efc27..f9397e3 100644 --- a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/UserTenantDO.java @@ -1,6 +1,7 @@ package com.github.yulichang.test.join.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -13,11 +14,11 @@ import lombok.experimental.FieldNameConstants; @TableName(value = "user_tenant") public class UserTenantDO { - @TableId - private Integer id; + @TableId("id") + private Integer idea; - - private Integer userId; + @TableField("user_id") + private Integer uuid; private Integer tenantId; } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 90b31b4..df12348 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -9,10 +9,7 @@ import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.test.join.dto.AddressDTO; import com.github.yulichang.test.join.dto.UserDTO; import com.github.yulichang.test.join.entity.*; -import com.github.yulichang.test.join.mapper.AddressMapper; -import com.github.yulichang.test.join.mapper.OrderMapper; -import com.github.yulichang.test.join.mapper.UserDTOMapper; -import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.join.mapper.*; import com.github.yulichang.test.util.Reset; import com.github.yulichang.test.util.ThreadLocalUtils; import com.github.yulichang.toolkit.JoinWrappers; @@ -54,11 +51,23 @@ class LambdaWrapperTest { @Autowired private OrderMapper orderMapper; + @Autowired + private UserTenantMapper userTenantMapper; + @BeforeEach void setUp() { Reset.reset(); } + @Test + void testSimple() { + MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class); + lambda.selectAs(UserTenantDO::getIdea, UserTenantDO::getIdea); + List list = userTenantMapper.selectList(lambda); + + assert list.size() == 5 && list.get(0).getIdea() != null; + } + @Test void testJoin() { ThreadLocalUtils.set("SELECT t.id,\n" + @@ -985,7 +994,6 @@ class LambdaWrapperTest { .selectAll(OrderDO.class) .selectAs(UserDO::getName, OrderDO::getUserName) .leftJoin(UserDO.class, UserDO::getId, OrderDO::getUserId); - System.out.println(wrapper.getFrom()); List l = w.list(); } From b83963a61ce6cdf4536d712cd305731c794ece58 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 2 Nov 2023 01:08:57 +0800 Subject: [PATCH 12/88] https://github.com/yulichang/mybatis-plus-join/issues/84 --- .../github/yulichang/kt/interfaces/Query.java | 13 +++--- .../yulichang/toolkit/MPJReflectionKit.java | 40 ++++++++++--------- .../yulichang/wrapper/interfaces/Query.java | 13 +++--- .../test/join/dto/UserTenantDTO.java | 16 ++++++++ .../test/join/dto/UserTenantDescDTO.java | 16 ++++++++ .../test/join/LambdaWrapperTest.java | 18 +++++++++ 6 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDTO.java create mode 100644 mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDescDTO.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java index 5b76e76..77c5a85 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; * * @author yulichang */ -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "DuplicatedCode"}) public interface Query extends Serializable { @@ -129,11 +129,12 @@ public interface Query extends Serializable { * @return children */ default Children selectAsClass(Class source, Class tag) { - List normalList = ColumnCache.getListField(source); - Map fieldMap = MPJReflectionKit.getFieldMap(tag); - for (SelectCache cache : normalList) { - if (fieldMap.containsKey(cache.getColumProperty())) { - getSelectColum().add(new SelectNormal(cache, getIndex(), isHasAlias(), getAlias())); + Map normalMap = ColumnCache.getMapField(source); + List fieldList = MPJReflectionKit.getFieldList(tag); + for (FieldCache cache : fieldList) { + if (normalMap.containsKey(cache.getField().getName())) { + SelectCache selectCache = normalMap.get(cache.getField().getName()); + getSelectColum().add(new SelectNormal(selectCache, getIndex(), isHasAlias(), getAlias())); } } return getChildren(); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java index 26ee29f..3276d5f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java @@ -8,11 +8,10 @@ import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.WildcardType; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 反射工具类 @@ -24,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; public final class MPJReflectionKit { private static final Map, Map> CLASS_FIELD_CACHE = new ConcurrentHashMap<>(); + private static final Map, List> CLASS_FIELD_LIST_CACHE = new ConcurrentHashMap<>(); private static final Map EMPTY_MAP = new HashMap<>(); @@ -77,28 +77,32 @@ public final class MPJReflectionKit { * @param clazz 反射类 */ public static Map getFieldMap(Class clazz) { + return CLASS_FIELD_CACHE.computeIfAbsent(clazz, key -> getFieldList(key).stream().collect(Collectors.toMap(f -> + f.getField().getName(), Function.identity()))); + } + + public static List getFieldList(Class clazz) { if (clazz == null) { - return EMPTY_MAP; + return Collections.emptyList(); } - Map fieldMap = CLASS_FIELD_CACHE.get(clazz); - if (fieldMap != null) { - return fieldMap; + List fieldList = CLASS_FIELD_LIST_CACHE.get(clazz); + if (fieldList != null) { + return fieldList; } - Map map = ReflectionKit.getFieldMap(clazz); - Map cache = new HashMap<>(); - map.forEach((key, value) -> { + List list = ReflectionKit.getFieldList(clazz); + List cache = list.stream().map(f -> { FieldCache fieldCache = new FieldCache(); - fieldCache.setField(value); + fieldCache.setField(f); try { Reflector reflector = new Reflector(clazz); - Class getterType = reflector.getGetterType(key); - fieldCache.setType(Objects.isNull(getterType) ? value.getType() : getterType); + Class getterType = reflector.getGetterType(f.getName()); + fieldCache.setType(Objects.isNull(getterType) ? f.getType() : getterType); } catch (Throwable throwable) { - fieldCache.setType(value.getType()); + fieldCache.setType(f.getType()); } - cache.put(key, fieldCache); - }); - CLASS_FIELD_CACHE.put(clazz, cache); + return fieldCache; + }).collect(Collectors.toList()); + CLASS_FIELD_LIST_CACHE.put(clazz, cache); return cache; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index d393a14..f49f7be 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; * * @author yulichang */ -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "DuplicatedCode"}) public interface Query extends Serializable { @@ -129,11 +129,12 @@ public interface Query extends Serializable { * @return children */ default Children selectAsClass(Class source, Class tag) { - List normalList = ColumnCache.getListField(source); - Map fieldMap = MPJReflectionKit.getFieldMap(tag); - for (SelectCache cache : normalList) { - if (fieldMap.containsKey(cache.getColumProperty())) { - getSelectColum().add(new SelectNormal(cache, getIndex(), isHasAlias(), getAlias())); + Map normalMap = ColumnCache.getMapField(source); + List fieldList = MPJReflectionKit.getFieldList(tag); + for (FieldCache cache : fieldList) { + if (normalMap.containsKey(cache.getField().getName())) { + SelectCache selectCache = normalMap.get(cache.getField().getName()); + getSelectColum().add(new SelectNormal(selectCache, getIndex(), isHasAlias(), getAlias())); } } return getChildren(); diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDTO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDTO.java new file mode 100644 index 0000000..1aa0b3c --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDTO.java @@ -0,0 +1,16 @@ +package com.github.yulichang.test.join.dto; + + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class UserTenantDTO { + + private Integer idea; + + private Integer uuid; + + private Integer tenantId; +} diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDescDTO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDescDTO.java new file mode 100644 index 0000000..5f8945f --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/dto/UserTenantDescDTO.java @@ -0,0 +1,16 @@ +package com.github.yulichang.test.join.dto; + + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +public class UserTenantDescDTO { + + private Integer tenantId; + + private Integer uuid; + + private Integer idea; +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index df12348..c6a7f22 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.test.join.dto.AddressDTO; import com.github.yulichang.test.join.dto.UserDTO; +import com.github.yulichang.test.join.dto.UserTenantDTO; +import com.github.yulichang.test.join.dto.UserTenantDescDTO; import com.github.yulichang.test.join.entity.*; import com.github.yulichang.test.join.mapper.*; import com.github.yulichang.test.util.Reset; @@ -59,6 +61,22 @@ class LambdaWrapperTest { Reset.reset(); } + @Test + void testSelectSort(){ + ThreadLocalUtils.set("SELECT t.id, t.user_id, t.tenant_id FROM user_tenant t WHERE t.tenant_id = 1"); + MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class); + lambda.selectAsClass(UserTenantDO.class, UserTenantDTO.class); + List list = userTenantMapper.selectJoinList(UserTenantDO.class,lambda); + assert list.size() == 5 && list.get(0).getIdea() != null; + + + ThreadLocalUtils.set("SELECT t.tenant_id, t.user_id, t.id FROM user_tenant t WHERE t.tenant_id = 1"); + MPJLambdaWrapper lambda1 = JoinWrappers.lambda(UserTenantDO.class); + lambda1.selectAsClass(UserTenantDO.class, UserTenantDescDTO.class); + List list1 = userTenantMapper.selectJoinList(UserTenantDO.class,lambda1); + assert list1.size() == 5 && list1.get(0).getIdea() != null; + } + @Test void testSimple() { MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class); From c9e735522ceb27cebf12c5f1b4bbdad8baf3f2a5 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 2 Nov 2023 10:03:08 +0800 Subject: [PATCH 13/88] readme --- README-zh.md | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 +- 2 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 README-zh.md diff --git a/README-zh.md b/README-zh.md new file mode 100644 index 0000000..261dc2d --- /dev/null +++ b/README-zh.md @@ -0,0 +1,164 @@ + +

+ + Mybatis-Plus-Join-Logo + +

+

MyBatis-Plus-Join

+

+ 为简化开发工作、提高生产率而生 +

+

+ + + + + + +
+ + maven + + + + code style + +

+

+对 MyBatis-Plus 多表查询的扩展 | +演示工程 | +使用文档 | +点个Star支持一下吧 (☆▽☆) +

+ +

+QQ群:1022221898 或者 +添加作者微信,备注MPJ,加入微信群 +
+添加作者微信,备注MPJ,加入微信群 +

+ +### 使用文档WIKI + +## 使用方法 + +### 安装 + +- Maven + ```xml + + com.github.yulichang + mybatis-plus-join-boot-starter + 1.4.7.2 + + ``` +- Gradle + ``` + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.1' + ``` + 或者clone代码到本地执行 mvn install, 再引入以上依赖 +
+ 注意: MyBatis Plus版本需要3.3.0+ +
+ +### 使用 + +* mapper继承MPJBaseMapper (必选) +* service继承MPJBaseService (可选) +* serviceImpl继承MPJBaseServiceImpl (可选) + +### Lambda形式用法(MPJLambdaWrapper) + +#### 简单的连表查询 + +```java +class test { + @Resource + private UserMapper userMapper; + + void testJoin() { + //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class)//查询user表全部字段 + .select(UserAddressDO::getTel)//查询user_address tel 字段 + .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名 + .select(AreaDO::getProvince, AreaDO::getCity) + .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId) + .eq(UserDO::getId, 1) + .like(UserAddressDO::getTel, "1") + .gt(UserDO::getId, 5); + + //连表查询 返回自定义ResultType + List list = userMapper.selectJoinList(UserDTO.class, wrapper); + + //分页查询 (需要启用 mybatis plus 分页插件) + Page listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper); + } +} +``` + +对应sql + +``` +SELECT + t.id, t.name, t.sex, t.head_img, + t1.tel, t1.address AS userAddress, + t2.province, t2.city +FROM + user t + LEFT JOIN user_address t1 ON t1.user_id = t.id + LEFT JOIN area t2 ON t2.id = t1.area_id +WHERE ( + t.id = ? + AND t1.tel LIKE ? + AND t.id > ?) +``` + +说明: + +* UserDTO.class 查询结果返回类(resultType) +* selectAll() 查询指定实体类的全部字段 +* select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段 +* selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用 +* leftJoin() 参数说明 + 第一个参数: 参与连表的实体类class + 第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性 + 第三个参数: 参与连表的ON的另一个实体类属性 +* 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3.... +* 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险 + +#### 一对多查询 + +```java +class test { + @Resource + private UserMapper userMapper; + + @Test + void testResultMap() { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(User.class) + .selectAll(UserDO.class) + //对多查询 + .selectCollection(AddressDO.class, UesrDTO::getAddressList) + //对一查询 + .selectAssociation(AddressDO.class, UesrDTO::getAddress) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId); + + List dtoList = userMapper.selectJoinList(UserDTO.class, wrapper); + + //关于对多分页查询 + //由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。 + } +} +``` + +MPJLambdaWrapper其他功能 + +* + 一对一,一对多使用 +* 简单的SQL函数使用 +* ON语句多条件支持 +* 其他全部功能请参考使用文档 + +# 使用文档 wiki diff --git a/README.md b/README.md index 9890240..1acaf01 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,7 @@

QQ群:1022221898 或者 -添加作者微信,备注MPJ,加入微信群 -
-添加作者微信,备注MPJ,加入微信群 +添加作者微信,备注MPJ,加入微信群

### 使用文档WIKI From 6a721e9dc00c35b34e07d73753e1c58dfd9ec19f Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 2 Nov 2023 10:04:35 +0800 Subject: [PATCH 14/88] readme --- README-zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-zh.md b/README-zh.md index 261dc2d..c8e4c5c 100644 --- a/README-zh.md +++ b/README-zh.md @@ -49,7 +49,7 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.2 + 1.4.7.1 ``` - Gradle From 863ab1942e87d83bf7f278fd89e1b01abac9ab60 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:22:54 +0800 Subject: [PATCH 15/88] =?UTF-8?q?pom=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis-plus-join-adapter-base/pom.xml | 4 +- .../mybatis-plus-join-adapter-v33x/pom.xml | 6 +-- .../mybatis-plus-join-adapter-v3431/pom.xml | 6 +-- .../mybatis-plus-join-adapter-v352/pom.xml | 4 +- mybatis-plus-join-adapter/pom.xml | 12 +----- mybatis-plus-join-annotation/pom.xml | 4 +- mybatis-plus-join-boot-starter/pom.xml | 16 ++------ mybatis-plus-join-core/pom.xml | 22 +++-------- mybatis-plus-join-extension/pom.xml | 6 +-- mybatis-plus-join-test/pom.xml | 5 ++- mybatis-plus-join-test/test-base/pom.xml | 4 +- .../test-collection/pom.xml | 4 +- mybatis-plus-join-test/test-join/pom.xml | 13 ++++++- mybatis-plus-join-test/test-kotlin/pom.xml | 4 +- mybatis-plus-join-test/test-mapping/pom.xml | 4 +- .../test-springboot3-jdk17/pom.xml | 4 +- mybatis-plus-join/pom.xml | 38 +++++++++++++++++-- pom.xml | 34 ++++++++++++++++- 18 files changed, 118 insertions(+), 72 deletions(-) diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index 5d1415a..f3e8c2a 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-base - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-base An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml index af5d43d..a1e2238 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v33x - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v33x An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.7.1 + ${revision} com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml index 01a9e3f..1e15545 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v3431 - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v3431 An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-adapter-base - 1.4.7.1 + ${revision} com.baomidou diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml index 17c3240..6613bc5 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v352/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-adapter - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v352 - 1.4.7.1 + ${revision} mybatis-plus-join-adapter-v352 An enhanced toolkit of Mybatis-Plus to simplify development. diff --git a/mybatis-plus-join-adapter/pom.xml b/mybatis-plus-join-adapter/pom.xml index 2748f33..d0df29f 100644 --- a/mybatis-plus-join-adapter/pom.xml +++ b/mybatis-plus-join-adapter/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7.1 + ${revision} pom - 1.4.7.1 + ${revision} mybatis-plus-join-adapter mybatis-plus-join-adapter @@ -40,12 +40,4 @@ https://github.com/yulichang/mybatis-plus-join - - 1.8 - 1.8 - 1.8 - 1.8 - github - UTF-8 - diff --git a/mybatis-plus-join-annotation/pom.xml b/mybatis-plus-join-annotation/pom.xml index ccc0e0f..c913b49 100644 --- a/mybatis-plus-join-annotation/pom.xml +++ b/mybatis-plus-join-annotation/pom.xml @@ -7,9 +7,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7.1 + ${revision} - 1.4.7.1 + ${revision} mybatis-plus-join-annotation mybatis-plus-join-annotation diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index 53457b4..b22265d 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -1,5 +1,4 @@ - @@ -7,9 +6,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7.1 + ${revision} - 1.4.7.1 + ${revision} mybatis-plus-join-boot-starter mybatis-plus-join-boot-starter @@ -34,20 +33,11 @@ https://github.com/yulichang/mybatis-plus-join - - 1.8 - 1.8 - 1.8 - 1.8 - github - UTF-8 - - com.github.yulichang mybatis-plus-join-extension - 1.4.7.1 + ${revision} org.springframework.boot diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index f570f35..cfb8176 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -1,5 +1,4 @@ - @@ -7,9 +6,9 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7.1 + ${revision} - 1.4.7.1 + ${revision} mybatis-plus-join-core mybatis-plus-join-core @@ -34,35 +33,26 @@ https://github.com/yulichang/mybatis-plus-join - - 1.8 - 1.8 - 1.8 - 1.8 - github - UTF-8 - - com.github.yulichang mybatis-plus-join-annotation - 1.4.7.1 + ${revision} com.github.yulichang mybatis-plus-join-adapter-v33x - 1.4.7.1 + ${revision} com.github.yulichang mybatis-plus-join-adapter-v3431 - 1.4.7.1 + ${revision} com.github.yulichang mybatis-plus-join-adapter-v352 - 1.4.7.1 + ${revision} com.baomidou diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index dd5650a..3ba1294 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -6,10 +6,10 @@ com.github.yulichang mybatis-plus-join-root - 1.4.7.1 + ${revision} mybatis-plus-join-extension - 1.4.7.1 + ${revision} mybatis-plus-join-extension An enhanced toolkit of Mybatis-Plus to simplify development. @@ -46,7 +46,7 @@ com.github.yulichang mybatis-plus-join-core - 1.4.7.1 + ${revision} com.baomidou diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index e8ac9ea..27cb2c0 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -13,7 +13,7 @@ com.github.yulichang mybatis-plus-join-test pom - 1.4.7.1 + ${revision} mybatis-plus-join-test @@ -56,6 +56,7 @@ 1.8 github UTF-8 + 1.4.7.2 @@ -82,7 +83,7 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.1 + ${revision} com.fasterxml.jackson.core diff --git a/mybatis-plus-join-test/test-base/pom.xml b/mybatis-plus-join-test/test-base/pom.xml index 1d229e8..a49d735 100644 --- a/mybatis-plus-join-test/test-base/pom.xml +++ b/mybatis-plus-join-test/test-base/pom.xml @@ -5,10 +5,10 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7.1 + ${revision} test-base - 1.4.7.1 + ${revision} test-base test-base diff --git a/mybatis-plus-join-test/test-collection/pom.xml b/mybatis-plus-join-test/test-collection/pom.xml index 70d5cb3..fdfa797 100644 --- a/mybatis-plus-join-test/test-collection/pom.xml +++ b/mybatis-plus-join-test/test-collection/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7.1 + ${revision} 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7.1 + ${revision} diff --git a/mybatis-plus-join-test/test-join/pom.xml b/mybatis-plus-join-test/test-join/pom.xml index 460f033..b810fcd 100644 --- a/mybatis-plus-join-test/test-join/pom.xml +++ b/mybatis-plus-join-test/test-join/pom.xml @@ -6,7 +6,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7.1 + ${revision} 4.0.0 @@ -22,7 +22,16 @@ com.github.yulichang test-base - 1.4.7.1 + ${revision} + + + com.mysql + mysql-connector-j + 8.0.32 + + + com.fasterxml.jackson.core + jackson-core diff --git a/mybatis-plus-join-test/test-kotlin/pom.xml b/mybatis-plus-join-test/test-kotlin/pom.xml index 56d681b..7ba0c34 100644 --- a/mybatis-plus-join-test/test-kotlin/pom.xml +++ b/mybatis-plus-join-test/test-kotlin/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-test - 1.4.7.1 + ${revision} test-kotlin @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7.1 + ${revision} com.mysql diff --git a/mybatis-plus-join-test/test-mapping/pom.xml b/mybatis-plus-join-test/test-mapping/pom.xml index a751e70..f481a1c 100644 --- a/mybatis-plus-join-test/test-mapping/pom.xml +++ b/mybatis-plus-join-test/test-mapping/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.7.1 + ${revision} 4.0.0 @@ -22,7 +22,7 @@ com.github.yulichang test-base - 1.4.7.1 + ${revision} diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml index 23b1217..fbdd336 100644 --- a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml +++ b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml @@ -6,7 +6,7 @@ mybatis-plus-join-test com.github.yulichang - 1.4.7.1 + ${revision} 4.0.0 @@ -47,7 +47,7 @@ com.github.yulichang test-base - 1.4.7.1 + ${revision} diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index fad59a0..5925a3c 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -10,13 +10,13 @@ com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.1 + 最新版本 --> 4.0.0 com.github.yulichang mybatis-plus-join - 1.4.7.1 + ${revision} mybatis-plus-join An enhanced toolkit of Mybatis-Plus to simplify development. @@ -47,13 +47,45 @@ 1.8 github UTF-8 + 1.4.7.2 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.1 + ${revision} + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.5.0 + + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + diff --git a/pom.xml b/pom.xml index a14c1d9..5b8e0d1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.yulichang mybatis-plus-join-root pom - 1.4.7.1 + ${revision} mybatis-plus-join-root An enhanced toolkit of Mybatis-Plus to simplify development. @@ -45,5 +45,37 @@ 1.8 github UTF-8 + 1.4.7.2 + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.5.0 + + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + From b6098167c6a0f279ceeceab7dfb2b684c2f96bba Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:27:55 +0800 Subject: [PATCH 16/88] =?UTF-8?q?=E5=8D=87=E7=BA=A7MP=20->=203.5.4.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis-plus-join-adapter-base/pom.xml | 2 +- mybatis-plus-join-boot-starter/pom.xml | 2 +- mybatis-plus-join-extension/pom.xml | 2 +- mybatis-plus-join-test/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index f3e8c2a..485295d 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -46,7 +46,7 @@ com.baomidou mybatis-plus-extension - 3.5.4 + 3.5.4.1 provided diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index b22265d..dca2162 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -48,7 +48,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.4 + 3.5.4.1 provided diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index 3ba1294..dafd3bd 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -51,7 +51,7 @@ com.baomidou mybatis-plus-extension - 3.5.4 + 3.5.4.1 provided diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 27cb2c0..fc115aa 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -93,7 +93,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.4 + 3.5.4.1 org.springframework From 7c9e77f828ef4f52e29090b28a8b232df5cd51ef Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:29:48 +0800 Subject: [PATCH 17/88] =?UTF-8?q?=E6=96=B0=E5=A2=9EtoChildren=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/yulichang/toolkit/Ref.java | 9 +++++++++ .../yulichang/wrapper/MPJAbstractWrapper.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/Ref.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/Ref.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/Ref.java new file mode 100644 index 0000000..a890ca4 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/Ref.java @@ -0,0 +1,9 @@ +package com.github.yulichang.toolkit; + +/** + * @author yulichang + * @since 1.4.7.2 + */ +@SuppressWarnings("unused") +public class Ref { +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index 768b9bb..78329a3 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.MPJSqlInjectionUtils; +import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; import com.github.yulichang.wrapper.enums.PrefixEnum; @@ -24,6 +25,8 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiPredicate; import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; @@ -141,6 +144,21 @@ public abstract class MPJAbstractWrapper C toChildren(Ref children) { + return (C) this; + } + + /** + * 转为子类,方便自定义继承扩展 + * 需要子类自定义字段 + */ + public C toChildren(Supplier s) { + return (C) this; + } + /** * 开启检查 SQL 注入 */ From 6e06a04fd9fed1a8e9913c4bdc6bcf7ae05d3a6b Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:30:28 +0800 Subject: [PATCH 18/88] =?UTF-8?q?fix=20=E7=A7=BB=E9=99=A4union=20all?= =?UTF-8?q?=E6=B3=9B=E5=9E=8B=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/yulichang/wrapper/MPJLambdaWrapper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index e3f8338..bdf1c8d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -245,8 +245,8 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper unionAll(MPJLambdaWrapper... wrappers) { + @SuppressWarnings("UnusedReturnValue") + public final MPJLambdaWrapper unionAll(MPJLambdaWrapper... wrappers) { StringBuilder sb = new StringBuilder(); for (MPJLambdaWrapper wrapper : wrappers) { addCustomWrapper(wrapper); From 5251af216ef96c3ac1318af3b40cb4cef10d1282 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:30:59 +0800 Subject: [PATCH 19/88] =?UTF-8?q?=E5=8D=87=E7=BA=A7MP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-plus-join-core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index cfb8176..08d4e8a 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -57,7 +57,7 @@ com.baomidou mybatis-plus-extension - 3.5.4 + 3.5.4.1 provided From 5a7d561367157b8cb263edbdbadc085506ab2caf Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:31:27 +0800 Subject: [PATCH 20/88] test --- .../test/join/LambdaWrapperTest.java | 24 ++++++- .../test/join/m/CustomWrapperTest.java | 63 +++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index c6a7f22..752716b 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -62,18 +62,18 @@ class LambdaWrapperTest { } @Test - void testSelectSort(){ + void testSelectSort() { ThreadLocalUtils.set("SELECT t.id, t.user_id, t.tenant_id FROM user_tenant t WHERE t.tenant_id = 1"); MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class); lambda.selectAsClass(UserTenantDO.class, UserTenantDTO.class); - List list = userTenantMapper.selectJoinList(UserTenantDO.class,lambda); + List list = userTenantMapper.selectJoinList(UserTenantDO.class, lambda); assert list.size() == 5 && list.get(0).getIdea() != null; ThreadLocalUtils.set("SELECT t.tenant_id, t.user_id, t.id FROM user_tenant t WHERE t.tenant_id = 1"); MPJLambdaWrapper lambda1 = JoinWrappers.lambda(UserTenantDO.class); lambda1.selectAsClass(UserTenantDO.class, UserTenantDescDTO.class); - List list1 = userTenantMapper.selectJoinList(UserTenantDO.class,lambda1); + List list1 = userTenantMapper.selectJoinList(UserTenantDO.class, lambda1); assert list1.size() == 5 && list1.get(0).getIdea() != null; } @@ -1134,4 +1134,22 @@ class LambdaWrapperTest { assert list.size() == 7; } + + @Test + void unionAll() { + ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t UNION ALL SELECT t.id FROM area t WHERE t.del = false AND (t.id = ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .select(UserDO::getId) + .eq(UserDO::getId, 1); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(AddressDO.class) + .select(AddressDO::getId) + .disableLogicDel(); + MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(AreaDO.class) + .select(AreaDO::getId) + .eq(AreaDO::getId, 2); + wrapper.unionAll(wrapper1, wrapper2); + List list = wrapper.list(); + + assert list.size() == 23 && list.get(0).getId() != null; + } } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java new file mode 100644 index 0000000..7808b7f --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java @@ -0,0 +1,63 @@ +package com.github.yulichang.test.join.m; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.Ref; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Objects; + +@SpringBootTest +public class CustomWrapperTest { + + @Autowired + private UserMapper userMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + //自定义wrapper扩展 + public static class CWrapper extends MPJLambdaWrapper { + + public static CWrapper toCWrapper() { + return null; + } + + public CWrapper eqIfAbsent(SFunction column, Object val) { + super.eq(Objects.nonNull(val), column, val); + return this; + } + } + + @Test + void testWrapperCustomer() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.id = ?)"); + CWrapper wrapper = new CWrapper() + .selectAll(UserDO.class) +// .toChildren(new Ref>()) + .toChildren(CWrapper::toCWrapper) + .eqIfAbsent(UserDO::getId, 1); + List dos = userMapper.selectList(wrapper); + dos.forEach(System.out::println); + + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false"); + CWrapper wrapper1 = new CWrapper() + .selectAll(UserDO.class) + .toChildren(new Ref>()) +// .toChildren(CWrapper::toCWrapper) + .eqIfAbsent(UserDO::getId, null); + List dos1 = userMapper.selectList(wrapper1); + dos1.forEach(System.out::println); + } +} From 7ca1b4fad7422fa9fa1f564493c650b8e2876e54 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 20:33:49 +0800 Subject: [PATCH 21/88] 1.4.7.2 --- README-zh.md | 4 ++-- README.md | 4 ++-- .../com/github/yulichang/config/MPJInterceptorConfig.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README-zh.md b/README-zh.md index c8e4c5c..1d225fb 100644 --- a/README-zh.md +++ b/README-zh.md @@ -49,12 +49,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.1 + 1.4.7.2 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.1' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.2' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/README.md b/README.md index 1acaf01..e49dc07 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.1 + 1.4.7.2 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.1' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.2' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index c1ea47b..b2853dc 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.7.1"); + " 1.4.7.2"); } } From 0269e57a170621d76d6e89b4ca59595ef2043c85 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 15 Nov 2023 22:44:36 +0800 Subject: [PATCH 22/88] =?UTF-8?q?pom=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis-plus-join-adapter-base/pom.xml | 12 +------ mybatis-plus-join-boot-starter/pom.xml | 4 +-- mybatis-plus-join-core/pom.xml | 5 +-- .../yulichang/injector/MPJSqlInjector.java | 2 +- mybatis-plus-join-extension/pom.xml | 3 +- mybatis-plus-join-test/pom.xml | 8 +++-- mybatis-plus-join/pom.xml | 3 +- pom.xml | 35 +++++++++++++++++-- 8 files changed, 45 insertions(+), 27 deletions(-) diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml index 485295d..f1f69ec 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/pom.xml @@ -33,26 +33,16 @@ https://github.com/yulichang/mybatis-plus-join - - 1.8 - 1.8 - 1.8 - 1.8 - github - UTF-8 - - com.baomidou mybatis-plus-extension - 3.5.4.1 + ${mpj.mybatis.plus.version} provided org.projectlombok lombok - 1.18.28 provided diff --git a/mybatis-plus-join-boot-starter/pom.xml b/mybatis-plus-join-boot-starter/pom.xml index dca2162..6da5532 100644 --- a/mybatis-plus-join-boot-starter/pom.xml +++ b/mybatis-plus-join-boot-starter/pom.xml @@ -43,18 +43,16 @@ org.springframework.boot spring-boot-configuration-processor true - 2.7.5
com.baomidou mybatis-plus-boot-starter - 3.5.4.1 + ${mpj.mybatis.plus.version} provided org.projectlombok lombok - 1.18.28 provided diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index 08d4e8a..6a67863 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -57,25 +57,22 @@ com.baomidou mybatis-plus-extension - 3.5.4.1 + ${mpj.mybatis.plus.version} provided org.projectlombok lombok - 1.18.28 provided org.springframework spring-aop - 5.3.29 provided org.jetbrains.kotlin kotlin-stdlib-jdk8 - 1.9.0 provided diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index b51e61c..dba5c61 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -56,7 +56,7 @@ public class MPJSqlInjector extends DefaultSqlInjector { * 升级到 mybatis plus 3.4.3.2 后对之前的版本兼容 */ @Deprecated - @SuppressWarnings({"unused", "DeprecatedIsStillUsed"}) + @SuppressWarnings({"unused"}) public List getMethodList(Class mapperClass) { if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.2") >= 0) { throw ExceptionUtils.mpe("DefaultSqlInjector 的 getMethodList(Class mapperClass) 方法已在 3.4.3.2+ 改为" + diff --git a/mybatis-plus-join-extension/pom.xml b/mybatis-plus-join-extension/pom.xml index dafd3bd..52fafa0 100644 --- a/mybatis-plus-join-extension/pom.xml +++ b/mybatis-plus-join-extension/pom.xml @@ -51,13 +51,12 @@ com.baomidou mybatis-plus-extension - 3.5.4.1 + ${mpj.mybatis.plus.version} provided org.projectlombok lombok - 1.18.28 provided diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index fc115aa..f46b7e0 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -50,13 +50,15 @@ + 1.4.7.2 + 3.5.4.1 + 1.8 1.8 1.8 1.8 github UTF-8 - 1.4.7.2 @@ -78,7 +80,7 @@ org.projectlombok lombok - 1.18.28 + 1.18.30 com.github.yulichang @@ -93,7 +95,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.4.1 + ${mpj.mybatis.plus.version} org.springframework diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 5925a3c..6b3d6ea 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -41,13 +41,14 @@ + 1.4.7.2 + 1.8 1.8 1.8 1.8 github UTF-8 - 1.4.7.2 diff --git a/pom.xml b/pom.xml index 5b8e0d1..5f059c2 100644 --- a/pom.xml +++ b/pom.xml @@ -35,19 +35,50 @@ mybatis-plus-join-core mybatis-plus-join-annotation mybatis-plus-join-extension - mybatis-plus-join-test + + 1.4.7.2 + 3.5.4.1 + 1.8 1.8 1.8 1.8 github UTF-8 - 1.4.7.2 + + + + org.projectlombok + lombok + 1.18.30 + provided + + + org.springframework + spring-aop + 5.3.30 + provided + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.9.0 + provided + + + org.springframework.boot + spring-boot-configuration-processor + true + 2.7.17 + + + + From 818fdb919179f10714eea79339b6587973434d18 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 16 Nov 2023 00:23:13 +0800 Subject: [PATCH 23/88] 1.4.7.2 --- .../main/java/com/github/yulichang/injector/MPJSqlInjector.java | 2 +- .../java/com/github/yulichang/wrapper/MPJAbstractWrapper.java | 1 - pom.xml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index dba5c61..b51e61c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -56,7 +56,7 @@ public class MPJSqlInjector extends DefaultSqlInjector { * 升级到 mybatis plus 3.4.3.2 后对之前的版本兼容 */ @Deprecated - @SuppressWarnings({"unused"}) + @SuppressWarnings({"unused", "DeprecatedIsStillUsed"}) public List getMethodList(Class mapperClass) { if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.2") >= 0) { throw ExceptionUtils.mpe("DefaultSqlInjector 的 getMethodList(Class mapperClass) 方法已在 3.4.3.2+ 改为" + diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index 78329a3..84a669b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -25,7 +25,6 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiPredicate; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; diff --git a/pom.xml b/pom.xml index 5f059c2..a737b3a 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ mybatis-plus-join-core mybatis-plus-join-annotation mybatis-plus-join-extension - + mybatis-plus-join-test From 064c0e3bd2a24927938bc6a97cf492102b29ce07 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 16 Nov 2023 01:56:27 +0800 Subject: [PATCH 24/88] fix https://github.com/yulichang/mybatis-plus-join/issues/91 --- .../yulichang/toolkit/FieldStringMap.java | 23 +++++++++++++++++++ .../yulichang/toolkit/MPJReflectionKit.java | 4 ++-- .../toolkit/support/ColumnCache.java | 12 ++++++---- 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java new file mode 100644 index 0000000..09003ec --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java @@ -0,0 +1,23 @@ +package com.github.yulichang.toolkit; + +import java.util.HashMap; +import java.util.Objects; + +/** + * @author yulichang + * @see HashMap + * @since 1.4.7.3 + */ +public class FieldStringMap extends HashMap { + + @Override + public V get(Object key) { + V v = super.get(key); + if (Objects.isNull(v)) { + String k = (String) key; + return entrySet().stream().filter(f -> k.equalsIgnoreCase(f.getKey())).findFirst() + .map(Entry::getValue).orElse(null); + } + return v; + } +} \ No newline at end of file diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java index 3276d5f..8c7f477 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java @@ -22,7 +22,7 @@ import java.util.stream.Collectors; @SuppressWarnings("unused") public final class MPJReflectionKit { - private static final Map, Map> CLASS_FIELD_CACHE = new ConcurrentHashMap<>(); + private static final Map, FieldStringMap> CLASS_FIELD_CACHE = new ConcurrentHashMap<>(); private static final Map, List> CLASS_FIELD_LIST_CACHE = new ConcurrentHashMap<>(); private static final Map EMPTY_MAP = new HashMap<>(); @@ -78,7 +78,7 @@ public final class MPJReflectionKit { */ public static Map getFieldMap(Class clazz) { return CLASS_FIELD_CACHE.computeIfAbsent(clazz, key -> getFieldList(key).stream().collect(Collectors.toMap(f -> - f.getField().getName(), Function.identity()))); + f.getField().getName(), Function.identity(), (o, n) -> n, FieldStringMap::new))); } public static List getFieldList(Class clazz) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java index e4e09ea..220a503 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java @@ -3,6 +3,7 @@ package com.github.yulichang.toolkit.support; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.toolkit.Asserts; +import com.github.yulichang.toolkit.FieldStringMap; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.wrapper.segments.SelectCache; @@ -23,7 +24,7 @@ public class ColumnCache { private static final Map, List> LIST_CACHE = new ConcurrentHashMap<>(); - private static final Map, Map> MAP_CACHE = new ConcurrentHashMap<>(); + private static final Map, FieldStringMap> MAP_CACHE = new ConcurrentHashMap<>(); public static List getListField(Class clazz) { return LIST_CACHE.computeIfAbsent(clazz, c -> { @@ -31,14 +32,17 @@ public class ColumnCache { Asserts.hasTable(tableInfo, c); List list = new ArrayList<>(); if (ConfigProperties.tableInfoAdapter.mpjHasPK(tableInfo)) { - list.add(new SelectCache(clazz, true, tableInfo.getKeyColumn(), tableInfo.getKeyType(), tableInfo.getKeyProperty(), null)); + list.add(new SelectCache(clazz, true, tableInfo.getKeyColumn(), tableInfo.getKeyType(), + tableInfo.getKeyProperty(), null)); } - list.addAll(tableInfo.getFieldList().stream().map(f -> new SelectCache(clazz, false, f.getColumn(), f.getPropertyType(), f.getProperty(), f)).collect(Collectors.toList())); + list.addAll(tableInfo.getFieldList().stream().map(f -> new SelectCache(clazz, false, f.getColumn(), + f.getPropertyType(), f.getProperty(), f)).collect(Collectors.toList())); return list; }); } public static Map getMapField(Class clazz) { - return MAP_CACHE.computeIfAbsent(clazz, c -> getListField(c).stream().collect(Collectors.toMap(SelectCache::getColumProperty, Function.identity(), (i, j) -> j))); + return MAP_CACHE.computeIfAbsent(clazz, c -> getListField(c).stream().collect(Collectors.toMap( + SelectCache::getColumProperty, Function.identity(), (i, j) -> j, FieldStringMap::new))); } } From ab27be7f817c761461d27871fcd2e7e7c62d2431 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 16 Nov 2023 20:29:41 +0800 Subject: [PATCH 25/88] fix https://github.com/yulichang/mybatis-plus-join/issues/92 --- .../java/com/github/yulichang/interceptor/MPJInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index 696d21a..3d7bf01 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -427,7 +427,7 @@ public class MPJInterceptor implements Interceptor { public Object plugin(Object target) { try { return Interceptor.super.plugin(target); - } catch (Exception e) { + } catch (Throwable e) { return Plugin.wrap(target, this); } } From 40006863f6cbaaef0904e8757b68bbfb5a03d423 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 17 Nov 2023 04:18:01 +0800 Subject: [PATCH 26/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 15 +++++++++++++++ .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 15 +++++++++++++++ .github/ISSUE_TEMPLATE.zh-CN | 15 +++++++++++++++ .github/PULL_REQUEST_TEMPLATE.zh-CN | 15 +++++++++++++++ .github/dependabot.yml | 11 +++++++++++ 5 files changed, 71 insertions(+) create mode 100644 .gitee/ISSUE_TEMPLATE.zh-CN.md create mode 100644 .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md create mode 100644 .github/ISSUE_TEMPLATE.zh-CN create mode 100644 .github/PULL_REQUEST_TEMPLATE.zh-CN create mode 100644 .github/dependabot.yml diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..59a9fc0 --- /dev/null +++ b/.gitee/ISSUE_TEMPLATE.zh-CN.md @@ -0,0 +1,15 @@ +### 当前使用版本(必填,否则不予处理) + + + +### 该问题是如何引起的?(确定最新版也有问题再提!!!) + + + +### 重现步骤(如果有就写完整) + + + +### 报错信息 + + diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..061a184 --- /dev/null +++ b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,15 @@ +### 该Pull Request关联的Issue + + + +### 修改描述 + + + +### 测试用例 + + + +### 修复效果的截屏 + + diff --git a/.github/ISSUE_TEMPLATE.zh-CN b/.github/ISSUE_TEMPLATE.zh-CN new file mode 100644 index 0000000..59a9fc0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.zh-CN @@ -0,0 +1,15 @@ +### 当前使用版本(必填,否则不予处理) + + + +### 该问题是如何引起的?(确定最新版也有问题再提!!!) + + + +### 重现步骤(如果有就写完整) + + + +### 报错信息 + + diff --git a/.github/PULL_REQUEST_TEMPLATE.zh-CN b/.github/PULL_REQUEST_TEMPLATE.zh-CN new file mode 100644 index 0000000..061a184 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.zh-CN @@ -0,0 +1,15 @@ +### 该Pull Request关联的Issue + + + +### 修改描述 + + + +### 测试用例 + + + +### 修复效果的截屏 + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..14fc3a4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "gradle" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From 7b33070fa46ec9d043c171a2e9379e771a0dceca Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 17 Nov 2023 06:54:58 +0800 Subject: [PATCH 27/88] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/toolkit/FieldStringMap.java | 15 +++--- .../github/yulichang/toolkit/LambdaUtils.java | 18 ++----- .../yulichang/toolkit/MPJReflectionKit.java | 2 +- .../toolkit/support/ColumnCache.java | 4 +- .../extension/mapping/relation/Relation.java | 11 ++--- .../yulichang/test/join/entity/AreaDO.java | 2 +- .../yulichang/test/join/m/FieldNameTest.java | 47 +++++++++++++++++++ 7 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldNameTest.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java index 09003ec..51d6f5a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java @@ -1,7 +1,7 @@ package com.github.yulichang.toolkit; import java.util.HashMap; -import java.util.Objects; +import java.util.Locale; /** * @author yulichang @@ -12,12 +12,11 @@ public class FieldStringMap extends HashMap { @Override public V get(Object key) { - V v = super.get(key); - if (Objects.isNull(v)) { - String k = (String) key; - return entrySet().stream().filter(f -> k.equalsIgnoreCase(f.getKey())).findFirst() - .map(Entry::getValue).orElse(null); - } - return v; + return super.get(((String) key).toUpperCase(Locale.ENGLISH)); + } + + @Override + public boolean containsKey(Object key) { + return super.containsKey(((String) key).toUpperCase(Locale.ENGLISH)); } } \ No newline at end of file diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java index 4d12ebe..4b2cffd 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LambdaUtils.java @@ -2,32 +2,24 @@ package com.github.yulichang.toolkit; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.yulichang.toolkit.support.*; +import com.github.yulichang.toolkit.support.IdeaProxyLambdaMeta; +import com.github.yulichang.toolkit.support.LambdaMeta; +import com.github.yulichang.toolkit.support.ReflectLambdaMeta; +import com.github.yulichang.toolkit.support.ShadowLambdaMeta; import org.apache.ibatis.reflection.property.PropertyNamer; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.Map; /** * copy {@link com.baomidou.mybatisplus.core.toolkit.LambdaUtils} */ -@SuppressWarnings("unused") public final class LambdaUtils { public static String getName(SFunction fn) { LambdaMeta extract = extract(fn); - String name = PropertyNamer.methodToProperty(extract.getImplMethodName()); - if (Character.isUpperCase(name.charAt(0))) { - Map map = MPJReflectionKit.getFieldMap(extract.getInstantiatedClass()); - if (map.containsKey(name)) { - return name; - } else { - return map.keySet().stream().filter(i -> i.equalsIgnoreCase(name)).findFirst().orElse(null); - } - } - return name; + return PropertyNamer.methodToProperty(extract.getImplMethodName()); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java index 8c7f477..cfefb68 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJReflectionKit.java @@ -78,7 +78,7 @@ public final class MPJReflectionKit { */ public static Map getFieldMap(Class clazz) { return CLASS_FIELD_CACHE.computeIfAbsent(clazz, key -> getFieldList(key).stream().collect(Collectors.toMap(f -> - f.getField().getName(), Function.identity(), (o, n) -> n, FieldStringMap::new))); + f.getField().getName().toUpperCase(Locale.ENGLISH), Function.identity(), (o, n) -> n, FieldStringMap::new))); } public static List getFieldList(Class clazz) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java index 220a503..214e037 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java @@ -9,6 +9,7 @@ import com.github.yulichang.wrapper.segments.SelectCache; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @@ -43,6 +44,7 @@ public class ColumnCache { public static Map getMapField(Class clazz) { return MAP_CACHE.computeIfAbsent(clazz, c -> getListField(c).stream().collect(Collectors.toMap( - SelectCache::getColumProperty, Function.identity(), (i, j) -> j, FieldStringMap::new))); + i -> i.getColumProperty().toUpperCase(Locale.ENGLISH), + Function.identity(), (i, j) -> j, FieldStringMap::new))); } } diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/relation/Relation.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/relation/Relation.java index cda9dca..86375ad 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/relation/Relation.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/relation/Relation.java @@ -11,10 +11,7 @@ import com.github.yulichang.extension.mapping.mapper.MPJTableInfoHelper; import com.github.yulichang.extension.mapping.wrapper.MappingQuery; import com.github.yulichang.toolkit.LambdaUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @SuppressWarnings("unchecked") @@ -80,10 +77,10 @@ public class Relation { MPJTableInfo tableInfo = MPJTableInfoHelper.getTableInfo(entityClass); if (tableInfo.isHasMappingOrField()) { boolean hasProperty = CollectionUtils.isNotEmpty(config.getProperty()); - List listProperty = hasProperty ? config.getProperty().stream().map(LambdaUtils::getName).collect( - Collectors.toList()) : null; + List listProperty = hasProperty ? config.getProperty().stream().map(i -> + LambdaUtils.getName(i).toUpperCase(Locale.ENGLISH)).collect(Collectors.toList()) : null; for (MPJTableFieldInfo fieldInfo : tableInfo.getFieldList()) { - if (!hasProperty || listProperty.contains(fieldInfo.getProperty())) { + if (!hasProperty || listProperty.contains(fieldInfo.getProperty().toUpperCase(Locale.ENGLISH))) { List itemList = data.stream().map(fieldInfo::thisFieldGet).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(itemList)) { List joinList = MappingQuery.mpjQueryList(fieldInfo.getJoinMapper(), SqlKeyword.IN, diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/AreaDO.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/AreaDO.java index fcc3272..ca6252b 100644 --- a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/AreaDO.java +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/entity/AreaDO.java @@ -26,7 +26,7 @@ public class AreaDO implements Serializable { private String area; - private String postcode; + private String Postcode; @TableLogic private Boolean del; diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldNameTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldNameTest.java new file mode 100644 index 0000000..1ac9467 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldNameTest.java @@ -0,0 +1,47 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.dto.AreaDTO; +import com.github.yulichang.test.join.entity.AreaDO; +import com.github.yulichang.test.join.entity.UserDto; +import com.github.yulichang.test.join.mapper.AreaMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.toolkit.JoinWrappers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class FieldNameTest { + + @Autowired + private AreaMapper areaMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + @Test + void testFieldName() { + List list = areaMapper.selectJoinList(AreaDO.class, JoinWrappers.lambda(AreaDO.class) + .select(AreaDO::getPostcode) + .leftJoin(UserDto.class,UserDto::getId,AreaDO::getId)); + + list.forEach(System.out::println); + assert list.get(0).getPostcode() != null; + } + + @Test + void testFieldName1() { + List list = areaMapper.selectJoinList(AreaDTO.class, JoinWrappers.lambda(AreaDO.class) + .selectAs(AreaDO::getPostcode,AreaDTO::getPostcode) + .leftJoin(UserDto.class,UserDto::getId,AreaDO::getId)); + + list.forEach(System.out::println); + assert list.get(0).getPostcode() != null; + } +} From 630c320cd322ee866a3d165a32e4770e7679d33c Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 17 Nov 2023 07:19:52 +0800 Subject: [PATCH 28/88] =?UTF-8?q?sql=E6=8D=A2=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/github/yulichang/method/DeleteJoin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/DeleteJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/DeleteJoin.java index 0548e55..332fcb9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/DeleteJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/DeleteJoin.java @@ -31,13 +31,13 @@ public class DeleteJoin extends MPJAbstractMethod { if (AdapterHelper.getTableInfoAdapter().mpjHasLogic(tableInfo)) { String sql = String.format(sqlMethod.getSql(), sqlFirst(), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), mpjDeleteLogic(tableInfo), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); } else { sqlMethod = SqlMethod.DELETE_JOIN; String sql = String.format(sqlMethod.getSql(), sqlFirst(), mpjDelete(), mpjTableName(tableInfo), sqlAlias(), sqlFrom(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, removeExtraWhitespaces(sql), modelClass); return this.addDeleteMappedStatement(mapperClass, sqlMethod.getMethod(), sqlSource); } } From aa0f9e87bf66e99eebde7fa9af2b3e29a9bc81ee Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 17 Nov 2023 23:41:14 +0800 Subject: [PATCH 29/88] =?UTF-8?q?fix=20selectSub=E5=A4=9A=E6=AC=A1?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=8A=A5=E9=94=99=E5=92=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?union?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/kt/KtAbstractWrapper.java | 18 +++- .../github/yulichang/kt/KtLambdaWrapper.java | 97 ++++++++++++++----- .../yulichang/toolkit/KtWrapperUtils.java | 7 +- .../yulichang/wrapper/MPJAbstractWrapper.java | 1 - .../yulichang/wrapper/MPJLambdaWrapper.java | 86 ++++++++++++---- .../test/join/LambdaWrapperTest.java | 65 ------------- .../yulichang/test/join/m/SelectSubTest.java | 51 ++++++++++ .../yulichang/test/join/m/UnionTest.java | 85 ++++++++++++++++ .../github/yulichang/test/kt/KtApplication.kt | 0 .../yulichang/test/kt/dto/AddressDTO.kt | 0 .../github/yulichang/test/kt/dto/AreaDTO.kt | 12 +++ .../github/yulichang/test/kt/dto/UserDTO.kt | 0 .../yulichang/test/kt/entity/AddressDO.kt | 0 .../test/kt/entity/AddressGeneric.kt | 0 .../github/yulichang/test/kt/entity/AreaDO.kt | 2 +- .../com/github/yulichang/test/kt/entity/ID.kt | 0 .../yulichang/test/kt/entity/OrderDO.kt | 0 .../github/yulichang/test/kt/entity/UserDO.kt | 0 .../yulichang/test/kt/entity/UserDto.kt | 0 .../yulichang/test/kt/entity/UserTTT.kt | 0 .../com/github/yulichang/test/kt/enums/Sex.kt | 0 .../yulichang/test/kt/mapper/AddressMapper.kt | 0 .../yulichang/test/kt/mapper/AreaMapper.kt | 0 .../yulichang/test/kt/mapper/MyBaseMapper.kt | 0 .../yulichang/test/kt/mapper/OrderMapper.kt | 0 .../yulichang/test/kt/mapper/UserDTOMapper.kt | 0 .../yulichang/test/kt/mapper/UserMapper.kt | 0 .../yulichang/test/kt/service/UserService.kt | 0 .../test/kt/service/impl/UserServiceImpl.kt | 0 .../github/yulichang/test/kt/dto/AreaDTO.kt | 12 --- .../yulichang/test/kt/LambdaWrapperTest.kt | 71 ++------------ .../yulichang/test/kt/m/CustomWrapperTest.kt | 57 +++++++++++ .../yulichang/test/kt/m/FieldNameTest.kt | 41 ++++++++ .../yulichang/test/kt/m/SelectSubTest.kt | 53 ++++++++++ .../github/yulichang/test/kt/m/UnionTest.kt | 83 ++++++++++++++++ 35 files changed, 554 insertions(+), 187 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/SelectSubTest.java create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/UnionTest.java rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/KtApplication.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/dto/AddressDTO.kt (100%) create mode 100644 mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AreaDTO.kt rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/dto/UserDTO.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/AddressDO.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/AddressGeneric.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/AreaDO.kt (93%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/ID.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/OrderDO.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/UserDO.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/UserDto.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/entity/UserTTT.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/enums/Sex.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/AddressMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/AreaMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/MyBaseMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/OrderMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/UserDTOMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/mapper/UserMapper.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/service/UserService.kt (100%) rename mybatis-plus-join-test/test-kotlin/src/main/{kotlin => java}/com/github/yulichang/test/kt/service/impl/UserServiceImpl.kt (100%) delete mode 100644 mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AreaDTO.kt rename mybatis-plus-join-test/test-kotlin/src/test/{ => java}/com/github/yulichang/test/kt/LambdaWrapperTest.kt (94%) create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/FieldNameTest.kt create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/SelectSubTest.kt create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/UnionTest.kt diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index 2c0f733..f4299ff 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -16,6 +16,7 @@ import com.github.yulichang.kt.interfaces.Func; import com.github.yulichang.kt.interfaces.OnCompare; import com.github.yulichang.toolkit.KtUtils; import com.github.yulichang.toolkit.MPJSqlInjectionUtils; +import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; import com.github.yulichang.wrapper.enums.PrefixEnum; @@ -29,6 +30,7 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiPredicate; import java.util.function.Consumer; +import java.util.function.Supplier; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; @@ -146,6 +148,21 @@ public abstract class KtAbstractWrapper C toChildren(Ref children) { + return (C) this; + } + + /** + * 转为子类,方便自定义继承扩展 + * 需要子类自定义字段 + */ + public C toChildren(Supplier s) { + return (C) this; + } + /** * 开启检查 SQL 注入 */ @@ -670,7 +687,6 @@ public abstract class KtAbstractWrapper extends KtAbstractLambdaWrapper> implements Query>, QueryLabel>, Chain, SelectWrapper> { @@ -205,11 +202,12 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, KProperty alias) { - KtLambdaWrapper wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null) { + public KtLambdaWrapper selectSub(Class clazz, String st, + Consumer> consumer, KProperty alias) { + KtLambdaWrapper wrapper = new KtLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, + paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias.getStringValue()), + SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new TableList(), + null, null, null, null) { }; wrapper.tableList.setAlias(st); wrapper.tableList.setRootClass(clazz); @@ -218,22 +216,29 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper KtWrapperUtils.buildSubSqlByWrapper(clazz, wrapper, alias.getName()), hasAlias, this.alias)); + this.selectColumns.add(new SelectSub(() -> KtWrapperUtils.buildSubSqlByWrapper( + clazz, wrapper, alias.getName()), hasAlias, this.alias)); return typedThis; } /** * union + *

+ * 推荐使用 union(Class clazz, Consumer> consumer) + * 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @see #union(Class, Consumer) + * @deprecated union 不支持子查询 */ - @SuppressWarnings("UnusedReturnValue") + @Deprecated + @SuppressWarnings("DeprecatedIsStillUsed") public final KtLambdaWrapper union(KtLambdaWrapper... wrappers) { StringBuilder sb = new StringBuilder(); for (KtLambdaWrapper wrapper : wrappers) { addCustomWrapper(wrapper); Class entityClass = wrapper.getEntityClass(); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); - sb.append(" UNION ") - .append(KtWrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); + sb.append(" UNION ").append(KtWrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); } if (Objects.isNull(unionSql)) { unionSql = SharedString.emptyString(); @@ -243,17 +248,45 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper + * 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @param clazz union语句的主表类型 + * @since 1.4.7.3 */ - @SafeVarargs - public final KtLambdaWrapper unionAll(KtLambdaWrapper... wrappers) { + public KtLambdaWrapper union(Class clazz, Consumer> consumer) { + KtLambdaWrapper unionWrapper = KtWrappers.query(clazz); + addCustomWrapper(unionWrapper); + consumer.accept(unionWrapper); + + String sb = " UNION " + KtWrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); + + if (Objects.isNull(unionSql)) { + unionSql = SharedString.emptyString(); + } + unionSql.setStringValue(unionSql.getStringValue() + sb); + return typedThis; + } + + /** + * union + *

+ * 推荐使用 unionAll(Class clazz, Consumer> consumer) + * 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @see #unionAll(Class, Consumer) + * @deprecated union 不支持子查询 + */ + @Deprecated + @SuppressWarnings("DeprecatedIsStillUsed") + public final KtLambdaWrapper unionAll(KtLambdaWrapper... wrappers) { StringBuilder sb = new StringBuilder(); for (KtLambdaWrapper wrapper : wrappers) { addCustomWrapper(wrapper); Class entityClass = wrapper.getEntityClass(); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); - sb.append(" UNION ALL ") - .append(KtWrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); + sb.append(" UNION ALL ").append(KtWrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); } if (Objects.isNull(unionSql)) { unionSql = SharedString.emptyString(); @@ -262,7 +295,28 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper + * 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @param clazz union语句的主表类型 + * @since 1.4.7.3 + */ + public KtLambdaWrapper unionAll(Class clazz, Consumer> consumer) { + KtLambdaWrapper unionWrapper = KtWrappers.query(clazz); + addCustomWrapper(unionWrapper); + consumer.accept(unionWrapper); + + String sb = " UNION ALL " + KtWrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); + + if (Objects.isNull(unionSql)) { + unionSql = SharedString.emptyString(); + } + unionSql.setStringValue(unionSql.getStringValue() + sb); + return typedThis; + } + private void addCustomWrapper(KtLambdaWrapper wrapper) { if (Objects.isNull(wrapperIndex)) { wrapperIndex = new AtomicInteger(0); @@ -280,7 +334,6 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper { @@ -349,7 +402,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new KtLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), + new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), this.tableList, index, keyWord, joinClass, tableName); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/KtWrapperUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/KtWrapperUtils.java index 4a3a96b..242fb92 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/KtWrapperUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/KtWrapperUtils.java @@ -16,9 +16,9 @@ import java.util.Optional; * @author yulichang * @since 1.4.6 */ +@SuppressWarnings("DuplicatedCode") public class KtWrapperUtils { - @SuppressWarnings("DuplicatedCode") public static String buildSubSqlByWrapper(Class clazz, KtLambdaWrapper wrapper, String alias) { TableInfo tableInfo = TableHelper.get(clazz); Asserts.hasTable(tableInfo, clazz); @@ -53,7 +53,6 @@ public class KtWrapperUtils { alias); } - @SuppressWarnings("DuplicatedCode") public static String buildUnionSqlByWrapper(Class clazz, KtLambdaWrapper wrapper) { TableInfo tableInfo = TableHelper.get(clazz); Asserts.hasTable(tableInfo, clazz); @@ -94,7 +93,6 @@ public class KtWrapperUtils { return SqlScriptUtils.safeParam(paramStr, null); } - @SuppressWarnings("DuplicatedCode") private static String getEntitySql(TableInfo tableInfo, KtLambdaWrapper wrapper) { Object obj = wrapper.getEntity(); if (Objects.isNull(obj)) { @@ -126,6 +124,9 @@ public class KtWrapperUtils { } private static String mainLogic(boolean hasWhere, Class clazz, KtLambdaWrapper wrapper) { + if (!wrapper.getLogicSql()) { + return StringPool.EMPTY; + } String info = LogicInfoUtils.getLogicInfo(null, clazz, true, wrapper.getAlias()); if (StringUtils.isNotBlank(info)) { if (hasWhere) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index 84a669b..442978d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -700,7 +700,6 @@ public abstract class MPJAbstractWrapper extends MPJAbstractLambdaWrapper> implements Query>, QueryLabel>, Chain, SelectWrapper> { @@ -205,10 +203,10 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, SFunction alias) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, - new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), + paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias + .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new TableList(), null, null, null, null) { }; wrapper.tableList.setAlias(st); @@ -224,16 +222,22 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper + * 推荐使用 union(Class clazz, Consumer> consumer) + * 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @see #union(Class, Consumer) + * @deprecated union 不支持子查询 */ - @SuppressWarnings("UnusedReturnValue") + @Deprecated + @SuppressWarnings({"UnusedReturnValue", "DeprecatedIsStillUsed"}) public final MPJLambdaWrapper union(MPJLambdaWrapper... wrappers) { StringBuilder sb = new StringBuilder(); for (MPJLambdaWrapper wrapper : wrappers) { addCustomWrapper(wrapper); Class entityClass = wrapper.getEntityClass(); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); - sb.append(" UNION ") - .append(WrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); + sb.append(" UNION ").append(WrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); } if (Objects.isNull(unionSql)) { unionSql = SharedString.emptyString(); @@ -243,17 +247,45 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper + * 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @param clazz union语句的主表类型 + * @since 1.4.7.3 */ - @SuppressWarnings("UnusedReturnValue") - public final MPJLambdaWrapper unionAll(MPJLambdaWrapper... wrappers) { + public MPJLambdaWrapper union(Class clazz, Consumer> consumer) { + MPJLambdaWrapper unionWrapper = JoinWrappers.lambda(clazz); + addCustomWrapper(unionWrapper); + consumer.accept(unionWrapper); + + String sb = " UNION " + WrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); + + if (Objects.isNull(unionSql)) { + unionSql = SharedString.emptyString(); + } + unionSql.setStringValue(unionSql.getStringValue() + sb); + return typedThis; + } + + /** + * union + *

+ * 推荐使用 unionAll(Class clazz, Consumer> consumer) + * 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @see #unionAll(Class, Consumer) + * @deprecated union 不支持子查询 + */ + @Deprecated + @SuppressWarnings("DeprecatedIsStillUsed") + public MPJLambdaWrapper unionAll(MPJLambdaWrapper... wrappers) { StringBuilder sb = new StringBuilder(); for (MPJLambdaWrapper wrapper : wrappers) { addCustomWrapper(wrapper); Class entityClass = wrapper.getEntityClass(); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); - sb.append(" UNION ALL ") - .append(WrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); + sb.append(" UNION ALL ").append(WrapperUtils.buildUnionSqlByWrapper(entityClass, wrapper)); } if (Objects.isNull(unionSql)) { unionSql = SharedString.emptyString(); @@ -262,7 +294,28 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper + * 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class)) + * + * @param clazz union语句的主表类型 + * @since 1.4.7.3 + */ + public MPJLambdaWrapper unionAll(Class clazz, Consumer> consumer) { + MPJLambdaWrapper unionWrapper = JoinWrappers.lambda(clazz); + addCustomWrapper(unionWrapper); + consumer.accept(unionWrapper); + + String sb = " UNION ALL " + WrapperUtils.buildUnionSqlByWrapper(clazz, unionWrapper); + + if (Objects.isNull(unionSql)) { + unionSql = SharedString.emptyString(); + } + unionSql.setStringValue(unionSql.getStringValue() + sb); + return typedThis; + } + private void addCustomWrapper(MPJLambdaWrapper wrapper) { if (Objects.isNull(wrapperIndex)) { wrapperIndex = new AtomicInteger(0); @@ -280,7 +333,6 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper { diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 752716b..c6cbb4e 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -1074,30 +1074,6 @@ class LambdaWrapperTest { } } - /** - * select 子查询 - */ - @Test - void sub() { - ThreadLocalUtils.set("SELECT (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); - MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) - .selectSub(UserDO.class, w -> w.select(UserDO::getId) - .eq(UserDO::getId, UserDO::getId) - .last("limit 1"), UserDO::getId) - .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) - .le(UserDO::getId, 100); - wrapper.list(); - - ThreadLocalUtils.set("SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = t1.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); - MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) - .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) - .eq(AreaDO::getId, AddressDO::getId) - .last("limit 1"), UserDO::getId) - .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) - .le(UserDO::getId, 100); - wrapper1.list(); - } - /** * select 子查询 */ @@ -1111,45 +1087,4 @@ class LambdaWrapperTest { .orderByDesc("t.id"); wrapper.list(); } - - /** - * select 子查询 - */ - @Test - void union() { - ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.id = ?) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE (t.`name` = ? AND (t.`name` = ?)) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.pid = ?)"); - MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) - .selectAll(UserDO.class) - .eq(UserDO::getId, 1); - MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) - .selectAll(UserDO.class) - .disableLogicDel() - .eq(UserDO::getName, "张三 2") - .and(w -> w.eq(UserDO::getName, "张三 2")); - MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) - .selectAll(UserDO.class) - .eq(UserDO::getPid, 2); - wrapper.union(wrapper1, wrapper2); - List list = wrapper.list(); - - assert list.size() == 7; - } - - @Test - void unionAll() { - ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t UNION ALL SELECT t.id FROM area t WHERE t.del = false AND (t.id = ?)"); - MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) - .select(UserDO::getId) - .eq(UserDO::getId, 1); - MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(AddressDO.class) - .select(AddressDO::getId) - .disableLogicDel(); - MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(AreaDO.class) - .select(AreaDO::getId) - .eq(AreaDO::getId, 2); - wrapper.unionAll(wrapper1, wrapper2); - List list = wrapper.list(); - - assert list.size() == 23 && list.get(0).getId() != null; - } } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/SelectSubTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/SelectSubTest.java new file mode 100644 index 0000000..6eaef3e --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/SelectSubTest.java @@ -0,0 +1,51 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.AreaDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class SelectSubTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + /** + * select 子查询 + */ + @Test + void sub() { + ThreadLocalUtils.set("SELECT (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id AND st.id = ?) LIMIT 1) AS id, (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id AND st.id = ?) LIMIT 1) AS name FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectSub(UserDO.class, w -> w.select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId) + .eq(UserDO::getId, 2) + .last("limit 1"), UserDO::getId) + .selectSub(UserDO.class, w -> w.select(UserDO::getId) + .eq(UserDO::getId, UserDO::getId) + .eq(UserDO::getId, 3) + .last("limit 1"), UserDO::getName) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .le(UserDO::getId, 100); + wrapper.list(); + + ThreadLocalUtils.set("SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = t1.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)"); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectSub(AreaDO.class, w -> w.select(AreaDO::getId) + .eq(AreaDO::getId, AddressDO::getId) + .last("limit 1"), UserDO::getId) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .le(UserDO::getId, 100); + wrapper1.list(); + } +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/UnionTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/UnionTest.java new file mode 100644 index 0000000..cc968aa --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/UnionTest.java @@ -0,0 +1,85 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.AreaDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SuppressWarnings("deprecation") +@SpringBootTest +public class UnionTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + @Test + void union() { + ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.id = ?) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE (t.`name` = ? AND (t.`name` = ?)) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.pid = ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .eq(UserDO::getId, 1); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .disableLogicDel() + .eq(UserDO::getName, "张三 2") + .and(w -> w.eq(UserDO::getName, "张三 2")); + MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .eq(UserDO::getPid, 2); + wrapper.union(wrapper1, wrapper2); + List list = wrapper.list(); + + System.out.println(wrapper.getUnionSql()); + assert list.size() == 7 && list.get(0).getId() != null; + } + + @Test + void unionAll() { + ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t UNION ALL SELECT t.id FROM area t WHERE t.del = false AND (t.id = ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .select(UserDO::getId) + .eq(UserDO::getId, 1); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(AddressDO.class) + .select(AddressDO::getId) + .disableLogicDel(); + MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(AreaDO.class) + .select(AreaDO::getId) + .eq(AreaDO::getId, 2); + wrapper.unionAll(wrapper1, wrapper2); + List list = wrapper.list(); + + assert list.size() == 23 && list.get(0).getId() != null; + } + + @Test + void unionAll1() { + ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t WHERE (t.id = ?) UNION ALL SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = ? AND (st.id = ?))) AS id FROM area t WHERE t.del = false AND (t.id = ? AND (t.id = ?))"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .select(UserDO::getId) + .eq(UserDO::getId, 1) + .unionAll(AddressDO.class, union -> union + .select(AddressDO::getId) + .disableLogicDel() + .eq(UserDO::getId, 2)) + .unionAll(AreaDO.class, union -> union + .selectSub(AreaDO.class, sub -> sub + .select(AreaDO::getId) + .eq(AreaDO::getId, 3) + .and(and -> and.eq(AreaDO::getId, 4)), AreaDO::getId) + .eq(AreaDO::getId, 5) + .and(and -> and.eq(AreaDO::getId, 6))); + List list = wrapper.list(); + assert list.size() == 2 && list.get(0).getId() != null; + } +} diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/KtApplication.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/KtApplication.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/KtApplication.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/KtApplication.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AddressDTO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AddressDTO.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AddressDTO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AddressDTO.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AreaDTO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AreaDTO.kt new file mode 100644 index 0000000..3468fd4 --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/AreaDTO.kt @@ -0,0 +1,12 @@ +package com.github.yulichang.test.kt.dto + + +@Suppress("unused") +class AreaDTO { + val id: Int? = null + val province: String? = null + val city: String? = null + val area: String? = null + val postcode: String? = null + val del: Boolean? = null +} diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/UserDTO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/UserDTO.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/UserDTO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/dto/UserDTO.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AddressDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AddressDO.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AddressDO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AddressDO.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AddressGeneric.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AddressGeneric.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AddressGeneric.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AddressGeneric.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AreaDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AreaDO.kt similarity index 93% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AreaDO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AreaDO.kt index cf8f01c..16f06f3 100644 --- a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/AreaDO.kt +++ b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/AreaDO.kt @@ -13,7 +13,7 @@ class AreaDO : Serializable { var province: String? = null var city: String? = null var area: String? = null - var postcode: String? = null + var Postcode: String? = null @TableLogic var del: Boolean? = null diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/ID.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/ID.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/ID.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/ID.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/OrderDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/OrderDO.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/OrderDO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/OrderDO.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserDO.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserDto.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDto.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserDto.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDto.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserTTT.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserTTT.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/entity/UserTTT.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserTTT.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/enums/Sex.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/enums/Sex.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/enums/Sex.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/enums/Sex.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/AddressMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/AddressMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/AddressMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/AddressMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/AreaMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/AreaMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/AreaMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/AreaMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/MyBaseMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/MyBaseMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/MyBaseMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/MyBaseMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/OrderMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/OrderMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/OrderMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/OrderMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/UserDTOMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/UserDTOMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/UserDTOMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/UserDTOMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/UserMapper.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/UserMapper.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/mapper/UserMapper.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/mapper/UserMapper.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/service/UserService.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/service/UserService.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/service/UserService.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/service/UserService.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/service/impl/UserServiceImpl.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/service/impl/UserServiceImpl.kt similarity index 100% rename from mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/service/impl/UserServiceImpl.kt rename to mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/service/impl/UserServiceImpl.kt diff --git a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AreaDTO.kt b/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AreaDTO.kt deleted file mode 100644 index e847f5b..0000000 --- a/mybatis-plus-join-test/test-kotlin/src/main/kotlin/com/github/yulichang/test/kt/dto/AreaDTO.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.yulichang.test.kt.dto - - -@Suppress("unused") -class AreaDTO { - private val id: Int? = null - private val province: String? = null - private val city: String? = null - private val area: String? = null - private val postcode: String? = null - private val del: Boolean? = null -} diff --git a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt similarity index 94% rename from mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt rename to mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt index 43b61de..1be531a 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/com/github/yulichang/test/kt/LambdaWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt @@ -698,7 +698,9 @@ class LambdaWrapperTest { .eq(UserDO::name, "ref") userMapper!!.selectList(wrapper) try { - userMapper.insertBatchSomeColumn(ArrayList()) + val arr = ArrayList() + arr.add(UserDO()) + userMapper.insertBatchSomeColumn(arr) } catch (ignored: BadSqlGrammarException) { } } @@ -821,7 +823,9 @@ class LambdaWrapperTest { .setTableName { name -> name + "bbbbbbb" } try { userMapper!!.selectJoinList(UserDTO::class.java, wrapper) - } catch (_: BadSqlGrammarException) { + } catch (a: Exception) { + if (a.message!!.contains("sql error")) + throw a } } @@ -1092,67 +1096,4 @@ class LambdaWrapperTest { //忽略异常 h2不支持连表删除 } } - - /** - * select 子查询 - */ - @Test - fun sub() { - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM `user` st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") - val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectSub( - UserDO::class.java, { w -> - w.select(UserDO::id) - .eq(UserDO::id, UserDO::id) - .last("limit 1") - }, UserDO::id - ) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 100) - wrapper.list() - - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM area st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") - val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectSub(AreaDO::class.java, { w -> - w.select(AreaDO::id) - .eq(AreaDO::id, AddressDO::id) - .last("limit 1") - }, UserDO::id) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 100) - wrapper1.list() - - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t1.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)") - val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectSub(AddressDO::class.java, { w -> - w.select(AddressDO::id) - .eq(AddressDO::id, AddressDO::id) - .last("limit 1") - }, UserDO::id) - .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) - .le(UserDO::id, 100) - wrapper2.list() - } - - - /** - * select 子查询 - */ - @Test - fun union() { - val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::id, 1) - val wrapper1: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::name, "张三 2") - .and { a -> a.eq(UserDO::name, "张三 2") } - val wrapper2: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) - .selectAll(UserDO::class.java) - .eq(UserDO::pid, 2) - - wrapper.union(wrapper1, wrapper2) - val list = wrapper.list() - assert(list.size == 7) - } } diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt new file mode 100644 index 0000000..e0f0b9c --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt @@ -0,0 +1,57 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.kt.KtLambdaWrapper +import com.github.yulichang.test.kt.entity.UserDO +import com.github.yulichang.test.kt.mapper.UserMapper +import com.github.yulichang.test.util.Reset +import com.github.yulichang.test.util.ThreadLocalUtils +import com.github.yulichang.toolkit.Ref +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import java.util.* +import kotlin.reflect.KProperty + +@SpringBootTest +class CustomWrapperTest { + @Autowired + private val userMapper: UserMapper? = null + + @BeforeEach + fun setUp() { + Reset.reset() + } + + //自定义wrapper扩展 + class CWrapper : KtLambdaWrapper() { + fun eqIfAbsent(column: KProperty<*>, `val`: Any?): CWrapper { + super.eq(Objects.nonNull(`val`), column, `val`) + return this + } + + companion object { + fun toCWrapper(): CWrapper? { + return null + } + } + } + + @Test + fun testWrapperCustomer() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.id = ?)") + val wrapper: CWrapper = CWrapper() + .selectAll(UserDO::class.java) + .toChildren> { CWrapper.toCWrapper() } + .eqIfAbsent(UserDO::id, 1) + val dos = userMapper?.selectList(wrapper) + dos?.forEach(System.out::println) + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false") + val wrapper1: CWrapper = CWrapper() + .selectAll(UserDO::class.java) + .toChildren(Ref>()) + .eqIfAbsent(UserDO::id, null) + val dos1 = userMapper?.selectList(wrapper1) + dos1?.forEach(System.out::println) + } +} diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/FieldNameTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/FieldNameTest.kt new file mode 100644 index 0000000..6c026eb --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/FieldNameTest.kt @@ -0,0 +1,41 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.test.kt.dto.AreaDTO +import com.github.yulichang.test.kt.entity.AreaDO +import com.github.yulichang.test.kt.entity.UserDto +import com.github.yulichang.test.kt.mapper.AreaMapper +import com.github.yulichang.test.util.Reset +import com.github.yulichang.toolkit.KtWrappers +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class FieldNameTest { + @Autowired + private val areaMapper: AreaMapper? = null + + @BeforeEach + fun setUp() { + Reset.reset() + } + + @Test + fun testFieldName() { + val list = areaMapper?.selectJoinList(AreaDO::class.java, KtWrappers.query(AreaDO::class.java) + .select(AreaDO::Postcode) + .leftJoin(UserDto::class.java, UserDto::id, AreaDO::id)) + list?.forEach(System.out::println) + assert(list?.get(0)?.Postcode != null) + } + + @Test + fun testFieldName1() { + val list = areaMapper?.selectJoinList(AreaDTO::class.java, KtWrappers.query(AreaDO::class.java) + .selectAs(AreaDO::Postcode, AreaDTO::postcode) + .leftJoin(UserDto::class.java, UserDto::id, AreaDO::id)) + list?.forEach(System.out::println) + assert(list?.get(0)?.postcode != null) + } +} diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/SelectSubTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/SelectSubTest.kt new file mode 100644 index 0000000..a59106c --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/SelectSubTest.kt @@ -0,0 +1,53 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.test.kt.entity.AddressDO +import com.github.yulichang.test.kt.entity.AreaDO +import com.github.yulichang.test.kt.entity.UserDO +import com.github.yulichang.test.util.ThreadLocalUtils +import com.github.yulichang.toolkit.KtWrappers +import org.junit.jupiter.api.BeforeEach +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class SelectSubTest { + @BeforeEach + fun setUp() { + com.github.yulichang.test.util.Reset.reset() + } + + /** + * select 子查询 + */ + @org.junit.jupiter.api.Test + fun sub() { + ThreadLocalUtils.set("SELECT (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id AND st.id = ?) LIMIT 1) AS id, (SELECT st.id FROM `user` st WHERE st.del = false AND (st.id = t.id AND st.id = ?) LIMIT 1) AS name FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)") + val wrapper = KtWrappers.query(UserDO::class.java) + .selectSub(UserDO::class.java, { w -> + w.select(UserDO::id) + .eq(UserDO::id, UserDO::id) + .eq(UserDO::id, 2) + .last("limit 1") + }, UserDO::id) + .selectSub(UserDO::class.java, { w -> + w.select(UserDO::id) + .eq(UserDO::id, UserDO::id) + .eq(UserDO::id, 3) + .last("limit 1") + }, UserDO::name) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 100) + wrapper.list() + + + ThreadLocalUtils.set("SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = t1.id) LIMIT 1) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false AND (t.id <= ?)") + val wrapper1 = KtWrappers.query(UserDO::class.java) + .selectSub(AreaDO::class.java, { w -> + w.select(AreaDO::id) + .eq(AreaDO::id, AddressDO::id) + .last("limit 1") + }, UserDO::id) + .leftJoin(AddressDO::class.java, AddressDO::userId, UserDO::id) + .le(UserDO::id, 100) + wrapper1.list() + } +} diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/UnionTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/UnionTest.kt new file mode 100644 index 0000000..3e179c7 --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/UnionTest.kt @@ -0,0 +1,83 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.test.kt.entity.AddressDO +import com.github.yulichang.test.kt.entity.AreaDO +import com.github.yulichang.test.kt.entity.UserDO +import com.github.yulichang.test.util.Reset +import com.github.yulichang.test.util.ThreadLocalUtils +import com.github.yulichang.toolkit.KtWrappers +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@Suppress("DEPRECATION") +@SpringBootTest +class UnionTest { + @BeforeEach + fun setUp() { + Reset.reset() + } + + @Test + fun union() { + ThreadLocalUtils.set("SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.id = ?) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE (t.`name` = ? AND (t.`name` = ?)) UNION SELECT t.id,t.pid,t.`name`,t.`json`,t.sex,t.head_img,t.create_time,t.address_id,t.address_id2,t.del,t.create_by,t.update_by FROM `user` t WHERE t.del=false AND (t.pid = ?)") + val wrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .eq(UserDO::id, 1) + val wrapper1 = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .disableLogicDel() + .eq(UserDO::name, "张三 2") + .and { w -> w.eq(UserDO::name, "张三 2") } + val wrapper2 = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .eq(UserDO::pid, 2) + wrapper.union(wrapper1, wrapper2) + val list: List = wrapper.list() + println(wrapper.unionSql) + assert(list.size == 7 && list[0].id != null) + } + + + @Test + fun unionAll() { + ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t UNION ALL SELECT t.id FROM area t WHERE t.del = false AND (t.id = ?)") + val wrapper = KtWrappers.query(UserDO::class.java) + .select(UserDO::id) + .eq(UserDO::id, 1) + val wrapper1 = KtWrappers.query(AddressDO::class.java) + .select(AddressDO::id) + .disableLogicDel() + val wrapper2 = KtWrappers.query(AreaDO::class.java) + .select(AreaDO::id) + .eq(AreaDO::id, 2) + wrapper.unionAll(wrapper1, wrapper2) + val list: List = wrapper.list() + assert(list.size == 23 && list[0].id != null) + } + + @Test + fun unionAll1() { + ThreadLocalUtils.set("SELECT t.id FROM `user` t WHERE t.del = false AND (t.id = ?) UNION ALL SELECT t.id FROM address t WHERE (t.id = ?) UNION ALL SELECT (SELECT st.id FROM area st WHERE st.del = false AND (st.id = ? AND (st.id = ?))) AS id FROM area t WHERE t.del = false AND (t.id = ? AND (t.id = ?))") + val wrapper = KtWrappers.query(UserDO::class.java) + .select(UserDO::id) + .eq(UserDO::id, 1) + .unionAll(AddressDO::class.java) { union -> + union.select(AddressDO::id) + .disableLogicDel() + .eq(UserDO::id, 2) + } + .unionAll(AreaDO::class.java) { union -> + union.selectSub(AreaDO::class.java, { sub -> + sub.select(AreaDO::id) + .eq(AreaDO::id, 3) + .and { and -> and.eq(AreaDO::id, 4) } + }, AreaDO::id) + .eq(AreaDO::id, 5) + .and { and -> and.eq(AreaDO::id, 6) } + } + println(wrapper.unionSql) + val list: List = wrapper.list() + assert(list.size == 2 && list[0].id != null) + } +} From 8170305daf885fedc1b3e979dae33b4d3508ae10 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 7 Dec 2023 02:08:20 +0800 Subject: [PATCH 30/88] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=89=8D=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/MPJInterceptorConfig.java | 2 +- .../github/yulichang/kt/KtLambdaWrapper.java | 4 +- .../yulichang/toolkit/FieldStringMap.java | 2 +- .../wrapper/MPJAbstractLambdaWrapper.java | 14 +- .../yulichang/wrapper/MPJAbstractWrapper.java | 202 +++++---- .../yulichang/wrapper/MPJLambdaWrapper.java | 4 +- .../yulichang/wrapper/interfaces/Compare.java | 203 ++++++---- .../yulichang/wrapper/interfaces/Func.java | 383 +++++++++++------- .../wrapper/interfaces/OnCompare.java | 186 +++++++-- .../wrapper/interfaces/QueryJoin.java | 88 +++- .../yulichang/test/join/m/TableAliasTest.java | 87 ++++ 11 files changed, 810 insertions(+), 365 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/TableAliasTest.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index b2853dc..22a510a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.7.2"); + " 1.4.8"); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java index 26e8a25..51f4eb6 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java @@ -253,7 +253,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper union.selectAll(UserDO.class)) * * @param clazz union语句的主表类型 - * @since 1.4.7.3 + * @since 1.4.8 */ public KtLambdaWrapper union(Class clazz, Consumer> consumer) { KtLambdaWrapper unionWrapper = KtWrappers.query(clazz); @@ -301,7 +301,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper union.selectAll(UserDO.class)) * * @param clazz union语句的主表类型 - * @since 1.4.7.3 + * @since 1.4.8 */ public KtLambdaWrapper unionAll(Class clazz, Consumer> consumer) { KtLambdaWrapper unionWrapper = KtWrappers.query(clazz); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java index 51d6f5a..2d1196a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java @@ -6,7 +6,7 @@ import java.util.Locale; /** * @author yulichang * @see HashMap - * @since 1.4.7.3 + * @since 1.4.8 */ public class FieldStringMap extends HashMap { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java index 47b7bf8..c0fc4fc 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java @@ -219,19 +219,19 @@ public abstract class MPJAbstractLambdaWrapper String columnToString(Integer index, X column, boolean isJoin, PrefixEnum prefixEnum) { - return columnToString(index, (SFunction) column, isJoin, prefixEnum); + protected String columnToString(Integer index, String alias, X column, boolean isJoin, PrefixEnum prefixEnum) { + return columnToString(index, alias, (SFunction) column, isJoin, prefixEnum); } @Override @SafeVarargs - protected final String columnsToString(Integer index, boolean isJoin, PrefixEnum prefixEnum, X... columns) { - return Arrays.stream(columns).map(i -> columnToString(index, (SFunction) i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA)); + protected final String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns) { + return Arrays.stream(columns).map(i -> columnToString(index, alias, (SFunction) i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } - protected String columnToString(Integer index, SFunction column, boolean isJoin, PrefixEnum prefixEnum) { + protected String columnToString(Integer index, String alias, SFunction column, boolean isJoin, PrefixEnum prefixEnum) { Class entityClass = LambdaUtils.getEntityClass(column); - return getDefault(index, entityClass, isJoin, prefixEnum) + StringPool.DOT + getCache(column).getColumn(); + return (alias == null ? getDefault(index, entityClass, isJoin, prefixEnum) : alias) + StringPool.DOT + getCache(column).getColumn(); } protected SelectCache getCache(SFunction fn) { @@ -378,7 +378,7 @@ public abstract class MPJAbstractLambdaWrapper> extends Wrapper implements Compare, Nested, Join, Func, OnCompare, CompareStr, FuncStr { @@ -56,6 +56,7 @@ public abstract class MPJAbstractWrapper paramNameValuePairs; /** * 其他 @@ -102,7 +103,7 @@ public abstract class MPJAbstractWrapper Children eq(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, EQ, val); + public Children eq(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, EQ, val); } @Override - public Children ne(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, NE, val); + public Children ne(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, NE, val); } @Override - public Children gt(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, GT, val); + public Children gt(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, GT, val); } @Override - public Children ge(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, GE, val); + public Children ge(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, GE, val); } @Override - public Children lt(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, LT, val); + public Children lt(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, LT, val); } @Override - public Children le(boolean condition, SFunction column, Object val) { - return addCondition(condition, column, LE, val); + public Children le(boolean condition, String alias, SFunction column, Object val) { + return addCondition(condition, alias, column, LE, val); } @Override - public Children like(boolean condition, SFunction column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.DEFAULT); + public Children like(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.DEFAULT); } @Override - public Children notLike(boolean condition, SFunction column, Object val) { - return likeValue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT); + public Children notLike(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.DEFAULT); } @Override - public Children likeLeft(boolean condition, SFunction column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.LEFT); + public Children likeLeft(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.LEFT); } @Override - public Children likeRight(boolean condition, SFunction column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.RIGHT); + public Children likeRight(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.RIGHT); } @Override - public Children between(boolean condition, SFunction column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), BETWEEN, + public Children between(boolean condition, String alias, SFunction column, Object val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @Override - public Children notBetween(boolean condition, SFunction column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_BETWEEN, + public Children notBetween(boolean condition, String alias, SFunction column, Object val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @@ -329,89 +330,89 @@ public abstract class MPJAbstractWrapper Children isNull(boolean condition, SFunction column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NULL)); + public Children isNull(boolean condition, String alias, SFunction column) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NULL)); } @Override - public Children isNotNull(boolean condition, SFunction column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NOT_NULL)); + public Children isNotNull(boolean condition, String alias, SFunction column) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NOT_NULL)); } @Override - public Children in(boolean condition, SFunction column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(coll))); + public Children in(boolean condition, String alias, SFunction column, Collection coll) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(coll))); } @Override - public Children in(boolean condition, SFunction column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(values))); + public Children in(boolean condition, String alias, SFunction column, Object... values) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(values))); } @Override - public Children notIn(boolean condition, SFunction column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(coll))); + public Children notIn(boolean condition, String alias, SFunction column, Collection coll) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(coll))); } @Override - public Children notIn(boolean condition, SFunction column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(values))); + public Children notIn(boolean condition, String alias, SFunction column, Object... values) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(values))); } @Override - public Children inSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, + public Children inSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, () -> String.format("(%s)", inValue))); } @Override - public Children notInSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, + public Children notInSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, () -> String.format("(%s)", inValue))); } @Override - public Children gtSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GT, + public Children gtSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GT, () -> String.format("(%s)", inValue))); } @Override - public Children geSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GE, + public Children geSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GE, () -> String.format("(%s)", inValue))); } @Override - public Children ltSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LT, + public Children ltSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LT, () -> String.format("(%s)", inValue))); } @Override - public Children leSql(boolean condition, SFunction column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LE, + public Children leSql(boolean condition, String alias, SFunction column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LE, () -> String.format("(%s)", inValue))); } @Override - public Children groupBy(boolean condition, List> columns) { + public Children groupBy(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - String one = (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns)); - final String finalOne = one; + final String finalOne = (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns)); appendSqlSegments(GROUP_BY, () -> finalOne); } }); } + @SafeVarargs @Override - public Children groupBy(boolean condition, SFunction column, SFunction... columns) { + public final Children groupBy(boolean condition, String alias, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { - String one = columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); + String one = columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); if (ArrayUtils.isNotEmpty(columns)) { - one += (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns)); + one += (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns)); } final String finalOne = one; appendSqlSegments(GROUP_BY, () -> finalOne); @@ -419,35 +420,33 @@ public abstract class MPJAbstractWrapper Children orderByAsc(boolean condition, List> columns) { + public Children orderByAsc(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { - final SqlKeyword mode = ASC; if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), ASC)); } }); } @Override - public Children orderByDesc(boolean condition, List> columns) { + public Children orderByDesc(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { - final SqlKeyword mode = DESC; if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), DESC)); } }); } @Override - public Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns) { + public Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { final SqlKeyword mode = isAsc ? ASC : DESC; - appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column, false), mode); + appendSqlSegments(ORDER_BY, columnToSqlSegment(index, alias, column), mode); if (ArrayUtils.isNotEmpty(columns)) { Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), mode)); } }); } @@ -456,7 +455,6 @@ public abstract class MPJAbstractWrapper SFunction columnSqlInjectFilter(SFunction column) { return column; @@ -493,8 +491,8 @@ public abstract class MPJAbstractWrapper拼接 LIKE 以及 值

*/ - protected Children likeValue(boolean condition, SqlKeyword keyword, SFunction column, Object val, SqlLike sqlLike) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), keyword, + protected Children likeValue(boolean condition, SqlKeyword keyword, String alias, SFunction column, Object val, SqlLike sqlLike) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), keyword, () -> formatParam(null, SqlUtils.concatLike(val, sqlLike)))); } @@ -511,18 +509,18 @@ public abstract class MPJAbstractWrapper Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, Object val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, + protected Children addCondition(boolean condition, String alias, SFunction column, SqlKeyword sqlKeyword, Object val) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword, () -> formatParam(null, val))); } - protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, SFunction val) { + protected Children addCondition(boolean condition, String alias, SFunction column, + SqlKeyword sqlKeyword, String rightAlias, SFunction val) { Class c = LambdaUtils.getEntityClass(column); Class v = LambdaUtils.getEntityClass(val); - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, - isNo ? - columnToSqlSegmentS(index, val, v == c && v == joinClass) : - columnToSqlSegmentS(index, val, v == c) + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword, + isOn ? columnToSqlSegmentS(index, rightAlias, val, v == c && v == joinClass) : + columnToSqlSegmentS(index, rightAlias, val, v == c) )); } @@ -563,6 +561,7 @@ public abstract class MPJAbstractWrapper getParamNameValuePairs() { - return paramNameValuePairs; - } - public String getParamAlias() { return paramAlias.getStringValue() == null ? Constants.WRAPPER : paramAlias.getStringValue(); } @@ -698,6 +693,7 @@ public abstract class MPJAbstractWrapper ISqlSegment columnToSqlSegment(Integer index, SFunction column, boolean isJoin) { - return () -> columnToString(index, column, isJoin, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); + protected final ISqlSegment columnToSqlSegment(Integer index, String alias, SFunction column) { + return () -> columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); } - protected final ISqlSegment columnToSqlSegmentS(Integer index, SFunction column, boolean isJoin) { + protected final ISqlSegment columnToSqlSegmentS(Integer index, String alias, SFunction column, boolean isJoin) { PrefixEnum prefixEnum; if (isMain) { - prefixEnum = isNo ? PrefixEnum.ON_SECOND /* 理论上不可能有这种情况 */ : PrefixEnum.CD_SECOND; + prefixEnum = isOn ? PrefixEnum.ON_SECOND /* 理论上不可能有这种情况 */ : PrefixEnum.CD_SECOND; } else { - prefixEnum = isNo ? PrefixEnum.ON_SECOND : PrefixEnum.CD_ON_SECOND; + prefixEnum = isOn ? PrefixEnum.ON_SECOND : PrefixEnum.CD_ON_SECOND; } - return () -> columnToString(index, column, isJoin, prefixEnum); + return () -> columnToString(index, alias, column, isJoin, prefixEnum); } - protected final ISqlSegment columnToSqlSegment(String column) { + protected final ISqlSegment columnToSqlSegment(String column) { return () -> columnsToString(column); } /** * 获取 columnName */ - protected String columnToString(Integer index, X column, boolean isJoin, PrefixEnum prefixEnum) { + protected String columnToString(Integer index, String alias, X column, boolean isJoin, PrefixEnum prefixEnum) { return (String) column; } @@ -753,12 +749,10 @@ public abstract class MPJAbstractWrapper String columnsToString(Integer index, boolean isJoin, PrefixEnum prefixEnum, X... columns) { - return Arrays.stream(columns).map(i -> this.columnToString(index, i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA)); - } + abstract String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns); @Override - @SuppressWarnings("all") + @SuppressWarnings("MethodDoesntCallSuperMethod") public Children clone() { return SerializationUtils.clone(typedThis); } @@ -775,33 +769,33 @@ public abstract class MPJAbstractWrapper Children eq(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, EQ, val); + public Children eq(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, EQ, rightAlias, val); } @Override - public Children ne(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, NE, val); + public Children ne(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, NE, rightAlias, val); } @Override - public Children gt(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, GT, val); + public Children gt(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, GT, rightAlias, val); } @Override - public Children ge(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, GE, val); + public Children ge(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, GE, rightAlias, val); } @Override - public Children lt(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, LT, val); + public Children lt(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, LT, rightAlias, val); } @Override - public Children le(boolean condition, SFunction column, SFunction val) { - return addCondition(condition, column, LE, val); + public Children le(boolean condition, String alias, SFunction column, String rightAlias, SFunction val) { + return addCondition(condition, alias, column, LE, rightAlias, val); } /* ****************************************** **/ diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 3898ee5..534882c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -252,7 +252,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper union.selectAll(UserDO.class)) * * @param clazz union语句的主表类型 - * @since 1.4.7.3 + * @since 1.4.8 */ public MPJLambdaWrapper union(Class clazz, Consumer> consumer) { MPJLambdaWrapper unionWrapper = JoinWrappers.lambda(clazz); @@ -300,7 +300,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper union.selectAll(UserDO.class)) * * @param clazz union语句的主表类型 - * @since 1.4.7.3 + * @since 1.4.8 */ public MPJLambdaWrapper unionAll(Class clazz, Consumer> consumer) { MPJLambdaWrapper unionWrapper = JoinWrappers.lambda(clazz); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java index 1d3b191..7b76b5a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java @@ -14,16 +14,12 @@ import java.util.function.BiPredicate; @SuppressWarnings("unused") public interface Compare extends Serializable { - /** - * ignore - */ + default Children allEq(Map, V> params) { return allEq(params, true); } - /** - * ignore - */ + default Children allEq(Map, V> params, boolean null2IsNull) { return allEq(true, params, null2IsNull); } @@ -38,16 +34,12 @@ public interface Compare extends Serializable { */ Children allEq(boolean condition, Map, V> params, boolean null2IsNull); - /** - * ignore - */ + default Children allEq(BiPredicate, V> filter, Map, V> params) { return allEq(filter, params, true); } - /** - * ignore - */ + default Children allEq(BiPredicate, V> filter, Map, V> params, boolean null2IsNull) { return allEq(true, filter, params, null2IsNull); } @@ -63,12 +55,16 @@ public interface Compare extends Serializable { */ Children allEq(boolean condition, BiPredicate, V> filter, Map, V> params, boolean null2IsNull); - /** - * ignore - */ - @SuppressWarnings("UnusedReturnValue") default Children eq(SFunction column, Object val) { - return eq(true, column, val); + return eq(true, null, column, val); + } + + default Children eq(String alias, SFunction column, Object val) { + return eq(true, alias, column, val); + } + + default Children eq(boolean condition, SFunction column, Object val) { + return eq(condition, null, column, val); } /** @@ -79,30 +75,42 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children eq(boolean condition, SFunction column, Object val); + Children eq(boolean condition, String alias, SFunction column, Object val); - /** - * ignore - */ default Children ne(SFunction column, Object val) { - return ne(true, column, val); + return ne(true, null, column, val); + } + + default Children ne(String alias, SFunction column, Object val) { + return ne(true, alias, column, val); + } + + default Children ne(boolean condition, SFunction column, Object val) { + return ne(condition, null, column, val); } /** * 不等于 <> * * @param condition 执行条件 + * @param alias 字段别名 * @param column 字段 * @param val 值 * @return children */ - Children ne(boolean condition, SFunction column, Object val); + Children ne(boolean condition, String alias, SFunction column, Object val); + - /** - * ignore - */ default Children gt(SFunction column, Object val) { - return gt(true, column, val); + return gt(true, null, column, val); + } + + default Children gt(String alias, SFunction column, Object val) { + return gt(true, alias, column, val); + } + + default Children gt(boolean condition, SFunction column, Object val) { + return gt(condition, null, column, val); } /** @@ -113,13 +121,18 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children gt(boolean condition, SFunction column, Object val); + Children gt(boolean condition, String alias, SFunction column, Object val); - /** - * ignore - */ default Children ge(SFunction column, Object val) { - return ge(true, column, val); + return ge(true, null, column, val); + } + + default Children ge(String alias, SFunction column, Object val) { + return ge(true, alias, column, val); + } + + default Children ge(boolean condition, SFunction column, Object val) { + return ge(condition, null, column, val); } /** @@ -130,13 +143,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children ge(boolean condition, SFunction column, Object val); + Children ge(boolean condition, String alias, SFunction column, Object val); + - /** - * ignore - */ default Children lt(SFunction column, Object val) { - return lt(true, column, val); + return lt(true, null, column, val); + } + + default Children lt(String alias, SFunction column, Object val) { + return lt(true, alias, column, val); + } + + default Children lt(boolean condition, SFunction column, Object val) { + return lt(condition, null, column, val); } /** @@ -147,13 +166,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children lt(boolean condition, SFunction column, Object val); + Children lt(boolean condition, String alias, SFunction column, Object val); + - /** - * ignore - */ default Children le(SFunction column, Object val) { - return le(true, column, val); + return le(true, null, column, val); + } + + default Children le(String alias, SFunction column, Object val) { + return le(true, alias, column, val); + } + + default Children le(boolean condition, SFunction column, Object val) { + return le(condition, null, column, val); } /** @@ -164,13 +189,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children le(boolean condition, SFunction column, Object val); + Children le(boolean condition, String alias, SFunction column, Object val); + - /** - * ignore - */ default Children between(SFunction column, Object val1, Object val2) { - return between(true, column, val1, val2); + return between(true, null, column, val1, val2); + } + + default Children between(String alias, SFunction column, Object val1, Object val2) { + return between(true, alias, column, val1, val2); + } + + default Children between(boolean condition, SFunction column, Object val1, Object val2) { + return between(condition, null, column, val1, val2); } /** @@ -182,13 +213,19 @@ public interface Compare extends Serializable { * @param val2 值2 * @return children */ - Children between(boolean condition, SFunction column, Object val1, Object val2); + Children between(boolean condition, String alias, SFunction column, Object val1, Object val2); + - /** - * ignore - */ default Children notBetween(SFunction column, Object val1, Object val2) { - return notBetween(true, column, val1, val2); + return notBetween(true, null, column, val1, val2); + } + + default Children notBetween(String alias, SFunction column, Object val1, Object val2) { + return notBetween(true, alias, column, val1, val2); + } + + default Children notBetween(boolean condition, SFunction column, Object val1, Object val2) { + return notBetween(condition, null, column, val1, val2); } /** @@ -200,13 +237,18 @@ public interface Compare extends Serializable { * @param val2 值2 * @return children */ - Children notBetween(boolean condition, SFunction column, Object val1, Object val2); + Children notBetween(boolean condition, String alias, SFunction column, Object val1, Object val2); - /** - * ignore - */ default Children like(SFunction column, Object val) { - return like(true, column, val); + return like(true, null, column, val); + } + + default Children like(String alias, SFunction column, Object val) { + return like(true, alias, column, val); + } + + default Children like(boolean condition, SFunction column, Object val) { + return like(condition, null, column, val); } /** @@ -217,13 +259,18 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children like(boolean condition, SFunction column, Object val); + Children like(boolean condition, String alias, SFunction column, Object val); - /** - * ignore - */ default Children notLike(SFunction column, Object val) { - return notLike(true, column, val); + return notLike(true, null, column, val); + } + + default Children notLike(String alias, SFunction column, Object val) { + return notLike(true, alias, column, val); + } + + default Children notLike(boolean condition, SFunction column, Object val) { + return notLike(condition, null, column, val); } /** @@ -234,13 +281,18 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children notLike(boolean condition, SFunction column, Object val); + Children notLike(boolean condition, String alias, SFunction column, Object val); - /** - * ignore - */ default Children likeLeft(SFunction column, Object val) { - return likeLeft(true, column, val); + return likeLeft(true, null, column, val); + } + + default Children likeLeft(String alias, SFunction column, Object val) { + return likeLeft(true, alias, column, val); + } + + default Children likeLeft(boolean condition, SFunction column, Object val) { + return likeLeft(condition, null, column, val); } /** @@ -251,13 +303,18 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children likeLeft(boolean condition, SFunction column, Object val); + Children likeLeft(boolean condition, String alias, SFunction column, Object val); - /** - * ignore - */ default Children likeRight(SFunction column, Object val) { - return likeRight(true, column, val); + return likeRight(true, null, column, val); + } + + default Children likeRight(String alias, SFunction column, Object val) { + return likeRight(true, alias, column, val); + } + + default Children likeRight(boolean condition, SFunction column, Object val) { + return likeRight(condition, null, column, val); } /** @@ -268,5 +325,5 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children likeRight(boolean condition, SFunction column, Object val); + Children likeRight(boolean condition, String alias, SFunction column, Object val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java index a167f2b..0e7b114 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Func.java @@ -12,15 +12,20 @@ import java.util.function.Consumer; *

* copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func} */ -@SuppressWarnings({"unchecked", "unused", "JavadocDeclaration"}) +@SuppressWarnings({"unchecked", "unused"}) public interface Func extends Serializable { - /** - * ignore - */ - @SuppressWarnings("UnusedReturnValue") + default Children isNull(SFunction column) { - return isNull(true, column); + return isNull(true, null, column); + } + + default Children isNull(String alias, SFunction column) { + return isNull(true, alias, column); + } + + default Children isNull(boolean condition, SFunction column) { + return isNull(condition, null, column); } /** @@ -31,13 +36,19 @@ public interface Func extends Serializable { * @param column 字段 * @return children */ - Children isNull(boolean condition, SFunction column); + Children isNull(boolean condition, String alias, SFunction column); + - /** - * ignore - */ default Children isNotNull(SFunction column) { - return isNotNull(true, column); + return isNotNull(true, null, column); + } + + default Children isNotNull(String alias, SFunction column) { + return isNotNull(true, alias, column); + } + + default Children isNotNull(boolean condition, SFunction column) { + return isNotNull(condition, null, column); } /** @@ -48,13 +59,19 @@ public interface Func extends Serializable { * @param column 字段 * @return children */ - Children isNotNull(boolean condition, SFunction column); + Children isNotNull(boolean condition, String alias, SFunction column); + - /** - * ignore - */ default Children in(SFunction column, Collection coll) { - return in(true, column, coll); + return in(true, null, column, coll); + } + + default Children in(String alias, SFunction column, Collection coll) { + return in(true, alias, column, coll); + } + + default Children in(boolean condition, SFunction column, Collection coll) { + return in(condition, null, column, coll); } /** @@ -69,13 +86,19 @@ public interface Func extends Serializable { * @param coll 数据集合 * @return children */ - Children in(boolean condition, SFunction column, Collection coll); + Children in(boolean condition, String alias, SFunction column, Collection coll); + - /** - * ignore - */ default Children in(SFunction column, Object... values) { - return in(true, column, values); + return in(true, null, column, values); + } + + default Children in(String alias, SFunction column, Object... values) { + return in(true, alias, column, values); + } + + default Children in(boolean condition, SFunction column, Object... values) { + return in(condition, null, column, values); } /** @@ -90,13 +113,19 @@ public interface Func extends Serializable { * @param values 数据数组 * @return children */ - Children in(boolean condition, SFunction column, Object... values); + Children in(boolean condition, String alias, SFunction column, Object... values); + - /** - * ignore - */ default Children notIn(SFunction column, Collection coll) { - return notIn(true, column, coll); + return notIn(true, null, column, coll); + } + + default Children notIn(String alias, SFunction column, Collection coll) { + return notIn(true, alias, column, coll); + } + + default Children notIn(boolean condition, SFunction column, Collection coll) { + return notIn(condition, null, column, coll); } /** @@ -108,13 +137,19 @@ public interface Func extends Serializable { * @param coll 数据集合 * @return children */ - Children notIn(boolean condition, SFunction column, Collection coll); + Children notIn(boolean condition, String alias, SFunction column, Collection coll); - /** - * ignore - */ - default Children notIn(SFunction column, Object... value) { - return notIn(true, column, value); + + default Children notIn(SFunction column, Object... values) { + return notIn(true, null, column, values); + } + + default Children notIn(String alias, SFunction column, Object... values) { + return notIn(true, alias, column, values); + } + + default Children notIn(boolean condition, SFunction column, Object... values) { + return notIn(condition, null, column, values); } /** @@ -126,13 +161,19 @@ public interface Func extends Serializable { * @param values 数据数组 * @return children */ - Children notIn(boolean condition, SFunction column, Object... values); + Children notIn(boolean condition, String alias, SFunction column, Object... values); + - /** - * ignore - */ default Children inSql(SFunction column, String inValue) { - return inSql(true, column, inValue); + return inSql(true, null, column, inValue); + } + + default Children inSql(String alias, SFunction column, String inValue) { + return inSql(true, alias, column, inValue); + } + + default Children inSql(boolean condition, SFunction column, String inValue) { + return inSql(condition, null, column, inValue); } /** @@ -146,13 +187,19 @@ public interface Func extends Serializable { * @param inValue sql语句 * @return children */ - Children inSql(boolean condition, SFunction column, String inValue); + Children inSql(boolean condition, String alias, SFunction column, String inValue); + - /** - * ignore - */ default Children notInSql(SFunction column, String inValue) { - return notInSql(true, column, inValue); + return notInSql(true, null, column, inValue); + } + + default Children notInSql(String alias, SFunction column, String inValue) { + return notInSql(true, alias, column, inValue); + } + + default Children notInSql(boolean condition, SFunction column, String inValue) { + return notInSql(condition, null, column, inValue); } /** @@ -166,26 +213,42 @@ public interface Func extends Serializable { * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 * @return children */ - Children notInSql(boolean condition, SFunction column, String inValue); + Children notInSql(boolean condition, String alias, SFunction column, String inValue); + default Children gtSql(SFunction column, String inValue) { + return gtSql(true, null, column, inValue); + } + + default Children gtSql(String alias, SFunction column, String inValue) { + return gtSql(true, alias, column, inValue); + } + + default Children gtSql(boolean condition, SFunction column, String inValue) { + return gtSql(condition, null, column, inValue); + } /** * 字段 > ( sql语句 ) *

例1: gtSql("id", "1, 2, 3, 4, 5, 6")

*

例1: gtSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 + * @return children */ - Children gtSql(boolean condition, SFunction column, String inValue); + Children gtSql(boolean condition, String alias, SFunction column, String inValue); - /** - * ignore - */ - default Children gtSql(SFunction column, String inValue) { - return gtSql(true, column, inValue); + default Children geSql(SFunction column, String inValue) { + return geSql(true, null, column, inValue); + } + + default Children geSql(String alias, SFunction column, String inValue) { + return geSql(true, alias, column, inValue); + } + + default Children geSql(boolean condition, SFunction column, String inValue) { + return geSql(condition, null, column, inValue); } /** @@ -193,18 +256,23 @@ public interface Func extends Serializable { *

例1: geSql("id", "1, 2, 3, 4, 5, 6")

*

例1: geSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 + * @return children */ - Children geSql(boolean condition, SFunction column, String inValue); + Children geSql(boolean condition, String alias, SFunction column, String inValue); - /** - * ignore - */ - default Children geSql(SFunction column, String inValue) { - return geSql(true, column, inValue); + default Children ltSql(SFunction column, String inValue) { + return ltSql(true, null, column, inValue); + } + + default Children ltSql(String alias, SFunction column, String inValue) { + return ltSql(true, alias, column, inValue); + } + + default Children ltSql(boolean condition, SFunction column, String inValue) { + return ltSql(condition, null, column, inValue); } /** @@ -212,18 +280,23 @@ public interface Func extends Serializable { *

例1: ltSql("id", "1, 2, 3, 4, 5, 6")

*

例1: ltSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 + * @return children */ - Children ltSql(boolean condition, SFunction column, String inValue); + Children ltSql(boolean condition, String alias, SFunction column, String inValue); - /** - * ignore - */ - default Children ltSql(SFunction column, String inValue) { - return ltSql(true, column, inValue); + default Children leSql(SFunction column, String inValue) { + return leSql(true, null, column, inValue); + } + + default Children leSql(String alias, SFunction column, String inValue) { + return leSql(true, alias, column, inValue); + } + + default Children leSql(boolean condition, SFunction column, String inValue) { + return leSql(condition, null, column, inValue); } /** @@ -231,44 +304,47 @@ public interface Func extends Serializable { *

例1: leSql("id", "1, 2, 3, 4, 5, 6")

*

例1: leSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 + * @return children */ - Children leSql(boolean condition, SFunction column, String inValue); + Children leSql(boolean condition, String alias, SFunction column, String inValue); - /** - * ignore - */ - default Children leSql(SFunction column, String inValue) { - return leSql(true, column, inValue); - } - - /** - * ignore - */ default Children groupBy(SFunction column) { - return groupBy(true, column); + return groupBy(true, (String) null, column); + } + + default Children groupBy(String alias, SFunction column) { + return groupBy(true, alias, column); } - /** - * ignore - */ default Children groupBy(List> column) { - return groupBy(true, column); + return groupBy(true, null, column); } - /** - * ignore - */ - Children groupBy(boolean condition, List> columns); + default Children groupBy(String alias, List> column) { + return groupBy(true, alias, column); + } + + default Children groupBy(boolean condition, List> columns) { + return groupBy(condition, null, columns); + } + + + Children groupBy(boolean condition, String alias, List> columns); + - /** - * ignore - */ default Children groupBy(SFunction column, SFunction... columns) { - return groupBy(true, column, columns); + return groupBy(true, null, column, columns); + } + + default Children groupBy(String alias, SFunction column, SFunction... columns) { + return groupBy(true, alias, column, columns); + } + + default Children groupBy(boolean condition, SFunction column, SFunction... columns) { + return groupBy(condition, null, column, columns); } /** @@ -280,32 +356,42 @@ public interface Func extends Serializable { * @param columns 字段数组 * @return children */ - Children groupBy(boolean condition, SFunction column, SFunction... columns); + Children groupBy(boolean condition, String alias, SFunction column, SFunction... columns); + - /** - * ignore - */ default Children orderByAsc(SFunction column) { - return orderByAsc(true, column); + return orderByAsc(true, (String) null, column); + } + + default Children orderByAsc(String alias, SFunction column) { + return orderByAsc(true, alias, column); } - /** - * ignore - */ default Children orderByAsc(List> columns) { - return orderByAsc(true, columns); + return orderByAsc(true, null, columns); } - /** - * ignore - */ - Children orderByAsc(boolean condition, List> columns); + default Children orderByAsc(String alias, List> columns) { + return orderByAsc(true, alias, columns); + } + + default Children orderByAsc(boolean condition, List> columns) { + return orderByAsc(condition, null, columns); + } + + Children orderByAsc(boolean condition, String alias, List> columns); + - /** - * ignore - */ default Children orderByAsc(SFunction column, SFunction... columns) { - return orderByAsc(true, column, columns); + return orderByAsc(true, null, column, columns); + } + + default Children orderByAsc(String alias, SFunction column, SFunction... columns) { + return orderByAsc(true, alias, column, columns); + } + + default Children orderByAsc(boolean condition, String alias, SFunction column, SFunction... columns) { + return orderBy(condition, true, alias, column, columns); } /** @@ -318,33 +404,44 @@ public interface Func extends Serializable { * @return children */ default Children orderByAsc(boolean condition, SFunction column, SFunction... columns) { - return orderBy(condition, true, column, columns); + return orderBy(condition, true, null, column, columns); } - /** - * ignore - */ + default Children orderByDesc(SFunction column) { - return orderByDesc(true, column); + return orderByDesc(true, (String) null, column); } - /** - * ignore - */ + default Children orderByDesc(String alias, SFunction column) { + return orderByDesc(true, alias, column); + } + + default Children orderByDesc(List> columns) { - return orderByDesc(true, columns); + return orderByDesc(true, null, columns); } - /** - * ignore - */ - Children orderByDesc(boolean condition, List> columns); + default Children orderByDesc(String alias, List> columns) { + return orderByDesc(true, alias, columns); + } + + default Children orderByDesc(boolean condition, List> columns) { + return orderByDesc(condition, null, columns); + } + + Children orderByDesc(boolean condition, String alias, List> columns); + - /** - * ignore - */ default Children orderByDesc(SFunction column, SFunction... columns) { - return orderByDesc(true, column, columns); + return orderByDesc(true, null, column, columns); + } + + default Children orderByDesc(String alias, SFunction column, SFunction... columns) { + return orderByDesc(true, alias, column, columns); + } + + default Children orderByDesc(boolean condition, String alias, SFunction column, SFunction... columns) { + return orderBy(condition, false, alias, column, columns); } /** @@ -357,7 +454,11 @@ public interface Func extends Serializable { * @return children */ default Children orderByDesc(boolean condition, SFunction column, SFunction... columns) { - return orderBy(condition, false, column, columns); + return orderBy(condition, false, null, column, columns); + } + + default Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns) { + return orderBy(condition, isAsc, null, column, columns); } /** @@ -370,11 +471,9 @@ public interface Func extends Serializable { * @param columns 字段数组 * @return children */ - Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns); + Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns); + - /** - * ignore - */ default Children having(String sqlHaving, Object... params) { return having(true, sqlHaving, params); } @@ -391,9 +490,7 @@ public interface Func extends Serializable { */ Children having(boolean condition, String sqlHaving, Object... params); - /** - * ignore - */ + default Children func(Consumer consumer) { return func(true, consumer); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/OnCompare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/OnCompare.java index 0906cea..c12017c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/OnCompare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/OnCompare.java @@ -14,13 +14,36 @@ import java.io.Serializable; */ @SuppressWarnings("unused") public interface OnCompare extends Serializable { - /** - * ignore - */ + default Children eq(SFunction column, SFunction val) { return eq(true, column, val); } + + default Children eq(String alias, SFunction column, SFunction val) { + return eq(true, alias, column, val); + } + + default Children eq(SFunction column, String rightAlias, SFunction val) { + return eq(true, column, rightAlias, val); + } + + default Children eq(String alias, SFunction column, String rightAlias, SFunction val) { + return eq(true, alias, column, rightAlias, val); + } + + default Children eq(boolean condition, SFunction column, SFunction val) { + return eq(condition, null, column, null, val); + } + + default Children eq(boolean condition, String alias, SFunction column, SFunction val) { + return eq(condition, alias, column, null, val); + } + + default Children eq(boolean condition, SFunction column, String rightAlias, SFunction val) { + return eq(condition, null, column, rightAlias, val); + } + /** * 等于 = * @@ -29,13 +52,34 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children eq(boolean condition, SFunction column, SFunction val); + Children eq(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); - /** - * ignore - */ default Children ne(SFunction column, SFunction val) { - return ne(true, column, val); + return ne(true, null, column, null, val); + } + + default Children ne(String alias, SFunction column, SFunction val) { + return ne(true, alias, column, null, val); + } + + default Children ne(SFunction column, String rightAlias, SFunction val) { + return ne(true, null, column, rightAlias, val); + } + + default Children ne(String alias, SFunction column, String rightAlias, SFunction val) { + return ne(true, alias, column, rightAlias, val); + } + + default Children ne(boolean condition, SFunction column, SFunction val) { + return ne(condition, null, column, null, val); + } + + default Children ne(boolean condition, String alias, SFunction column, SFunction val) { + return ne(condition, alias, column, null, val); + } + + default Children ne(boolean condition, SFunction column, String rightAlias, SFunction val) { + return ne(condition, null, column, rightAlias, val); } /** @@ -46,13 +90,34 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children ne(boolean condition, SFunction column, SFunction val); + Children ne(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); - /** - * ignore - */ default Children gt(SFunction column, SFunction val) { - return gt(true, column, val); + return gt(true, null, column, null, val); + } + + default Children gt(String alias, SFunction column, SFunction val) { + return gt(true, alias, column, null, val); + } + + default Children gt(SFunction column, String rightAlias, SFunction val) { + return gt(true, null, column, rightAlias, val); + } + + default Children gt(String alias, SFunction column, String rightAlias, SFunction val) { + return gt(true, alias, column, rightAlias, val); + } + + default Children gt(boolean condition, SFunction column, SFunction val) { + return gt(condition, null, column, null, val); + } + + default Children gt(boolean condition, String alias, SFunction column, SFunction val) { + return gt(condition, alias, column, null, val); + } + + default Children gt(boolean condition, SFunction column, String rightAlias, SFunction val) { + return gt(condition, null, column, rightAlias, val); } /** @@ -63,13 +128,34 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children gt(boolean condition, SFunction column, SFunction val); + Children gt(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); - /** - * ignore - */ default Children ge(SFunction column, SFunction val) { - return ge(true, column, val); + return ge(true, null, column, null, val); + } + + default Children ge(String alias, SFunction column, SFunction val) { + return ge(true, alias, column, null, val); + } + + default Children ge(SFunction column, String rightAlias, SFunction val) { + return ge(true, null, column, rightAlias, val); + } + + default Children ge(String alias, SFunction column, String rightAlias, SFunction val) { + return ge(true, alias, column, rightAlias, val); + } + + default Children ge(boolean condition, SFunction column, SFunction val) { + return ge(condition, null, column, null, val); + } + + default Children ge(boolean condition, String alias, SFunction column, SFunction val) { + return ge(condition, alias, column, null, val); + } + + default Children ge(boolean condition, SFunction column, String rightAlias, SFunction val) { + return ge(condition, null, column, rightAlias, val); } /** @@ -80,13 +166,34 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children ge(boolean condition, SFunction column, SFunction val); + Children ge(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); - /** - * ignore - */ default Children lt(SFunction column, SFunction val) { - return lt(true, column, val); + return lt(true, null, column, null, val); + } + + default Children lt(String alias, SFunction column, SFunction val) { + return lt(true, alias, column, null, val); + } + + default Children lt(SFunction column, String rightAlias, SFunction val) { + return lt(true, null, column, rightAlias, val); + } + + default Children lt(String alias, SFunction column, String rightAlias, SFunction val) { + return lt(true, alias, column, rightAlias, val); + } + + default Children lt(boolean condition, SFunction column, SFunction val) { + return lt(condition, null, column, null, val); + } + + default Children lt(boolean condition, String alias, SFunction column, SFunction val) { + return lt(condition, alias, column, null, val); + } + + default Children lt(boolean condition, SFunction column, String rightAlias, SFunction val) { + return lt(condition, null, column, rightAlias, val); } /** @@ -97,13 +204,34 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children lt(boolean condition, SFunction column, SFunction val); + Children lt(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); - /** - * ignore - */ default Children le(SFunction column, SFunction val) { - return le(true, column, val); + return le(true, null, column, null, val); + } + + default Children le(String alias, SFunction column, SFunction val) { + return le(true, alias, column, null, val); + } + + default Children le(SFunction column, String rightAlias, SFunction val) { + return le(true, null, column, rightAlias, val); + } + + default Children le(String alias, SFunction column, String rightAlias, SFunction val) { + return le(true, alias, column, rightAlias, val); + } + + default Children le(boolean condition, SFunction column, SFunction val) { + return le(condition, null, column, null, val); + } + + default Children le(boolean condition, String alias, SFunction column, SFunction val) { + return le(condition, alias, column, null, val); + } + + default Children le(boolean condition, SFunction column, String rightAlias, SFunction val) { + return le(condition, null, column, rightAlias, val); } /** @@ -114,5 +242,5 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children le(boolean condition, SFunction column, SFunction val); + Children le(boolean condition, String alias, SFunction column, String rightAlias, SFunction val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java index f4abfac..ddeece3 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java @@ -25,6 +25,18 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.LEFT_JOIN, clazz, left, right); } + /** + * left join + * + * @param clazz 关联的实体类 + * @param left 条件 + * @param rightAlias 条件字段别名 + * @param right 条件 + */ + default Children leftJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { + return join(Constant.LEFT_JOIN, clazz, left, rightAlias, right); + } + /** * left join 多条件 *

@@ -71,6 +83,18 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.LEFT_JOIN, clazz, alias, left, right); } + /** + * left join + * + * @param clazz 关联的实体类 + * @param rightAlias 条件字段别名 + * @param left 条件 + * @param right 条件 + */ + default Children leftJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { + return join(Constant.LEFT_JOIN, clazz, alias, left, rightAlias, right); + } + /** * left join 多条件 *

@@ -111,6 +135,14 @@ public interface QueryJoin extends MPJBaseJoin, String */ default Children rightJoin(Class clazz, SFunction left, SFunction right) { return join(Constant.RIGHT_JOIN, clazz, left, right); + + } + + /** + * ignore 参考 left join + */ + default Children rightJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { + return join(Constant.RIGHT_JOIN, clazz, left, rightAlias, right); } /** @@ -137,8 +169,8 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, String alias, SFunction left, SFunction right) { - return join(Constant.RIGHT_JOIN, clazz, alias, left, right); + default Children rightJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { + return join(Constant.RIGHT_JOIN, clazz, alias, left, rightAlias, right); } /** @@ -167,7 +199,14 @@ public interface QueryJoin extends MPJBaseJoin, String * ignore 参考 left join */ default Children innerJoin(Class clazz, SFunction left, SFunction right) { - return join(Constant.INNER_JOIN, clazz, on -> on.eq(left, right)); + return join(Constant.INNER_JOIN, clazz, left, right); + } + + /** + * ignore 参考 left join + */ + default Children innerJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { + return join(Constant.INNER_JOIN, clazz, left, rightAlias, right); } /** @@ -227,6 +266,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.FULL_JOIN, clazz, left, right); } + /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, SFunction left, String rightAlias, SFunction right) { + return join(Constant.FULL_JOIN, clazz, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -255,6 +301,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.FULL_JOIN, clazz, alias, left, right); } + /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { + return join(Constant.FULL_JOIN, clazz, alias, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -291,6 +344,20 @@ public interface QueryJoin extends MPJBaseJoin, String return join(keyWord, clazz, on -> on.eq(left, right)); } + /** + * 自定义连表关键词 + *

+ * 查询基类 可以直接调用此方法实现以上所有功能 + * + * @param keyWord 连表关键字 + * @param clazz 连表实体类 + * @param left 关联条件 + * @param right 扩展 用于关联表的 select 和 where + */ + default Children join(String keyWord, Class clazz, SFunction left, String rightAlias, SFunction right) { + return join(keyWord, clazz, on -> on.eq(left, rightAlias,right)); + } + /** * 自定义连表关键词 *

@@ -332,6 +399,21 @@ public interface QueryJoin extends MPJBaseJoin, String return join(keyWord, clazz, alias, on -> on.eq(left, right)); } + /** + * 自定义连表关键词 + * 调用此方法 keyword 前后需要带空格 比如 " LEFT JOIN " " RIGHT JOIN " + *

+ * 查询基类 可以直接调用此方法实现以上所有功能 + * + * @param keyWord 连表关键字 + * @param clazz 连表实体类 + * @param left 关联条件 + * @param right 扩展 用于关联表的 select 和 where + */ + default Children join(String keyWord, Class clazz, String alias, SFunction left, String rightAlias, SFunction right) { + return join(keyWord, clazz, alias, on -> on.eq(left, rightAlias, right)); + } + /** * 自定义连表关键词 *

diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/TableAliasTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/TableAliasTest.java new file mode 100644 index 0000000..d1fb385 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/TableAliasTest.java @@ -0,0 +1,87 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.AreaDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class TableAliasTest { + @Autowired + private UserMapper userMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + @Test + void tableAlias() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr1.area_id) " + + "WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "GROUP BY t.id"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId) + .leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2) + .leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr1", AddressDO::getAreaId) + .groupBy(UserDO::getId); + + List dos = userMapper.selectJoinList(UserDO.class, wrapper); + dos.forEach(System.out::println); + } + + @Test + void tableAlias2() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr2.area_id) " + + "WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "GROUP BY t.id ORDER BY addr1.id DESC"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId) + .leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2) + .leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr2", AddressDO::getAreaId) + .groupBy(UserDO::getId) + .orderByDesc("addr1", AddressDO::getId); + + List dos = userMapper.selectJoinList(UserDO.class, wrapper); + dos.forEach(System.out::println); + } + + + @Test + void tableAliasEQ() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr2.area_id) WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "AND (addr1.id = ? AND addr2.id = ? AND addr1.id = ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId) + .leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2) + .leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr2", AddressDO::getAreaId) + .eq("addr1", AddressDO::getId, 1) + .eq("addr2", AddressDO::getId, 2) + .eq("addr1", AddressDO::getId, 3); + + List dos = userMapper.selectJoinList(UserDO.class, wrapper); + dos.forEach(System.out::println); + } +} From 25b3df16cff31568e15fb6572d900f3da6d7046c Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sun, 10 Dec 2023 05:45:42 +0800 Subject: [PATCH 31/88] =?UTF-8?q?=E4=BC=98=E5=8C=96idea=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/kt/KtAbstractLambdaWrapper.java | 10 +- .../yulichang/kt/KtAbstractWrapper.java | 74 ++++++------- .../yulichang/wrapper/MPJAbstractWrapper.java | 101 +++++++++++++++++- .../yulichang/test/join/m/OrderByTest.java | 58 ++++++++++ 4 files changed, 197 insertions(+), 46 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java index b1a6ad8..874577d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java @@ -43,6 +43,7 @@ public abstract class KtAbstractLambdaWrapper columnToString(index, (KProperty) i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA)); + protected final String columnsToString(Integer index, PrefixEnum prefixEnum, KProperty... columns) { + return Arrays.stream(columns).map(i -> columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } protected String columnToString(Integer index, KProperty column, boolean isJoin, PrefixEnum prefixEnum) { @@ -337,6 +338,7 @@ public abstract class KtAbstractLambdaWrapper LogicInfoUtils.getLogicInfoNoAnd( wrapper.getIndex(), wrapper.getJoinClass(), wrapper.isHasAlias(), wrapper.getAlias() @@ -364,10 +366,6 @@ public abstract class KtAbstractLambdaWrapper> extends Wrapper implements Compare, Nested, Join, Func, OnCompare, CompareStr, FuncStr { @@ -61,6 +61,7 @@ public abstract class KtAbstractWrapper paramNameValuePairs; /** * 其他 @@ -239,13 +240,13 @@ public abstract class KtAbstractWrapper column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), BETWEEN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @Override public Children notBetween(boolean condition, KProperty column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_BETWEEN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @@ -317,68 +318,68 @@ public abstract class KtAbstractWrapper column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NULL)); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NULL)); } @Override public Children isNotNull(boolean condition, KProperty column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NOT_NULL)); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NOT_NULL)); } @Override public Children in(boolean condition, KProperty column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(coll))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(coll))); } @Override public Children in(boolean condition, KProperty column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(values))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(values))); } @Override public Children notIn(boolean condition, KProperty column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(coll))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(coll))); } @Override public Children notIn(boolean condition, KProperty column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(values))); + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(values))); } @Override public Children inSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, () -> String.format("(%s)", inValue))); } @Override public Children notInSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, () -> String.format("(%s)", inValue))); } @Override public Children gtSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GT, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GT, () -> String.format("(%s)", inValue))); } @Override public Children geSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GE, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GE, () -> String.format("(%s)", inValue))); } @Override public Children ltSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LT, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LT, () -> String.format("(%s)", inValue))); } @Override public Children leSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LE, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LE, () -> String.format("(%s)", inValue))); } @@ -386,8 +387,7 @@ public abstract class KtAbstractWrapper> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - String one = (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns)); - final String finalOne = one; + final String finalOne = columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns); appendSqlSegments(GROUP_BY, () -> finalOne); } }); @@ -398,7 +398,7 @@ public abstract class KtAbstractWrapper { String one = columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); if (ArrayUtils.isNotEmpty(columns)) { - one += (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns)); + one += columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns); } final String finalOne = one; appendSqlSegments(GROUP_BY, () -> finalOne); @@ -408,10 +408,9 @@ public abstract class KtAbstractWrapper> columns) { return maybeDo(condition, () -> { - final SqlKeyword mode = ASC; if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c)), ASC)); } }); } @@ -419,10 +418,9 @@ public abstract class KtAbstractWrapper> columns) { return maybeDo(condition, () -> { - final SqlKeyword mode = DESC; if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c)), DESC)); } }); } @@ -431,10 +429,10 @@ public abstract class KtAbstractWrapper column, KProperty... columns) { return maybeDo(condition, () -> { final SqlKeyword mode = isAsc ? ASC : DESC; - appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column, false), mode); + appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column), mode); if (ArrayUtils.isNotEmpty(columns)) { Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode)); + columnToSqlSegment(index, columnSqlInjectFilter(c)), mode)); } }); } @@ -443,7 +441,7 @@ public abstract class KtAbstractWrapper columnSqlInjectFilter(KProperty column) { return column; @@ -481,7 +479,7 @@ public abstract class KtAbstractWrapper拼接 LIKE 以及 值

*/ protected Children likeValue(boolean condition, SqlKeyword keyword, KProperty column, Object val, SqlLike sqlLike) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), keyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), keyword, () -> formatParam(null, SqlUtils.concatLike(val, sqlLike)))); } @@ -499,14 +497,14 @@ public abstract class KtAbstractWrapper column, SqlKeyword sqlKeyword, Object val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword, () -> formatParam(null, val))); } protected Children addCondition(boolean condition, KProperty column, SqlKeyword sqlKeyword, KProperty val) { Class c = (Class) KtUtils.ref(column); Class v = (Class) KtUtils.ref(val); - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword, isNo ? columnToSqlSegmentS(index, val, v == c && v == joinClass) : columnToSqlSegmentS(index, val, v == c) @@ -550,6 +548,7 @@ public abstract class KtAbstractWrapper getParamNameValuePairs() { - return paramNameValuePairs; - } - public String getParamAlias() { return paramAlias.getStringValue() == null ? Constants.WRAPPER : paramAlias.getStringValue(); } @@ -685,6 +680,7 @@ public abstract class KtAbstractWrapper column, boolean isJoin) { - return () -> columnToString(index, column, isJoin, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); + protected final ISqlSegment columnToSqlSegment(Integer index, KProperty column) { + return () -> columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); } protected final ISqlSegment columnToSqlSegmentS(Integer index, KProperty column, boolean isJoin) { @@ -740,12 +736,16 @@ public abstract class KtAbstractWrapper this.columnToString(index, i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA)); + protected String columnsToString(Integer index, PrefixEnum prefixEnum, KProperty... columns) { + return Arrays.stream(columns).map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } + protected String columnsToString(Integer index, PrefixEnum prefixEnum, List> columns) { + return columns.stream().map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); + } + + @SuppressWarnings("MethodDoesntCallSuperMethod") @Override - @SuppressWarnings("all") public Children clone() { return SerializationUtils.clone(typedThis); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index dbd1832..d8ee2e4 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -400,14 +400,32 @@ public abstract class MPJAbstractWrapper Children groupBy(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - final String finalOne = (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns)); + final String finalOne = columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns); appendSqlSegments(GROUP_BY, () -> finalOne); } }); } - @SafeVarargs @Override + @SafeVarargs + public final Children groupBy(SFunction column, SFunction... columns) { + return groupBy(true, null, column, columns); + } + + @Override + @SafeVarargs + public final Children groupBy(String alias, SFunction column, SFunction... columns) { + return groupBy(true, alias, column, columns); + } + + @Override + @SafeVarargs + public final Children groupBy(boolean condition, SFunction column, SFunction... columns) { + return groupBy(condition, null, column, columns); + } + + @Override + @SafeVarargs public final Children groupBy(boolean condition, String alias, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { String one = columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); @@ -429,6 +447,39 @@ public abstract class MPJAbstractWrapper Children orderByAsc(SFunction column, SFunction... columns) { + return orderByAsc(true, null, column, columns); + } + + @Override + @SafeVarargs + public final Children orderByAsc(String alias, SFunction column, SFunction... columns) { + return orderByAsc(true, alias, column, columns); + } + + @Override + @SafeVarargs + public final Children orderByAsc(boolean condition, String alias, SFunction column, SFunction... columns) { + return orderBy(condition, true, alias, column, columns); + } + + /** + * 排序:ORDER BY 字段, ... ASC + *

例: orderByAsc("id", "name")

+ * + * @param condition 执行条件 + * @param column 单个字段 + * @param columns 字段数组 + * @return children + */ + @Override + @SafeVarargs + public final Children orderByAsc(boolean condition, SFunction column, SFunction... columns) { + return orderBy(condition, true, null, column, columns); + } + @Override public Children orderByDesc(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { @@ -440,7 +491,41 @@ public abstract class MPJAbstractWrapper Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns) { + @SafeVarargs + public final Children orderByDesc(SFunction column, SFunction... columns) { + return orderByDesc(true, null, column, columns); + } + + @Override + @SafeVarargs + public final Children orderByDesc(String alias, SFunction column, SFunction... columns) { + return orderByDesc(true, alias, column, columns); + } + + @Override + @SafeVarargs + public final Children orderByDesc(boolean condition, String alias, SFunction column, SFunction... columns) { + return orderBy(condition, false, alias, column, columns); + } + + /** + * 排序:ORDER BY 字段, ... DESC + *

例: orderByDesc("id", "name")

+ * + * @param condition 执行条件 + * @param column 单个字段 + * @param columns 字段数组 + * @return children + */ + @Override + @SafeVarargs + public final Children orderByDesc(boolean condition, SFunction column, SFunction... columns) { + return orderBy(condition, false, null, column, columns); + } + + @Override + @SafeVarargs + public final Children orderBy(boolean condition, boolean isAsc, String alias, SFunction column, SFunction... columns) { return maybeDo(condition, () -> { final SqlKeyword mode = isAsc ? ASC : DESC; appendSqlSegments(ORDER_BY, columnToSqlSegment(index, alias, column), mode); @@ -451,6 +536,12 @@ public abstract class MPJAbstractWrapper Children orderBy(boolean condition, boolean isAsc, SFunction column, SFunction... columns) { + return orderBy(condition, isAsc, null, column, columns); + } + /** * 字段 SQL 注入过滤处理,子类重写实现过滤逻辑 * @@ -751,6 +842,10 @@ public abstract class MPJAbstractWrapper String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns); + public String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, List columns) { + return columns.stream().map(i -> columnToString(index, alias, (SFunction) i, false, prefixEnum)).collect(joining(StringPool.COMMA)); + } + @Override @SuppressWarnings("MethodDoesntCallSuperMethod") public Children clone() { diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java new file mode 100644 index 0000000..f016bd4 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/OrderByTest.java @@ -0,0 +1,58 @@ +package com.github.yulichang.test.join.m; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Arrays; +import java.util.List; + +@SpringBootTest +public class OrderByTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + @Test + void orderBy() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by " + + "FROM `user` t WHERE t.del = false AND (t.id = ?) ORDER BY t.id ASC, t.`name` ASC, t.pid ASC"); + List> columList = Arrays.asList(UserDO::getId, UserDO::getName, UserDO::getPid); + + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .eq(UserDO::getId, 1) + .orderByAsc(columList); + + + List list = wrapper.list(); + list.forEach(System.out::println); + } + + @Test + void orderBy1() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by " + + "FROM `user` t WHERE t.del = false AND (t.id = ?) GROUP BY t.id, t.`name`, t.pid"); + List> columList = Arrays.asList(UserDO::getId, UserDO::getName, UserDO::getPid); + + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .eq(UserDO::getId, 1) + .groupBy(columList); +// .groupBy(UserDO::getId, UserDO::getName, UserDO::getPid); +// .orderByAsc(columList); + + + List list = wrapper.list(); + list.forEach(System.out::println); + } + +} From 9ce2b519b110e503d5d112b45e712e74735ff68f Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 11 Dec 2023 03:42:50 +0800 Subject: [PATCH 32/88] =?UTF-8?q?=E5=88=AB=E5=90=8D=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/kt/KtAbstractLambdaWrapper.java | 13 +- .../yulichang/kt/KtAbstractWrapper.java | 181 ++++---- .../yulichang/kt/interfaces/Compare.java | 228 +++++++---- .../github/yulichang/kt/interfaces/Func.java | 386 +++++++++++------- .../yulichang/kt/interfaces/OnCompare.java | 192 +++++++-- .../yulichang/kt/interfaces/QueryJoin.java | 79 ++++ .../yulichang/test/config/MPConfig.java | 150 ------- .../test/config/MybatisPlusConfig.java | 19 +- .../yulichang/test/kt/m/CustomWrapperTest.kt | 3 +- .../github/yulichang/test/kt/m/OrderByTest.kt | 49 +++ .../yulichang/test/kt/m/TableAliasTest.kt | 88 ++++ 11 files changed, 856 insertions(+), 532 deletions(-) delete mode 100644 mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MPConfig.java create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/OrderByTest.kt create mode 100644 mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/TableAliasTest.kt diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java index 874577d..743305f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractLambdaWrapper.java @@ -218,18 +218,13 @@ public abstract class KtAbstractLambdaWrapper) column, isJoin, prefixEnum); + protected final String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, KProperty... columns) { + return Arrays.stream(columns).map(i -> columnToString(index, alias, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } - @Override - protected final String columnsToString(Integer index, PrefixEnum prefixEnum, KProperty... columns) { - return Arrays.stream(columns).map(i -> columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); - } - - protected String columnToString(Integer index, KProperty column, boolean isJoin, PrefixEnum prefixEnum) { + protected String columnToString(Integer index, String alias, KProperty column, boolean isJoin, PrefixEnum prefixEnum) { Class entityClass = KtUtils.ref(column); - return getDefault(index, entityClass, isJoin, prefixEnum) + StringPool.DOT + getCache(column).getColumn(); + return (alias == null ? getDefault(index, entityClass, isJoin, prefixEnum) : alias) + StringPool.DOT + getCache(column).getColumn(); } protected SelectCache getCache(KProperty fn) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index dc913dc..b5bcb31 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -189,64 +189,64 @@ public abstract class KtAbstractWrapper column, Object val) { - return addCondition(condition, column, EQ, val); + public Children eq(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, EQ, val); } @Override - public Children ne(boolean condition, KProperty column, Object val) { - return addCondition(condition, column, NE, val); + public Children ne(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, NE, val); } @Override - public Children gt(boolean condition, KProperty column, Object val) { - return addCondition(condition, column, GT, val); + public Children gt(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, GT, val); } @Override - public Children ge(boolean condition, KProperty column, Object val) { - return addCondition(condition, column, GE, val); + public Children ge(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, GE, val); } @Override - public Children lt(boolean condition, KProperty column, Object val) { - return addCondition(condition, column, LT, val); + public Children lt(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, LT, val); } @Override - public Children le(boolean condition, KProperty column, Object val) { - return addCondition(condition, column, LE, val); + public Children le(boolean condition, String alias, KProperty column, Object val) { + return addCondition(condition, alias, column, LE, val); } @Override - public Children like(boolean condition, KProperty column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.DEFAULT); + public Children like(boolean condition, String alias, KProperty column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.DEFAULT); } @Override - public Children notLike(boolean condition, KProperty column, Object val) { - return likeValue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT); + public Children notLike(boolean condition, String alias, KProperty column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.DEFAULT); } @Override - public Children likeLeft(boolean condition, KProperty column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.LEFT); + public Children likeLeft(boolean condition, String alias, KProperty column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.LEFT); } @Override - public Children likeRight(boolean condition, KProperty column, Object val) { - return likeValue(condition, LIKE, column, val, SqlLike.RIGHT); + public Children likeRight(boolean condition, String alias, KProperty column, Object val) { + return likeValue(condition, LIKE, alias, column, val, SqlLike.RIGHT); } @Override - public Children between(boolean condition, KProperty column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), BETWEEN, + public Children between(boolean condition, String alias, KProperty column, Object val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @Override - public Children notBetween(boolean condition, KProperty column, Object val1, Object val2) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_BETWEEN, + public Children notBetween(boolean condition, String alias, KProperty column, Object val1, Object val2) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_BETWEEN, () -> formatParam(null, val1), AND, () -> formatParam(null, val2))); } @@ -317,122 +317,119 @@ public abstract class KtAbstractWrapper column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NULL)); + public Children isNull(boolean condition, String alias, KProperty column) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NULL)); } @Override - public Children isNotNull(boolean condition, KProperty column) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IS_NOT_NULL)); + public Children isNotNull(boolean condition, String alias, KProperty column) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NOT_NULL)); } @Override - public Children in(boolean condition, KProperty column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(coll))); + public Children in(boolean condition, String alias, KProperty column, Collection coll) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(coll))); } @Override - public Children in(boolean condition, KProperty column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, inExpression(values))); + public Children in(boolean condition, String alias, KProperty column, Object... values) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(values))); } @Override - public Children notIn(boolean condition, KProperty column, Collection coll) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(coll))); + public Children notIn(boolean condition, String alias, KProperty column, Collection coll) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(coll))); } @Override - public Children notIn(boolean condition, KProperty column, Object... values) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, inExpression(values))); + public Children notIn(boolean condition, String alias, KProperty column, Object... values) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(values))); } @Override - public Children inSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), IN, + public Children inSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, () -> String.format("(%s)", inValue))); } @Override - public Children notInSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), NOT_IN, + public Children notInSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, () -> String.format("(%s)", inValue))); } @Override - public Children gtSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GT, + public Children gtSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GT, () -> String.format("(%s)", inValue))); } @Override - public Children geSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), GE, + public Children geSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GE, () -> String.format("(%s)", inValue))); } @Override - public Children ltSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LT, + public Children ltSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LT, () -> String.format("(%s)", inValue))); } @Override - public Children leSql(boolean condition, KProperty column, String inValue) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), LE, + public Children leSql(boolean condition, String alias, KProperty column, String inValue) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LE, () -> String.format("(%s)", inValue))); } @Override - public Children groupBy(boolean condition, List> columns) { + public Children groupBy(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - final String finalOne = columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns); + final String finalOne = columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns); appendSqlSegments(GROUP_BY, () -> finalOne); } }); } @Override - public Children groupBy(boolean condition, KProperty column, KProperty... columns) { + public Children groupBy(boolean condition, String alias, KProperty... columns) { return maybeDo(condition, () -> { - String one = columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); if (ArrayUtils.isNotEmpty(columns)) { - one += columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns); + final String finalOne = columnsToString(index, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns); + appendSqlSegments(GROUP_BY, () -> finalOne); } - final String finalOne = one; - appendSqlSegments(GROUP_BY, () -> finalOne); }); } @Override - public Children orderByAsc(boolean condition, List> columns) { + public Children orderByAsc(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c)), ASC)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), ASC)); } }); } @Override - public Children orderByDesc(boolean condition, List> columns) { + public Children orderByDesc(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { columns.forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c)), DESC)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), DESC)); } }); } @Override - public Children orderBy(boolean condition, boolean isAsc, KProperty column, KProperty... columns) { + public Children orderBy(boolean condition, boolean isAsc, String alias, KProperty... columns) { return maybeDo(condition, () -> { final SqlKeyword mode = isAsc ? ASC : DESC; - appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column), mode); if (ArrayUtils.isNotEmpty(columns)) { Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY, - columnToSqlSegment(index, columnSqlInjectFilter(c)), mode)); + columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), mode)); } }); } @@ -478,8 +475,8 @@ public abstract class KtAbstractWrapper拼接 LIKE 以及 值

*/ - protected Children likeValue(boolean condition, SqlKeyword keyword, KProperty column, Object val, SqlLike sqlLike) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), keyword, + protected Children likeValue(boolean condition, SqlKeyword keyword, String alias, KProperty column, Object val, SqlLike sqlLike) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), keyword, () -> formatParam(null, SqlUtils.concatLike(val, sqlLike)))); } @@ -496,18 +493,18 @@ public abstract class KtAbstractWrapper column, SqlKeyword sqlKeyword, Object val) { - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword, + protected Children addCondition(boolean condition, String alias, KProperty column, SqlKeyword sqlKeyword, Object val) { + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword, () -> formatParam(null, val))); } - protected Children addCondition(boolean condition, KProperty column, SqlKeyword sqlKeyword, KProperty val) { + protected Children addCondition(boolean condition, String alias, KProperty column, SqlKeyword sqlKeyword, String rightAlias, KProperty val) { Class c = (Class) KtUtils.ref(column); Class v = (Class) KtUtils.ref(val); - return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column), sqlKeyword, + return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword, isNo ? - columnToSqlSegmentS(index, val, v == c && v == joinClass) : - columnToSqlSegmentS(index, val, v == c) + columnToSqlSegmentS(index, rightAlias, val, v == c && v == joinClass) : + columnToSqlSegmentS(index, rightAlias, val, v == c) )); } @@ -690,18 +687,18 @@ public abstract class KtAbstractWrapper column) { - return () -> columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); + protected final ISqlSegment columnToSqlSegment(Integer index, String alias, KProperty column) { + return () -> columnToString(index, alias, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST); } - protected final ISqlSegment columnToSqlSegmentS(Integer index, KProperty column, boolean isJoin) { + protected final ISqlSegment columnToSqlSegmentS(Integer index, String alias, KProperty column, boolean isJoin) { PrefixEnum prefixEnum; if (isMain) { prefixEnum = isNo ? PrefixEnum.ON_SECOND /* 理论上不可能有这种情况 */ : PrefixEnum.CD_SECOND; } else { prefixEnum = isNo ? PrefixEnum.ON_SECOND : PrefixEnum.CD_ON_SECOND; } - return () -> columnToString(index, column, isJoin, prefixEnum); + return () -> columnToString(index, alias, column, isJoin, prefixEnum); } protected final ISqlSegment columnToSqlSegment(String column) { @@ -711,9 +708,7 @@ public abstract class KtAbstractWrapper column, boolean isJoin, PrefixEnum prefixEnum); protected String columnToString(String column) { if (checkSqlInjection && MPJSqlInjectionUtils.check(column)) { @@ -736,12 +731,12 @@ public abstract class KtAbstractWrapper... columns) { - return Arrays.stream(columns).map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); + protected String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, KProperty... columns) { + return Arrays.stream(columns).map(i -> this.columnToString(index, alias, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } - protected String columnsToString(Integer index, PrefixEnum prefixEnum, List> columns) { - return columns.stream().map(i -> this.columnToString(index, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); + protected String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, List> columns) { + return columns.stream().map(i -> this.columnToString(index, alias, i, false, prefixEnum)).collect(joining(StringPool.COMMA)); } @SuppressWarnings("MethodDoesntCallSuperMethod") @@ -762,33 +757,33 @@ public abstract class KtAbstractWrapper column, KProperty val) { - return addCondition(condition, column, EQ, val); + public Children eq(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, EQ, rightAlias, val); } @Override - public Children ne(boolean condition, KProperty column, KProperty val) { - return addCondition(condition, column, NE, val); + public Children ne(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, NE, rightAlias, val); } @Override - public Children gt(boolean condition, KProperty column, KProperty val) { - return addCondition(condition, column, GT, val); + public Children gt(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, GT, rightAlias, val); } @Override - public Children ge(boolean condition, KProperty column, KProperty val) { - return addCondition(condition, column, GE, val); + public Children ge(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, GE, rightAlias, val); } @Override - public Children lt(boolean condition, KProperty column, KProperty val) { - return addCondition(condition, column, LT, val); + public Children lt(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, LT, rightAlias, val); } @Override - public Children le(boolean condition, KProperty column, KProperty val) { - return addCondition(condition, column, LE, val); + public Children le(boolean condition, String alias, KProperty column, String rightAlias, KProperty val) { + return addCondition(condition, alias, column, LE, rightAlias, val); } /* ****************************************** **/ diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java index da0ea14..b995c71 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java @@ -13,17 +13,13 @@ import java.util.Map; @SuppressWarnings("unused") public interface Compare extends Serializable { - /** - * ignore - */ - default Children allEq(Map,?> params) { + + default Children allEq(Map, ?> params) { return allEq(params, true); } - /** - * ignore - */ - default Children allEq(Map, ?> params, boolean null2IsNull) { + + default Children allEq(Map, ?> params, boolean null2IsNull) { return allEq(true, params, null2IsNull); } @@ -35,15 +31,19 @@ public interface Compare extends Serializable { * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段\ * @return children */ - Children allEq(boolean condition, Map, ?> params, boolean null2IsNull); + Children allEq(boolean condition, Map, ?> params, boolean null2IsNull); - /** - * ignore - */ - @SuppressWarnings("UnusedReturnValue") - default Children eq(KProperty column, Object val) { - return eq(true, column, val); + default Children eq(KProperty column, Object val) { + return eq(true, null, column, val); + } + + default Children eq(String alias, KProperty column, Object val) { + return eq(true, alias, column, val); + } + + default Children eq(boolean condition, KProperty column, Object val) { + return eq(condition, null, column, val); } /** @@ -54,13 +54,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children eq(boolean condition, KProperty column, Object val); + Children eq(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children ne(KProperty column, Object val) { - return ne(true, column, val); + + default Children ne(KProperty column, Object val) { + return ne(true, null, column, val); + } + + default Children ne(String alias, KProperty column, Object val) { + return ne(true, alias, column, val); + } + + default Children ne(boolean condition, KProperty column, Object val) { + return ne(condition, null, column, val); } /** @@ -71,13 +77,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children ne(boolean condition, KProperty column, Object val); + Children ne(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children gt(KProperty column, Object val) { - return gt(true, column, val); + + default Children gt(KProperty column, Object val) { + return gt(true, null, column, val); + } + + default Children gt(String alias, KProperty column, Object val) { + return gt(true, alias, column, val); + } + + default Children gt(boolean condition, KProperty column, Object val) { + return gt(condition, null, column, val); } /** @@ -88,13 +100,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children gt(boolean condition, KProperty column, Object val); + Children gt(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children ge(KProperty column, Object val) { - return ge(true, column, val); + + default Children ge(KProperty column, Object val) { + return ge(true, null, column, val); + } + + default Children ge(String alias, KProperty column, Object val) { + return ge(true, alias, column, val); + } + + default Children ge(boolean condition, KProperty column, Object val) { + return ge(condition, null, column, val); } /** @@ -105,13 +123,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children ge(boolean condition, KProperty column, Object val); + Children ge(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children lt(KProperty column, Object val) { - return lt(true, column, val); + + default Children lt(KProperty column, Object val) { + return lt(true, null, column, val); + } + + default Children lt(String alias, KProperty column, Object val) { + return lt(true, alias, column, val); + } + + default Children lt(boolean condition, KProperty column, Object val) { + return lt(condition, null, column, val); } /** @@ -122,13 +146,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children lt(boolean condition, KProperty column, Object val); + Children lt(boolean condition, String alias, KProperty column, Object val); + - /** - * ignore - */ default Children le(KProperty column, Object val) { - return le(true, column, val); + return le(true, null, column, val); + } + + default Children le(String alias, KProperty column, Object val) { + return le(true, alias, column, val); + } + + default Children le(boolean condition, KProperty column, Object val) { + return le(condition, null, column, val); } /** @@ -139,13 +169,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children le(boolean condition, KProperty column, Object val); + Children le(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children between(KProperty column, Object val1, Object val2) { - return between(true, column, val1, val2); + + default Children between(KProperty column, Object val1, Object val2) { + return between(true, null, column, val1, val2); + } + + default Children between(String alias, KProperty column, Object val1, Object val2) { + return between(true, alias, column, val1, val2); + } + + default Children between(boolean condition, KProperty column, Object val1, Object val2) { + return between(condition, null, column, val1, val2); } /** @@ -157,13 +193,18 @@ public interface Compare extends Serializable { * @param val2 值2 * @return children */ - Children between(boolean condition, KProperty column, Object val1, Object val2); + Children between(boolean condition, String alias, KProperty column, Object val1, Object val2); - /** - * ignore - */ - default Children notBetween(KProperty column, Object val1, Object val2) { - return notBetween(true, column, val1, val2); + default Children notBetween(KProperty column, Object val1, Object val2) { + return notBetween(true, null, column, val1, val2); + } + + default Children notBetween(String alias, KProperty column, Object val1, Object val2) { + return notBetween(true, alias, column, val1, val2); + } + + default Children notBetween(boolean condition, KProperty column, Object val1, Object val2) { + return notBetween(condition, null, column, val1, val2); } /** @@ -175,13 +216,19 @@ public interface Compare extends Serializable { * @param val2 值2 * @return children */ - Children notBetween(boolean condition, KProperty column, Object val1, Object val2); + Children notBetween(boolean condition, String alias, KProperty column, Object val1, Object val2); - /** - * ignore - */ - default Children like(KProperty column, Object val) { - return like(true, column, val); + + default Children like(KProperty column, Object val) { + return like(true, null, column, val); + } + + default Children like(String alisa, KProperty column, Object val) { + return like(true, alisa, column, val); + } + + default Children like(boolean condition, KProperty column, Object val) { + return like(condition, null, column, val); } /** @@ -192,13 +239,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children like(boolean condition, KProperty column, Object val); + Children like(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children notLike(KProperty column, Object val) { - return notLike(true, column, val); + + default Children notLike(KProperty column, Object val) { + return notLike(true, null, column, val); + } + + default Children notLike(String alias, KProperty column, Object val) { + return notLike(true, alias, column, val); + } + + default Children notLike(boolean condition, KProperty column, Object val) { + return notLike(condition, null, column, val); } /** @@ -209,13 +262,19 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children notLike(boolean condition, KProperty column, Object val); + Children notLike(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children likeLeft(KProperty column, Object val) { - return likeLeft(true, column, val); + + default Children likeLeft(KProperty column, Object val) { + return likeLeft(true, null, column, val); + } + + default Children likeLeft(String alias, KProperty column, Object val) { + return likeLeft(true, alias, column, val); + } + + default Children likeLeft(boolean condition, KProperty column, Object val) { + return likeLeft(condition, null, column, val); } /** @@ -226,15 +285,22 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children likeLeft(boolean condition, KProperty column, Object val); + Children likeLeft(boolean condition, String alias, KProperty column, Object val); - /** - * ignore - */ - default Children likeRight(KProperty column, Object val) { - return likeRight(true, column, val); + + default Children likeRight(KProperty column, Object val) { + return likeRight(true, null, column, val); } + default Children likeRight(String alias, KProperty column, Object val) { + return likeRight(true, alias, column, val); + } + + default Children likeRight(boolean condition, KProperty column, Object val) { + return likeRight(condition, null, column, val); + } + + /** * LIKE '值%' * @@ -243,5 +309,5 @@ public interface Compare extends Serializable { * @param val 值 * @return children */ - Children likeRight(boolean condition, KProperty column, Object val); + Children likeRight(boolean condition, String alias, KProperty column, Object val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Func.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Func.java index ff417ff..2b74cf9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Func.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Func.java @@ -12,15 +12,20 @@ import java.util.function.Consumer; *

* copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func} */ -@SuppressWarnings({"unused", "JavadocDeclaration"}) +@SuppressWarnings("unused") public interface Func extends Serializable { - /** - * ignore - */ - @SuppressWarnings("UnusedReturnValue") + default Children isNull(KProperty column) { - return isNull(true, column); + return isNull(true, null, column); + } + + default Children isNull(String alias, KProperty column) { + return isNull(true, alias, column); + } + + default Children isNull(boolean condition, KProperty column) { + return isNull(condition, null, column); } /** @@ -31,13 +36,19 @@ public interface Func extends Serializable { * @param column 字段 * @return children */ - Children isNull(boolean condition, KProperty column); + Children isNull(boolean condition, String alias, KProperty column); + - /** - * ignore - */ default Children isNotNull(KProperty column) { - return isNotNull(true, column); + return isNotNull(true, null, column); + } + + default Children isNotNull(String alias, KProperty column) { + return isNotNull(true, alias, column); + } + + default Children isNotNull(boolean condition, KProperty column) { + return isNotNull(condition, null, column); } /** @@ -48,13 +59,19 @@ public interface Func extends Serializable { * @param column 字段 * @return children */ - Children isNotNull(boolean condition, KProperty column); + Children isNotNull(boolean condition, String alias, KProperty column); + - /** - * ignore - */ default Children in(KProperty column, Collection coll) { - return in(true, column, coll); + return in(true, null, column, coll); + } + + default Children in(String alias, KProperty column, Collection coll) { + return in(true, alias, column, coll); + } + + default Children in(boolean condition, KProperty column, Collection coll) { + return in(condition, null, column, coll); } /** @@ -69,13 +86,19 @@ public interface Func extends Serializable { * @param coll 数据集合 * @return children */ - Children in(boolean condition, KProperty column, Collection coll); + Children in(boolean condition, String alias, KProperty column, Collection coll); + - /** - * ignore - */ default Children in(KProperty column, Object... values) { - return in(true, column, values); + return in(true, null, column, values); + } + + default Children in(String alias, KProperty column, Object... values) { + return in(true, alias, column, values); + } + + default Children in(boolean condition, KProperty column, Object... values) { + return in(condition, null, column, values); } /** @@ -90,13 +113,19 @@ public interface Func extends Serializable { * @param values 数据数组 * @return children */ - Children in(boolean condition, KProperty column, Object... values); + Children in(boolean condition, String alias, KProperty column, Object... values); + - /** - * ignore - */ default Children notIn(KProperty column, Collection coll) { - return notIn(true, column, coll); + return notIn(true, null, column, coll); + } + + default Children notIn(String alias, KProperty column, Collection coll) { + return notIn(true, alias, column, coll); + } + + default Children notIn(boolean condition, KProperty column, Collection coll) { + return notIn(condition, null, column, coll); } /** @@ -108,13 +137,19 @@ public interface Func extends Serializable { * @param coll 数据集合 * @return children */ - Children notIn(boolean condition, KProperty column, Collection coll); + Children notIn(boolean condition, String alias, KProperty column, Collection coll); + - /** - * ignore - */ default Children notIn(KProperty column, Object... value) { - return notIn(true, column, value); + return notIn(true, null, column, value); + } + + default Children notIn(String alias, KProperty column, Object... value) { + return notIn(true, alias, column, value); + } + + default Children notIn(boolean condition, KProperty column, Object... values) { + return notIn(condition, null, column, values); } /** @@ -126,13 +161,19 @@ public interface Func extends Serializable { * @param values 数据数组 * @return children */ - Children notIn(boolean condition, KProperty column, Object... values); + Children notIn(boolean condition, String alias, KProperty column, Object... values); + - /** - * ignore - */ default Children inSql(KProperty column, String inValue) { - return inSql(true, column, inValue); + return inSql(true, null, column, inValue); + } + + default Children inSql(String alias, KProperty column, String inValue) { + return inSql(true, alias, column, inValue); + } + + default Children inSql(boolean condition, KProperty column, String inValue) { + return inSql(condition, null, column, inValue); } /** @@ -146,13 +187,19 @@ public interface Func extends Serializable { * @param inValue sql语句 * @return children */ - Children inSql(boolean condition, KProperty column, String inValue); + Children inSql(boolean condition, String alias, KProperty column, String inValue); + - /** - * ignore - */ default Children notInSql(KProperty column, String inValue) { - return notInSql(true, column, inValue); + return notInSql(true, null, column, inValue); + } + + default Children notInSql(String alias, KProperty column, String inValue) { + return notInSql(true, alias, column, inValue); + } + + default Children notInSql(boolean condition, KProperty column, String inValue) { + return notInSql(condition, null, column, inValue); } /** @@ -166,26 +213,42 @@ public interface Func extends Serializable { * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 * @return children */ - Children notInSql(boolean condition, KProperty column, String inValue); + Children notInSql(boolean condition, String alias, KProperty column, String inValue); + default Children gtSql(KProperty column, String inValue) { + return gtSql(true, null, column, inValue); + } + + default Children gtSql(String alias, KProperty column, String inValue) { + return gtSql(true, alias, column, inValue); + } + + default Children gtSql(boolean condition, KProperty column, String inValue) { + return gtSql(condition, null, column, inValue); + } /** * 字段 > ( sql语句 ) *

例1: gtSql("id", "1, 2, 3, 4, 5, 6")

*

例1: gtSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 + * @return children */ - Children gtSql(boolean condition, KProperty column, String inValue); + Children gtSql(boolean condition, String alias, KProperty column, String inValue); - /** - * ignore - */ - default Children gtSql(KProperty column, String inValue) { - return gtSql(true, column, inValue); + default Children geSql(KProperty column, String inValue) { + return geSql(true, null, column, inValue); + } + + default Children geSql(String alias, KProperty column, String inValue) { + return geSql(true, alias, column, inValue); + } + + default Children geSql(boolean condition, KProperty column, String inValue) { + return geSql(condition, null, column, inValue); } /** @@ -193,18 +256,24 @@ public interface Func extends Serializable { *

例1: geSql("id", "1, 2, 3, 4, 5, 6")

*

例1: geSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 + * @return children */ - Children geSql(boolean condition, KProperty column, String inValue); + Children geSql(boolean condition, String alias, KProperty column, String inValue); - /** - * ignore - */ - default Children geSql(KProperty column, String inValue) { - return geSql(true, column, inValue); + + default Children ltSql(KProperty column, String inValue) { + return ltSql(true, null, column, inValue); + } + + default Children ltSql(String alias, KProperty column, String inValue) { + return ltSql(true, alias, column, inValue); + } + + default Children ltSql(boolean condition, KProperty column, String inValue) { + return ltSql(condition, null, column, inValue); } /** @@ -212,18 +281,23 @@ public interface Func extends Serializable { *

例1: ltSql("id", "1, 2, 3, 4, 5, 6")

*

例1: ltSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 + * @return children */ - Children ltSql(boolean condition, KProperty column, String inValue); + Children ltSql(boolean condition, String alias, KProperty column, String inValue); - /** - * ignore - */ - default Children ltSql(KProperty column, String inValue) { - return ltSql(true, column, inValue); + default Children leSql(KProperty column, String inValue) { + return leSql(true, null, column, inValue); + } + + default Children leSql(String alias, KProperty column, String inValue) { + return leSql(true, alias, column, inValue); + } + + default Children leSql(boolean condition, KProperty column, String inValue) { + return leSql(condition, null, column, inValue); } /** @@ -231,44 +305,40 @@ public interface Func extends Serializable { *

例1: leSql("id", "1, 2, 3, 4, 5, 6")

*

例1: leSql("id", "select id from table where name = 'JunJun'")

* - * @param condition - * @param column - * @param inValue - * @return + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 + * @return children */ - Children leSql(boolean condition, KProperty column, String inValue); + Children leSql(boolean condition, String alias, KProperty column, String inValue); - /** - * ignore - */ - default Children leSql(KProperty column, String inValue) { - return leSql(true, column, inValue); - } - /** - * ignore - */ - default Children groupBy(KProperty column) { - return groupBy(true, column); - } - - /** - * ignore - */ default Children groupBy(List> column) { - return groupBy(true, column); + return groupBy(true, null, column); } - /** - * ignore - */ - Children groupBy(boolean condition, List> columns); + default Children groupBy(String alias, List> column) { + return groupBy(true, alias, column); + } - /** - * ignore - */ - default Children groupBy(KProperty column, KProperty... columns) { - return groupBy(true, column, columns); + default Children groupBy(boolean condition, List> columns) { + return groupBy(condition, null, columns); + } + + + Children groupBy(boolean condition, String alias, List> columns); + + + default Children groupBy(KProperty... columns) { + return groupBy(true, null, columns); + } + + default Children groupBy(String alias, KProperty... columns) { + return groupBy(true, alias, columns); + } + + default Children groupBy(boolean condition, KProperty... columns) { + return groupBy(condition, null, columns); } /** @@ -276,36 +346,42 @@ public interface Func extends Serializable { *

例: groupBy("id", "name")

* * @param condition 执行条件 - * @param column 单个字段 * @param columns 字段数组 * @return children */ - Children groupBy(boolean condition, KProperty column, KProperty... columns); + Children groupBy(boolean condition, String alias, KProperty... columns); + - /** - * ignore - */ default Children orderByAsc(KProperty column) { - return orderByAsc(true, column); + return orderByAsc(true, (String) null, column); } - /** - * ignore - */ + default Children orderByAsc(String alias, KProperty column) { + return orderByAsc(true, alias, column); + } + + default Children orderByAsc(List> columns) { - return orderByAsc(true, columns); + return orderByAsc(true, null, columns); } - /** - * ignore - */ - Children orderByAsc(boolean condition, List> columns); + default Children orderByAsc(String alias, List> columns) { + return orderByAsc(true, alias, columns); + } - /** - * ignore - */ - default Children orderByAsc(KProperty column, KProperty... columns) { - return orderByAsc(true, column, columns); + default Children orderByAsc(boolean condition, List> columns) { + return orderByAsc(condition, null, columns); + } + + Children orderByAsc(boolean condition, String alias, List> columns); + + + default Children orderByAsc(KProperty... columns) { + return orderByAsc(true, null, columns); + } + + default Children orderByAsc(String alias, KProperty... columns) { + return orderByAsc(true, alias, columns); } /** @@ -313,38 +389,38 @@ public interface Func extends Serializable { *

例: orderByAsc("id", "name")

* * @param condition 执行条件 - * @param column 单个字段 * @param columns 字段数组 * @return children */ - default Children orderByAsc(boolean condition, KProperty column, KProperty... columns) { - return orderBy(condition, true, column, columns); + default Children orderByAsc(boolean condition, KProperty... columns) { + return orderBy(condition, true, null, columns); } - /** - * ignore - */ - default Children orderByDesc(KProperty column) { - return orderByDesc(true, column); + default Children orderByAsc(boolean condition, String alias, KProperty... columns) { + return orderBy(condition, true, alias, columns); } - /** - * ignore - */ default Children orderByDesc(List> columns) { - return orderByDesc(true, columns); + return orderByDesc(true, null, columns); } - /** - * ignore - */ - Children orderByDesc(boolean condition, List> columns); + default Children orderByDesc(String alias, List> columns) { + return orderByDesc(true, alias, columns); + } - /** - * ignore - */ - default Children orderByDesc(KProperty column, KProperty... columns) { - return orderByDesc(true, column, columns); + default Children orderByDesc(boolean condition, List> columns) { + return orderByDesc(condition, null, columns); + } + + Children orderByDesc(boolean condition, String alias, List> columns); + + + default Children orderByDesc(KProperty... columns) { + return orderByDesc(true, null, columns); + } + + default Children orderByDesc(String alias, KProperty... columns) { + return orderByDesc(true, alias, columns); } /** @@ -352,12 +428,19 @@ public interface Func extends Serializable { *

例: orderByDesc("id", "name")

* * @param condition 执行条件 - * @param column 单个字段 * @param columns 字段数组 * @return children */ - default Children orderByDesc(boolean condition, KProperty column, KProperty... columns) { - return orderBy(condition, false, column, columns); + default Children orderByDesc(boolean condition, KProperty... columns) { + return orderBy(condition, false, null, columns); + } + + default Children orderByDesc(boolean condition, String alias, KProperty... columns) { + return orderBy(condition, false, alias, columns); + } + + default Children orderBy(boolean condition, boolean isAsc, KProperty... columns) { + return orderBy(condition, isAsc, null, columns); } /** @@ -366,15 +449,12 @@ public interface Func extends Serializable { * * @param condition 执行条件 * @param isAsc 是否是 ASC 排序 - * @param column 单个字段 * @param columns 字段数组 * @return children */ - Children orderBy(boolean condition, boolean isAsc, KProperty column, KProperty... columns); + Children orderBy(boolean condition, boolean isAsc, String alias, KProperty... columns); + - /** - * ignore - */ default Children having(String sqlHaving, Object... params) { return having(true, sqlHaving, params); } @@ -391,9 +471,7 @@ public interface Func extends Serializable { */ Children having(boolean condition, String sqlHaving, Object... params); - /** - * ignore - */ + default Children func(Consumer consumer) { return func(true, consumer); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/OnCompare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/OnCompare.java index f26dbef..430eaa8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/OnCompare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/OnCompare.java @@ -14,11 +14,33 @@ import java.io.Serializable; */ @SuppressWarnings("unused") public interface OnCompare extends Serializable { - /** - * ignore - */ + default Children eq(KProperty column, KProperty val) { - return eq(true, column, val); + return eq(true, null, column, null, val); + } + + default Children eq(String alias, KProperty column, KProperty val) { + return eq(true, alias, column, null, val); + } + + default Children eq(KProperty column, String rightAlias, KProperty val) { + return eq(true, null, column, rightAlias, val); + } + + default Children eq(String alias, KProperty column, String rightAlias, KProperty val) { + return eq(true, alias, column, rightAlias, val); + } + + default Children eq(boolean condition, KProperty column, KProperty val) { + return eq(condition, null, column, null, val); + } + + default Children eq(boolean condition, String alias, KProperty column, KProperty val) { + return eq(condition, alias, column, null, val); + } + + default Children eq(boolean condition, KProperty column, String rightAlias, KProperty val) { + return eq(condition, null, column, rightAlias, val); } /** @@ -29,13 +51,35 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children eq(boolean condition, KProperty column, KProperty val); + Children eq(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); + - /** - * ignore - */ default Children ne(KProperty column, KProperty val) { - return ne(true, column, val); + return ne(true, null, column, null, val); + } + + default Children ne(String alias, KProperty column, KProperty val) { + return ne(true, alias, column, null, val); + } + + default Children ne(KProperty column, String rightAlias, KProperty val) { + return ne(true, null, column, rightAlias, val); + } + + default Children ne(String alias, KProperty column, String rightAlias, KProperty val) { + return ne(true, alias, column, rightAlias, val); + } + + default Children ne(boolean condition, KProperty column, KProperty val) { + return ne(condition, null, column, null, val); + } + + default Children ne(boolean condition, String alias, KProperty column, KProperty val) { + return ne(condition, alias, column, null, val); + } + + default Children ne(boolean condition, KProperty column, String rightAlias, KProperty val) { + return ne(condition, null, column, rightAlias, val); } /** @@ -46,13 +90,35 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children ne(boolean condition, KProperty column, KProperty val); + Children ne(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); + - /** - * ignore - */ default Children gt(KProperty column, KProperty val) { - return gt(true, column, val); + return gt(true, null, column, null, val); + } + + default Children gt(String alias, KProperty column, KProperty val) { + return gt(true, alias, column, null, val); + } + + default Children gt(KProperty column, String rightAlias, KProperty val) { + return gt(true, null, column, rightAlias, val); + } + + default Children gt(String alias, KProperty column, String rightAlias, KProperty val) { + return gt(true, alias, column, rightAlias, val); + } + + default Children gt(boolean condition, KProperty column, KProperty val) { + return gt(condition, null, column, null, val); + } + + default Children gt(boolean condition, String alias, KProperty column, KProperty val) { + return gt(condition, alias, column, null, val); + } + + default Children gt(boolean condition, KProperty column, String rightAlias, KProperty val) { + return gt(condition, null, column, rightAlias, val); } /** @@ -63,13 +129,35 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children gt(boolean condition, KProperty column, KProperty val); + Children gt(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); + - /** - * ignore - */ default Children ge(KProperty column, KProperty val) { - return ge(true, column, val); + return ge(true, null, column, null, val); + } + + default Children ge(String alias, KProperty column, KProperty val) { + return ge(true, alias, column, null, val); + } + + default Children ge(KProperty column, String rightAlias, KProperty val) { + return ge(true, null, column, rightAlias, val); + } + + default Children ge(String alias, KProperty column, String rightAlias, KProperty val) { + return ge(true, alias, column, rightAlias, val); + } + + default Children ge(boolean condition, KProperty column, KProperty val) { + return ge(condition, null, column, null, val); + } + + default Children ge(boolean condition, String alias, KProperty column, KProperty val) { + return ge(condition, alias, column, null, val); + } + + default Children ge(boolean condition, KProperty column, String rightAlias, KProperty val) { + return ge(condition, null, column, rightAlias, val); } /** @@ -80,13 +168,35 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children ge(boolean condition, KProperty column, KProperty val); + Children ge(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); + - /** - * ignore - */ default Children lt(KProperty column, KProperty val) { - return lt(true, column, val); + return lt(true, null, column, null, val); + } + + default Children lt(String alias, KProperty column, KProperty val) { + return lt(true, alias, column, null, val); + } + + default Children lt(KProperty column, String rightAlias, KProperty val) { + return lt(true, null, column, rightAlias, val); + } + + default Children lt(String alias, KProperty column, String rightAlias, KProperty val) { + return lt(true, alias, column, rightAlias, val); + } + + default Children lt(boolean condition, KProperty column, KProperty val) { + return lt(condition, null, column, null, val); + } + + default Children lt(boolean condition, String alias, KProperty column, KProperty val) { + return lt(condition, alias, column, null, val); + } + + default Children lt(boolean condition, KProperty column, String rightAlias, KProperty val) { + return lt(condition, null, column, rightAlias, val); } /** @@ -97,13 +207,35 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children lt(boolean condition, KProperty column, KProperty val); + Children lt(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); + - /** - * ignore - */ default Children le(KProperty column, KProperty val) { - return le(true, column, val); + return le(true, null, column, null, val); + } + + default Children le(String alias, KProperty column, KProperty val) { + return le(true, alias, column, null, val); + } + + default Children le(KProperty column, String rightAlias, KProperty val) { + return le(true, null, column, rightAlias, val); + } + + default Children le(String alias, KProperty column, String rightAlias, KProperty val) { + return le(true, alias, column, rightAlias, val); + } + + default Children le(boolean condition, KProperty column, KProperty val) { + return le(condition, null, column, null, val); + } + + default Children le(boolean condition, String alias, KProperty column, KProperty val) { + return le(condition, alias, column, null, val); + } + + default Children le(boolean condition, KProperty column, String rightAlias, KProperty val) { + return le(condition, null, column, rightAlias, val); } /** @@ -114,5 +246,5 @@ public interface OnCompare extends Serializable { * @param val 值 * @return children */ - Children le(boolean condition, KProperty column, KProperty val); + Children le(boolean condition, String alias, KProperty column, String rightAlias, KProperty val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryJoin.java index d580e69..2767851 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryJoin.java @@ -26,6 +26,17 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.LEFT_JOIN, clazz, left, right); } + /** + * left join + * + * @param clazz 关联的实体类 + * @param left 条件 + * @param right 条件 + */ + default Children leftJoin(Class clazz, KProperty left, String rightAlias, KProperty right) { + return join(Constant.LEFT_JOIN, clazz, left, rightAlias, right); + } + /** * left join 多条件 *

@@ -72,6 +83,17 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.LEFT_JOIN, clazz, alias, left, right); } + /** + * left join + * + * @param clazz 关联的实体类 + * @param left 条件 + * @param right 条件 + */ + default Children leftJoin(Class clazz, String alias, KProperty left, String rightAlias, KProperty right) { + return join(Constant.LEFT_JOIN, clazz, alias, left, rightAlias, right); + } + /** * left join 多条件 *

@@ -114,6 +136,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.RIGHT_JOIN, clazz, left, right); } + /** + * ignore 参考 left join + */ + default Children rightJoin(Class clazz, KProperty left, String rightAlias, KProperty right) { + return join(Constant.RIGHT_JOIN, clazz, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -142,6 +171,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.RIGHT_JOIN, clazz, alias, left, right); } + /** + * ignore 参考 left join + */ + default Children rightJoin(Class clazz, String alias, KProperty left, String rightAlias, KProperty right) { + return join(Constant.RIGHT_JOIN, clazz, alias, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -171,6 +207,14 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.INNER_JOIN, clazz, on -> on.eq(left, right)); } + /** + * ignore 参考 left join + */ + default Children innerJoin(Class clazz, KProperty left, String rightAlias, KProperty right) { + return join(Constant.INNER_JOIN, clazz, left, rightAlias, right); + } + + /** * ignore 参考 left join */ @@ -200,6 +244,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.INNER_JOIN, clazz, alias, on -> on.eq(left, right)); } + /** + * ignore 参考 left join + */ + default Children innerJoin(Class clazz, String alias, KProperty left, String rightAlias, KProperty right) { + return join(Constant.INNER_JOIN, clazz, alias, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -228,6 +279,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.FULL_JOIN, clazz, left, right); } + /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, KProperty left, String rightAlias, KProperty right) { + return join(Constant.FULL_JOIN, clazz, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -256,6 +314,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(Constant.FULL_JOIN, clazz, alias, left, right); } + /** + * ignore 参考 left join + */ + default Children fullJoin(Class clazz, String alias, KProperty left, String rightAlias, KProperty right) { + return join(Constant.FULL_JOIN, clazz, alias, left, rightAlias, right); + } + /** * ignore 参考 left join */ @@ -292,6 +357,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(keyWord, clazz, on -> on.eq(left, right)); } + /** + * ignore + */ + default Children join(String keyWord, Class clazz, KProperty left, String rightAlias, KProperty right) { + return join(keyWord, clazz, on -> on.eq(left, rightAlias, right)); + } + /** * 自定义连表关键词 *

@@ -333,6 +405,13 @@ public interface QueryJoin extends MPJBaseJoin, String return join(keyWord, clazz, alias, on -> on.eq(left, right)); } + /** + * ignore + */ + default Children join(String keyWord, Class clazz, String alias, KProperty left, String rightAlias, KProperty right) { + return join(keyWord, clazz, alias, on -> on.eq(left, rightAlias, right)); + } + /** * 自定义连表关键词 *

diff --git a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MPConfig.java b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MPConfig.java deleted file mode 100644 index 075f156..0000000 --- a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MPConfig.java +++ /dev/null @@ -1,150 +0,0 @@ -//package com.github.yulichang.test.config; -// -//import com.baomidou.mybatisplus.core.injector.AbstractMethod; -//import com.baomidou.mybatisplus.core.injector.ISqlInjector; -//import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -//import com.baomidou.mybatisplus.core.toolkit.StringUtils; -//import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; -//import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -//import com.github.yulichang.injector.MPJSqlInjector; -//import com.github.yulichang.test.util.ThreadLocalUtils; -//import org.apache.ibatis.cache.CacheKey; -//import org.apache.ibatis.executor.Executor; -//import org.apache.ibatis.executor.statement.StatementHandler; -//import org.apache.ibatis.mapping.BoundSql; -//import org.apache.ibatis.mapping.MappedStatement; -//import org.apache.ibatis.plugin.*; -//import org.apache.ibatis.session.ResultHandler; -//import org.apache.ibatis.session.RowBounds; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.context.annotation.Primary; -//import org.springframework.core.Ordered; -//import org.springframework.core.annotation.Order; -//import org.springframework.stereotype.Component; -// -//import java.sql.Connection; -//import java.util.List; -//import java.util.Objects; -//import java.util.StringTokenizer; -// -///** -// * mp 3.3.x -// */ -//@Configuration -//public class MPConfig { -// -// @Bean -// public PaginationInterceptor mybatisPlusInterceptor() { -// return new PaginationInterceptor(); -// } -// -// @Bean -// @Primary -// @Order(Ordered.HIGHEST_PRECEDENCE) -// public ISqlInjector sqlInjector() { -// return new MPJSqlInjector() { -// @Override -// public List getMethodList(Class mapperClass) { -// List list = super.getMethodList(mapperClass); -// //添加你的方法 -// list.add(new InsertBatchSomeColumn()); -// return list; -// } -// }; -// } -// -// @Component -// @Intercepts({ -// @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}), -// @Signature(type = StatementHandler.class, method = "getBoundSql", args = {}), -// @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), -// @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), -// @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}), -// }) -// public static class SqlInterceptor implements Interceptor { -// -// @Override -// public Object intercept(Invocation invocation) throws Throwable { -// Object target = invocation.getTarget(); -// BoundSql boundSql = null; -// if (target instanceof StatementHandler) { -// boundSql = ((StatementHandler) target).getBoundSql(); -// String sql = boundSql.getSql(); -// List strings = ThreadLocalUtils.get(); -// if (CollectionUtils.isNotEmpty(strings)) { -// boolean flag = false; -// String ss = null; -// for (String s : strings) { -// if (sql != null && s != null) { -// String s1 = formatSql(sql); -// String s2 = formatSql(s); -// if (StringUtils.isNotBlank(s)) { -// if (!Objects.equals(s1.toLowerCase(), s2.toLowerCase())) { -// ss = s; -// } else { -// flag = true; -// break; -// -// } -// } -// } -// } -// if (flag) { -// System.out.println("==============================================="); -// System.out.println(); -// System.out.println("pass"); -// System.out.println(); -// System.out.println("==============================================="); -// } else { -// System.err.println("执行sql: " + removeExtraWhitespaces(sql)); -// System.err.println("预期sql: " + removeExtraWhitespaces(ss)); -// throw new RuntimeException("sql error"); -// } -// } -// } -// System.out.println(boundSql); -// return invocation.proceed(); -// } -// -// @Override -// public Object plugin(Object target) { -// if (target instanceof Executor || target instanceof StatementHandler) { -// return Plugin.wrap(target, this); -// } -// return target; -// } -// -// private String formatSql(String sql) { -// if (StringUtils.isBlank(sql)) { -// return sql; -// } -// sql = sql.replaceAll("\n", ""); -// sql = sql.replaceAll("\r", ""); -// sql = sql.replaceAll("\t", ""); -// return dg(sql); -// } -// -// private String dg(String str) { -// if (str.contains(" ")) { -// str = str.replaceAll(" ", ""); -// return dg(str); -// } -// return str; -// } -// -// private String removeExtraWhitespaces(String original) { -// StringTokenizer tokenizer = new StringTokenizer(original); -// StringBuilder builder = new StringBuilder(); -// boolean hasMoreTokens = tokenizer.hasMoreTokens(); -// while (hasMoreTokens) { -// builder.append(tokenizer.nextToken()); -// hasMoreTokens = tokenizer.hasMoreTokens(); -// if (hasMoreTokens) { -// builder.append(' '); -// } -// } -// return builder.toString(); -// } -// } -//} diff --git a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java index 2d9c743..f2a9b23 100644 --- a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java +++ b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java @@ -97,6 +97,10 @@ public class MybatisPlusConfig { @SneakyThrows public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { String sql = boundSql.getSql(); + check(sql); + } + + private void check(String sql) { List sqlList = ThreadLocalUtils.get(); if (CollectionUtils.isNotEmpty(sqlList)) { if (sqlList.stream().anyMatch(e -> Objects.equals(formatSql(sql), formatSql(e)))) { @@ -122,20 +126,7 @@ public class MybatisPlusConfig { if (sql.toUpperCase().startsWith("SELECT")) { return; } - List sqlList = ThreadLocalUtils.get(); - if (CollectionUtils.isNotEmpty(sqlList)) { - if (sqlList.stream().anyMatch(e -> Objects.equals(formatSql(sql), formatSql(e)))) { - System.out.println("==============================================="); - System.out.println(); - System.out.println("pass"); - System.out.println(); - System.out.println("==============================================="); - } else { - System.err.println("执行sql: " + SqlSourceBuilder.removeExtraWhitespaces(sql)); - sqlList.forEach(i -> System.err.println("预期sql: " + SqlSourceBuilder.removeExtraWhitespaces(i))); - throw new RuntimeException("sql error"); - } - } + check(sql); } } diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt index e0f0b9c..78c94a8 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt @@ -25,8 +25,9 @@ class CustomWrapperTest { //自定义wrapper扩展 class CWrapper : KtLambdaWrapper() { + fun eqIfAbsent(column: KProperty<*>, `val`: Any?): CWrapper { - super.eq(Objects.nonNull(`val`), column, `val`) + eq(Objects.nonNull(`val`), column, `val`) return this } diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/OrderByTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/OrderByTest.kt new file mode 100644 index 0000000..9e22b85 --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/OrderByTest.kt @@ -0,0 +1,49 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.kt.KtLambdaWrapper +import com.github.yulichang.test.kt.entity.UserDO +import com.github.yulichang.test.util.ThreadLocalUtils +import com.github.yulichang.toolkit.KtWrappers +import org.junit.jupiter.api.BeforeEach +import org.springframework.boot.test.context.SpringBootTest +import kotlin.reflect.KMutableProperty1 + +@SpringBootTest +class OrderByTest { + @BeforeEach + fun setUp() { + com.github.yulichang.test.util.Reset.reset() + } + + @org.junit.jupiter.api.Test + fun orderBy() { + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by " + + "FROM `user` t WHERE t.del = false AND (t.id = ?) ORDER BY t.id ASC, t.`name` ASC, t.pid ASC" + ) + val columList: List> = + listOf>(UserDO::id, UserDO::name, UserDO::pid) + val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .eq(UserDO::id, 1) + .orderByAsc(columList) + val list: List = wrapper.list() + list.forEach(System.out::println) + } + + @org.junit.jupiter.api.Test + fun orderBy1() { + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by " + + "FROM `user` t WHERE t.del = false AND (t.id = ?) GROUP BY t.id, t.`name`, t.pid" + ) + val columList: List> = + listOf>(UserDO::id, UserDO::name, UserDO::pid) + val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .eq(UserDO::id, 1) + .groupBy(columList) + val list: List = wrapper.list() + list.forEach(System.out::println) + } +} diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/TableAliasTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/TableAliasTest.kt new file mode 100644 index 0000000..e6a4d1a --- /dev/null +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/TableAliasTest.kt @@ -0,0 +1,88 @@ +package com.github.yulichang.test.kt.m + +import com.github.yulichang.kt.KtLambdaWrapper +import com.github.yulichang.test.kt.entity.AddressDO +import com.github.yulichang.test.kt.entity.AreaDO +import com.github.yulichang.test.kt.entity.UserDO +import com.github.yulichang.test.kt.mapper.UserMapper +import com.github.yulichang.test.util.Reset +import com.github.yulichang.test.util.ThreadLocalUtils +import com.github.yulichang.toolkit.KtWrappers +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class TableAliasTest { + + @Autowired + private val userMapper: UserMapper? = null + + @BeforeEach + fun setUp() { + Reset.reset() + } + + @Test + fun tableAlias() { + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr1.area_id) " + + "WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "GROUP BY t.id" + ) + val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .leftJoin(AddressDO::class.java, "addr1", AddressDO::id, UserDO::addressId) + .leftJoin(AddressDO::class.java, "addr2", AddressDO::id, UserDO::addressId2) + .leftJoin(AreaDO::class.java, "area1", AreaDO::id, "addr1", AddressDO::areaId) + .groupBy(UserDO::id) + val dos: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) + dos.forEach(System.out::println) + } + + @Test + fun tableAlias2() { + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr2.area_id) " + + "WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "GROUP BY t.id ORDER BY addr1.id DESC" + ) + val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .leftJoin(AddressDO::class.java, "addr1", AddressDO::id, UserDO::addressId) + .leftJoin(AddressDO::class.java, "addr2", AddressDO::id, UserDO::addressId2) + .leftJoin(AreaDO::class.java, "area1", AreaDO::id, "addr2", AddressDO::areaId) + .groupBy(UserDO::id) + .orderByDesc("addr1", AddressDO::id) + val dos: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) + dos.forEach(System.out::println) + } + + @Test + fun tableAliasEQ() { + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "LEFT JOIN address addr1 ON (addr1.id = t.address_id) " + + "LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " + + "LEFT JOIN area area1 ON (area1.id = addr2.area_id) WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " + + "AND (addr1.id = ? AND addr2.id = ? AND addr1.id = ?)" + ) + val wrapper: KtLambdaWrapper = KtWrappers.query(UserDO::class.java) + .selectAll(UserDO::class.java) + .leftJoin(AddressDO::class.java, "addr1", AddressDO::id, UserDO::addressId) + .leftJoin(AddressDO::class.java, "addr2", AddressDO::id, UserDO::addressId2) + .leftJoin(AreaDO::class.java, "area1", AreaDO::id, "addr2", AddressDO::areaId) + .eq("addr1", AddressDO::id, 1) + .eq("addr2", AddressDO::id, 2) + .eq("addr1", AddressDO::id, 3) + val dos: List = userMapper!!.selectJoinList(UserDO::class.java, wrapper) + dos.forEach(System.out::println) + } +} From 2b42b33f419e8b3be311c8680ac33f496edb6415 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 11 Dec 2023 04:06:13 +0800 Subject: [PATCH 33/88] =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/autoconfigure/MybatisPlusJoinProperties.java | 2 +- .../META-INF/additional-spring-configuration-metadata.json | 2 +- .../main/java/com/github/yulichang/config/ConfigProperties.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java index fdba2d8..637f000 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java @@ -43,7 +43,7 @@ public class MybatisPlusJoinProperties { /** * 逻辑删除类型 支持 where on */ - private String logicDelType = "where"; + private String logicDelType = "on"; /** * 映射查询最大深度 diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 936e2fa..e0d1738 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -40,7 +40,7 @@ }, { "name": "mybatis-plus-join.logic-del-type", - "defaultValue": "where", + "defaultValue": "on", "type": "java.lang.String", "description": "逻辑删除的位置支持where和on两个." }, diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index fa2350a..7151dd8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -29,7 +29,7 @@ public class ConfigProperties { /** * 逻辑删除类型 支持 where on */ - public static LogicDelTypeEnum logicDelType = LogicDelTypeEnum.WHERE; + public static LogicDelTypeEnum logicDelType = LogicDelTypeEnum.ON; /** * 逻辑删除类型 支持 where on */ From 69f673f531afc4d10d35d6b86b835aa959f84b60 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 11 Dec 2023 04:09:02 +0800 Subject: [PATCH 34/88] 1.4.8 --- README-zh.md | 4 ++-- README.md | 4 ++-- mybatis-plus-join-test/pom.xml | 6 +++--- mybatis-plus-join/pom.xml | 2 +- pom.xml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README-zh.md b/README-zh.md index 1d225fb..201a4c3 100644 --- a/README-zh.md +++ b/README-zh.md @@ -49,12 +49,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.2 + 1.4.8 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.2' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/README.md b/README.md index e49dc07..dd0dafa 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.7.2 + 1.4.8 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.7.2' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index f46b7e0..3a3fe4f 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -24,8 +24,8 @@ test-mapping - test-kotlin - + + An enhanced toolkit of Mybatis-Plus to simplify development. @@ -50,7 +50,7 @@ - 1.4.7.2 + 1.4.8 3.5.4.1 1.8 diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 6b3d6ea..79a65f2 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -41,7 +41,7 @@ - 1.4.7.2 + 1.4.8 1.8 1.8 diff --git a/pom.xml b/pom.xml index a737b3a..2677a96 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 1.4.7.2 + 1.4.8 3.5.4.1 1.8 From b8fbc6fc04b6f25876be0410d2662db113d49dab Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 12 Dec 2023 19:39:00 +0800 Subject: [PATCH 35/88] fix https://gitee.com/best_handsome/mybatis-plus-join/issues/I8NTF1 --- .../java/com/github/yulichang/toolkit/FieldStringMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java index 2d1196a..054ec0e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/FieldStringMap.java @@ -12,11 +12,11 @@ public class FieldStringMap extends HashMap { @Override public V get(Object key) { - return super.get(((String) key).toUpperCase(Locale.ENGLISH)); + return super.get(key == null ? null : ((String) key).toUpperCase(Locale.ENGLISH)); } @Override public boolean containsKey(Object key) { - return super.containsKey(((String) key).toUpperCase(Locale.ENGLISH)); + return super.containsKey(key == null ? null : ((String) key).toUpperCase(Locale.ENGLISH)); } } \ No newline at end of file From d8fa7ddf302fcb9ae24d9aa6437a4213e453c68a Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 12 Dec 2023 19:44:30 +0800 Subject: [PATCH 36/88] 1.4.8.1 --- README-zh.md | 4 ++-- README.md | 4 ++-- .../com/github/yulichang/config/MPJInterceptorConfig.java | 2 +- mybatis-plus-join-test/pom.xml | 2 +- mybatis-plus-join/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README-zh.md b/README-zh.md index 201a4c3..88e80fe 100644 --- a/README-zh.md +++ b/README-zh.md @@ -49,12 +49,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.8 + 1.4.8.1 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8.1' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/README.md b/README.md index dd0dafa..d44ae08 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.8 + 1.4.8.1 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8.1' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index 22a510a..b47a29d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.8"); + " 1.4.8.1"); } } diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 3a3fe4f..251c30b 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -50,7 +50,7 @@ - 1.4.8 + 1.4.8.1 3.5.4.1 1.8 diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 79a65f2..6bcab65 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -41,7 +41,7 @@ - 1.4.8 + 1.4.8.1 1.8 1.8 diff --git a/pom.xml b/pom.xml index 2677a96..b7d4d51 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 1.4.8 + 1.4.8.1 3.5.4.1 1.8 From 72f155319f0cc53439d41bfe80a0acc70229116e Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 18 Dec 2023 23:57:52 +0800 Subject: [PATCH 37/88] =?UTF-8?q?=E4=BC=98=E5=8C=96=20mapper=20not=20find?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisPlusJoinAutoConfiguration.java | 48 ++++++++++++------- .../yulichang/config/ConfigProperties.java | 4 ++ .../yulichang/toolkit/SpringContentUtils.java | 17 ++++++- .../github/yulichang/toolkit/TableHelper.java | 12 +++++ .../extension/mapping/config/DeepConfig.java | 5 +- .../mapping/config/MappingConfig.java | 7 ++- .../mapping/mapper/MPJTableFieldInfo.java | 3 +- .../mapping/mapper/MPJTableInfoHelper.java | 35 +++++++------- .../yulichang/test/join/Application.java | 6 +-- .../yulichang/test/mapping/Application.java | 4 ++ .../yulichang/test/mapping/entity/UserDO.java | 4 ++ .../src/main/resources/application.yml | 3 +- .../yulichang/test/mapping/MappingTest.java | 6 +-- 13 files changed, 102 insertions(+), 52 deletions(-) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 2d37bf3..eeba6eb 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -7,15 +7,18 @@ import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; import com.github.yulichang.config.enums.LogicDelTypeEnum; import com.github.yulichang.extension.mapping.config.MappingConfig; -import com.github.yulichang.toolkit.SpringContentUtils; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; +import com.github.yulichang.toolkit.SpringContentUtils; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -35,6 +38,7 @@ import org.springframework.core.annotation.Order; import javax.sql.DataSource; import java.util.List; +import java.util.Map; /** * springboot 自动配置类 @@ -42,7 +46,6 @@ import java.util.List; * @author yulichang * @since 1.3.7 */ -@SuppressWarnings("ALL") @Configuration(proxyBeanMethods = false) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) @ConditionalOnSingleCandidate(DataSource.class) @@ -52,13 +55,12 @@ public class MybatisPlusJoinAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(MybatisPlusJoinAutoConfiguration.class); - @SuppressWarnings("FieldCanBeLocal") private final MybatisPlusJoinProperties properties; - public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties) { this.properties = properties; + ConfigProperties.banner = properties.getBanner(); ConfigProperties.subTableLogic = properties.getSubTableLogic(); ConfigProperties.msCache = properties.isMsCache(); ConfigProperties.tableAlias = properties.getTableAlias(); @@ -81,6 +83,7 @@ public class MybatisPlusJoinAutoConfiguration { * mybatis plus 拦截器配置 */ @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) public MPJInterceptorConfig mpjInterceptorConfig(@Autowired(required = false) List sqlSessionFactoryList) { return new MPJInterceptorConfig(sqlSessionFactoryList, properties.getBanner()); @@ -112,41 +115,52 @@ public class MybatisPlusJoinAutoConfiguration { return new MPJSqlInjector(); } - /** - * springboot context 工具类 - */ - @Bean - @Order(Ordered.HIGHEST_PRECEDENCE) - @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) - public SpringContentUtils mpjSpringContent(@Autowired(required = false) MPJSpringContext springContext) { - return new SpringContentUtils(springContext); - } - @Configuration @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) public static class MPJMappingConfig implements ApplicationListener { + @Override @SuppressWarnings("NullableProblems") public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { - new MappingConfig(); + MappingConfig.init(); } } @Configuration @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) - public static class MPJSpringContext implements SpringContentUtils.SpringContext, ApplicationContextAware { + public static class MPJSpringContext implements SpringContentUtils.SpringContext, BeanFactoryPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; + private ListableBeanFactory listableBeanFactory; + @Override public T getBean(Class clazz) { - return this.applicationContext.getBean(clazz); + return getBeanFactory().getBean(clazz); } @Override + public Map getBeansOfType(Class clazz) { + return getBeanFactory().getBeansOfType(clazz); + } + + private ListableBeanFactory getBeanFactory() { + return applicationContext == null ? listableBeanFactory : applicationContext; + } + + @Override + @SuppressWarnings("NullableProblems") public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; + SpringContentUtils.setSpringContext(this); + } + + @Override + @SuppressWarnings("NullableProblems") + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + this.listableBeanFactory = beanFactory; + SpringContentUtils.setSpringContext(this); } } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index 7151dd8..e110c34 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -10,6 +10,10 @@ import com.github.yulichang.config.enums.LogicDelTypeEnum; */ public class ConfigProperties { + /** + * 是否开启副表逻辑删除 + */ + public static boolean banner = true; /** * 是否开启副表逻辑删除 */ diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java index 64b366d..5cbd1f2 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java @@ -4,8 +4,11 @@ package com.github.yulichang.toolkit; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.ibatis.session.SqlSession; +import java.util.Map; import java.util.Objects; /** @@ -14,18 +17,26 @@ import java.util.Objects; * @author yulichang * @since 1.2.0 */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class SpringContentUtils { private static SpringContext springContext; - public SpringContentUtils(SpringContext springContext) { - SpringContentUtils.springContext = springContext; + public static void setSpringContext(SpringContext springContext) { + if (Objects.isNull(SpringContentUtils.springContext)) { + SpringContentUtils.springContext = springContext; + } } public static T getBean(Class clazz) { return SpringContentUtils.springContext.getBean(clazz); } + @SuppressWarnings("UnusedReturnValue") + public static Map getBeansOfType(Class clazz) { + return SpringContentUtils.springContext.getBeansOfType(clazz); + } + @SuppressWarnings("unchecked") public static T getMapper(Class clazz) { if (Objects.isNull(springContext)) { @@ -45,5 +56,7 @@ public class SpringContentUtils { public interface SpringContext { T getBean(Class clazz); + + Map getBeansOfType(Class clazz); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java index 5cad42f..7bde51c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java @@ -1,12 +1,15 @@ package com.github.yulichang.toolkit; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.ClassUtils; +import com.github.yulichang.config.MPJInterceptorConfig; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author yulichang @@ -14,6 +17,8 @@ import java.util.concurrent.ConcurrentHashMap; */ public class TableHelper { + private static final AtomicBoolean load = new AtomicBoolean(false); + private static final Map, TableInfo> TABLE_INFO_CACHE = new ConcurrentHashMap<>(); public static void init(Class newClass, Class oldClass) { @@ -46,6 +51,13 @@ public class TableHelper { } if (Objects.nonNull(info)) { TABLE_INFO_CACHE.put(currentClass, info); + } else { + if (!load.get()) { + SpringContentUtils.getBean(MPJInterceptorConfig.class); + SpringContentUtils.getBeansOfType(BaseMapper.class); + load.set(true); + return get(clazz); + } } return info; } else { diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java index 1b2d11d..5879f55 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java @@ -18,24 +18,21 @@ import java.util.Objects; * @author yulichang * @since 1.4.5 */ +@Getter @Accessors(chain = true) public class DeepConfig { private static final DeepConfig defaultConfig = new DeepConfig<>(); - @Getter @Setter private List> property; - @Getter @Setter private boolean loop = false; - @Getter @Setter private int deep = ConfigProperties.mappingMaxCount; - @Getter @Setter private int maxDeep = ConfigProperties.mappingMaxCount; diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/MappingConfig.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/MappingConfig.java index b3185b9..e694fb1 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/MappingConfig.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/MappingConfig.java @@ -1,8 +1,10 @@ package com.github.yulichang.extension.mapping.config; -import com.github.yulichang.extension.mapping.mapper.MPJTableInfoHelper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.github.yulichang.extension.mapping.mapper.MPJTableInfoHelper; import com.github.yulichang.toolkit.MPJTableMapperHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; /** * 关系映射配置 @@ -10,9 +12,10 @@ import com.github.yulichang.toolkit.MPJTableMapperHelper; * @author yulichang * @since 1.2.0 */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class MappingConfig { - public MappingConfig() { + public static void init() { TableInfoHelper.getTableInfos().forEach(i -> MPJTableInfoHelper.initTableInfo(i.getEntityType(), MPJTableMapperHelper.getMapper(i.getEntityType()))); } diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java index dd757f2..0c630c6 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java @@ -295,8 +295,7 @@ public class MPJTableFieldInfo { public BaseMapper getJoinMapper() { if (this.joinMapper == null) { - MPJTableInfo joinTableInfo = MPJTableInfoHelper.getTableInfos().stream().filter(table -> - table.getTableInfo().getEntityType() == this.joinClass).findFirst().orElse(null); + MPJTableInfo joinTableInfo = MPJTableInfoHelper.getTableInfo(this.joinClass); if (joinTableInfo == null) { throw ExceptionUtils.mpe("未注册 mapper " + this.joinClass.getName()); } diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java index 46e08c8..e643c66 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java @@ -1,20 +1,24 @@ package com.github.yulichang.extension.mapping.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.ClassUtils; import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.github.yulichang.annotation.EntityMapping; import com.github.yulichang.annotation.FieldMapping; +import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.toolkit.MPJReflectionKit; +import com.github.yulichang.toolkit.SpringContentUtils; import com.github.yulichang.toolkit.TableHelper; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; /** * 拷贝 {@link TableInfoHelper} @@ -24,6 +28,8 @@ import java.util.concurrent.ConcurrentHashMap; */ public class MPJTableInfoHelper { + private static final AtomicBoolean load = new AtomicBoolean(false); + /** * 储存反射类表信息 */ @@ -41,18 +47,17 @@ public class MPJTableInfoHelper { if (clazz == null || MPJReflectionKit.isPrimitiveOrWrapper(clazz) || clazz == String.class || clazz.isInterface()) { return null; } - return TABLE_INFO_CACHE.get(clazz); - } - - /** - *

- * 获取所有实体映射表信息 - *

- * - * @return 数据库表反射信息集合 - */ - public static List getTableInfos() { - return Collections.unmodifiableList(new ArrayList<>(TABLE_INFO_CACHE.values())); + MPJTableInfo tableInfo = TABLE_INFO_CACHE.get(clazz); + if (Objects.nonNull(tableInfo)) { + return tableInfo; + } + if (!load.get()) { + SpringContentUtils.getBeansOfType(BaseMapper.class); + MappingConfig.init(); + load.set(true); + return getTableInfo(clazz); + } + return null; } /** @@ -121,6 +126,4 @@ public class MPJTableInfoHelper { /* 映射字段列表 */ mpjTableInfo.setFieldList(mpjFieldList); } - - -} +} \ No newline at end of file diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/Application.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/Application.java index 17db94f..98201ee 100644 --- a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/Application.java +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/Application.java @@ -1,9 +1,7 @@ package com.github.yulichang.test.join; -import com.baomidou.mybatisplus.core.injector.ISqlInjector; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = "com.github.yulichang.test") @@ -11,9 +9,7 @@ import org.springframework.context.annotation.ComponentScan; public class Application { public static void main(String[] args) { - ConfigurableApplicationContext run = SpringApplication.run(Application.class, args); - ISqlInjector bean = run.getBean(ISqlInjector.class); - System.out.println(bean); + SpringApplication.run(Application.class, args); } } diff --git a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/Application.java b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/Application.java index ac05ee2..2e3e228 100644 --- a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/Application.java +++ b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/Application.java @@ -1,5 +1,6 @@ package com.github.yulichang.test.mapping; +import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @@ -7,4 +8,7 @@ import org.springframework.context.annotation.ComponentScan; @SpringBootApplication public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } } diff --git a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java index f79e673..1248b01 100644 --- a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java +++ b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java @@ -51,4 +51,8 @@ public class UserDO { // @EntityMapping(thisField = "id", joinField = "pid") @FieldMapping(tag = UserDO.class, thisField = "id", joinField = "pid", select = "head_img") private List pName; + + @TableField(exist = false) + @EntityMapping(thisField = "id", joinField = "userId") + private List addressList; } diff --git a/mybatis-plus-join-test/test-mapping/src/main/resources/application.yml b/mybatis-plus-join-test/test-mapping/src/main/resources/application.yml index a60d6c4..e0b1978 100644 --- a/mybatis-plus-join-test/test-mapping/src/main/resources/application.yml +++ b/mybatis-plus-join-test/test-mapping/src/main/resources/application.yml @@ -23,4 +23,5 @@ mybatis-plus: # 打印 mybatis plus join banner mybatis-plus-join: banner: true - sub-table-logic: true \ No newline at end of file + sub-table-logic: true + logic-del-type: where \ No newline at end of file diff --git a/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java b/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java index b029a9b..b9cc704 100644 --- a/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java +++ b/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java @@ -6,9 +6,9 @@ import com.github.yulichang.test.mapping.entity.UserDO; import com.github.yulichang.test.mapping.service.UserService; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import javax.annotation.Resource; import java.util.List; /** @@ -18,7 +18,7 @@ import java.util.List; @SuppressWarnings("unused") class MappingTest { - @Resource + @Autowired private UserService userService; @Test @@ -47,7 +47,7 @@ class MappingTest { MPJLambdaWrapper wrapper = new MPJLambdaWrapper() .selectAll(UserDO.class) .leftJoin(AddressDO.class, AddressDO::getId, UserDO::getAddressId); - List dos = userService.listDeep(wrapper, conf -> conf.loop(true)); + List dos = userService.listDeep(wrapper, conf -> conf.loop(false)); System.out.println(1); } } From 3fbeb1c84a8dcafa7127a253220a5b775361d853 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Thu, 21 Dec 2023 06:40:07 +0800 Subject: [PATCH 38/88] =?UTF-8?q?=E4=BC=98=E5=8C=96=20mapper=20not=20find?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/github/yulichang/toolkit/TableHelper.java | 7 +++---- .../extension/mapping/mapper/MPJTableInfoHelper.java | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java index 7bde51c..5de0cfd 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableHelper.java @@ -9,7 +9,6 @@ import com.github.yulichang.config.MPJInterceptorConfig; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; /** * @author yulichang @@ -17,7 +16,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class TableHelper { - private static final AtomicBoolean load = new AtomicBoolean(false); + private static boolean load = false; private static final Map, TableInfo> TABLE_INFO_CACHE = new ConcurrentHashMap<>(); @@ -52,10 +51,10 @@ public class TableHelper { if (Objects.nonNull(info)) { TABLE_INFO_CACHE.put(currentClass, info); } else { - if (!load.get()) { + if (!load) { SpringContentUtils.getBean(MPJInterceptorConfig.class); SpringContentUtils.getBeansOfType(BaseMapper.class); - load.set(true); + load = true; return get(clazz); } } diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java index e643c66..5f9ddd4 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableInfoHelper.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; /** * 拷贝 {@link TableInfoHelper} @@ -28,7 +27,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class MPJTableInfoHelper { - private static final AtomicBoolean load = new AtomicBoolean(false); + private static boolean load = false; /** * 储存反射类表信息 @@ -51,10 +50,10 @@ public class MPJTableInfoHelper { if (Objects.nonNull(tableInfo)) { return tableInfo; } - if (!load.get()) { + if (!load) { SpringContentUtils.getBeansOfType(BaseMapper.class); MappingConfig.init(); - load.set(true); + load = true; return getTableInfo(clazz); } return null; From d0774a06f1bab5ee018ecb80a244e0740badb53c Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 22 Dec 2023 03:37:13 +0800 Subject: [PATCH 39/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisPlusJoinAutoConfiguration.java | 29 ++++++++++++------- .../MybatisPlusJoinPropertiesConsumer.java | 18 ++++++++++++ .../yulichang/injector/MPJSqlInjector.java | 12 ++++++-- 3 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index eeba6eb..02a4651 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -16,7 +16,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ListableBeanFactory; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -39,6 +39,7 @@ import org.springframework.core.annotation.Order; import javax.sql.DataSource; import java.util.List; import java.util.Map; +import java.util.Objects; /** * springboot 自动配置类 @@ -58,16 +59,22 @@ public class MybatisPlusJoinAutoConfiguration { @SuppressWarnings("FieldCanBeLocal") private final MybatisPlusJoinProperties properties; - public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties) { - this.properties = properties; - ConfigProperties.banner = properties.getBanner(); - ConfigProperties.subTableLogic = properties.getSubTableLogic(); - ConfigProperties.msCache = properties.isMsCache(); - ConfigProperties.tableAlias = properties.getTableAlias(); - ConfigProperties.joinPrefix = properties.getJoinPrefix(); - ConfigProperties.logicDelType = "where".equalsIgnoreCase(properties.getLogicDelType()) ? + public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, + ObjectProvider propertiesConsumers) { + MybatisPlusJoinPropertiesConsumer propertiesConsumer = propertiesConsumers.getIfAvailable(); + if (Objects.nonNull(propertiesConsumer)) { + this.properties = propertiesConsumer.config(properties); + } else { + this.properties = properties; + } + ConfigProperties.banner = this.properties.getBanner(); + ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); + ConfigProperties.msCache = this.properties.isMsCache(); + ConfigProperties.tableAlias = this.properties.getTableAlias(); + ConfigProperties.joinPrefix = this.properties.getJoinPrefix(); + ConfigProperties.logicDelType = "where".equalsIgnoreCase(this.properties.getLogicDelType()) ? LogicDelTypeEnum.WHERE : LogicDelTypeEnum.ON; - ConfigProperties.mappingMaxCount = properties.getMappingMaxCount(); + ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); } /** @@ -85,7 +92,7 @@ public class MybatisPlusJoinAutoConfiguration { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) - public MPJInterceptorConfig mpjInterceptorConfig(@Autowired(required = false) List sqlSessionFactoryList) { + public MPJInterceptorConfig mpjInterceptorConfig(List sqlSessionFactoryList) { return new MPJInterceptorConfig(sqlSessionFactoryList, properties.getBanner()); } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java new file mode 100644 index 0000000..3c8a86b --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java @@ -0,0 +1,18 @@ +package com.github.yulichang.autoconfigure; + +/** + * 自定义配置 + * + * @author yulichang + * @since 1.4.9 + */ +public interface MybatisPlusJoinPropertiesConsumer { + + /** + * 自定义配置,此方法会覆盖配置文件中的MPJ配置 + * + * @param properties 配置文件里的配置 + * @return 修改后的配置 + */ + MybatisPlusJoinProperties config(MybatisPlusJoinProperties properties); +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index b51e61c..1b54db1 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -11,11 +11,11 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.ClassUtils; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; +import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.adapter.v3431.AbstractMethodV3431; import com.github.yulichang.method.*; import com.github.yulichang.toolkit.MPJTableMapperHelper; import com.github.yulichang.toolkit.TableHelper; -import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; import lombok.Getter; import org.apache.ibatis.builder.MapperBuilderAssistant; @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.function.Supplier; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -167,7 +168,14 @@ public class MPJSqlInjector extends DefaultSqlInjector { Class modelClass = getSuperClassGenericType(mapperClass, Mapper.class, 0); super.inspectInject(builderAssistant, mapperClass); MPJTableMapperHelper.init(modelClass, mapperClass); - TableHelper.init(modelClass, extractModelClassOld(mapperClass)); + Supplier> supplier = () -> { + try { + return extractModelClassOld(mapperClass); + } catch (Throwable throwable) { + return null; + } + }; + TableHelper.init(modelClass, supplier.get()); } public static Class getSuperClassGenericType(final Class clazz, final Class genericIfc, final int index) { From a822c4f78e8d95fbb9f60702b2f744315a3f1dd1 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 22 Dec 2023 05:01:47 +0800 Subject: [PATCH 40/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autoconfigure/MybatisPlusJoinAutoConfiguration.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 02a4651..db86189 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -39,7 +39,7 @@ import org.springframework.core.annotation.Order; import javax.sql.DataSource; import java.util.List; import java.util.Map; -import java.util.Objects; +import java.util.Optional; /** * springboot 自动配置类 @@ -61,12 +61,7 @@ public class MybatisPlusJoinAutoConfiguration { public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, ObjectProvider propertiesConsumers) { - MybatisPlusJoinPropertiesConsumer propertiesConsumer = propertiesConsumers.getIfAvailable(); - if (Objects.nonNull(propertiesConsumer)) { - this.properties = propertiesConsumer.config(properties); - } else { - this.properties = properties; - } + this.properties = Optional.ofNullable(propertiesConsumers.getIfAvailable()).map(c -> c.config(properties)).orElse(properties); ConfigProperties.banner = this.properties.getBanner(); ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); ConfigProperties.msCache = this.properties.isMsCache(); From 665e43305172c81c99df290d36ad123eacfdb0ef Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 23 Dec 2023 16:55:51 +0800 Subject: [PATCH 41/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ifAbsent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisPlusJoinAutoConfiguration.java | 21 ++- .../MybatisPlusJoinProperties.java | 15 +- ...itional-spring-configuration-metadata.json | 23 +-- .../yulichang/config/ConfigProperties.java | 15 +- .../config/MybatisPlusJoinIfAbsent.java | 12 ++ .../yulichang/config/enums/IfAbsentEnum.java | 40 +++++ .../yulichang/kt/KtAbstractWrapper.java | 22 ++- .../kt/interfaces/CompareIfAbsent.java | 97 ++++++++++++ .../query/MPJLambdaQueryWrapper.java | 147 +++++++++++++++-- .../yulichang/query/MPJQueryWrapper.java | 55 ++++++- .../query/interfaces/CompareIfAbsent.java | 149 ++++++++++++++++++ .../yulichang/toolkit/MPJStringUtils.java | 19 ++- .../yulichang/toolkit/ThrowOptional.java | 53 +++++++ .../yulichang/wrapper/MPJAbstractWrapper.java | 27 +++- .../yulichang/wrapper/MPJLambdaWrapper.java | 10 +- .../wrapper/interfaces/CompareIfAbsent.java | 96 +++++++++++ .../interfaces/CompareStrIfAbsent.java | 55 +++++++ .../yulichang/test/join/QueryWrapperTest.java | 31 ++++ .../yulichang/test/join/m/IfAbsentTest.java | 66 ++++++++ 19 files changed, 895 insertions(+), 58 deletions(-) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index db86189..0c7947f 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.github.yulichang.autoconfigure.conditional.MPJSqlInjectorCondition; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; -import com.github.yulichang.config.enums.LogicDelTypeEnum; +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; @@ -56,20 +56,21 @@ public class MybatisPlusJoinAutoConfiguration { private static final Logger logger = LoggerFactory.getLogger(MybatisPlusJoinAutoConfiguration.class); - @SuppressWarnings("FieldCanBeLocal") private final MybatisPlusJoinProperties properties; public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, - ObjectProvider propertiesConsumers) { + ObjectProvider propertiesConsumers, + ObjectProvider ifAbsentConsumers) { this.properties = Optional.ofNullable(propertiesConsumers.getIfAvailable()).map(c -> c.config(properties)).orElse(properties); ConfigProperties.banner = this.properties.getBanner(); ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); ConfigProperties.msCache = this.properties.isMsCache(); ConfigProperties.tableAlias = this.properties.getTableAlias(); ConfigProperties.joinPrefix = this.properties.getJoinPrefix(); - ConfigProperties.logicDelType = "where".equalsIgnoreCase(this.properties.getLogicDelType()) ? - LogicDelTypeEnum.WHERE : LogicDelTypeEnum.ON; + ConfigProperties.logicDelType = this.properties.getLogicDelType(); ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); + ConfigProperties.ifAbsent = Optional.ofNullable(ifAbsentConsumers.getIfAvailable()).orElse(this.properties.getIfAbsent()); + info("mybatis plus join properties config complete"); } /** @@ -101,7 +102,7 @@ public class MybatisPlusJoinAutoConfiguration { @ConditionalOnBean(ISqlInjector.class) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) public MPJSqlInjector mpjSqlInjector(ISqlInjector sqlInjector) { - logger.info("MPJSqlInjector init"); + info("mybatis plus join SqlInjector init"); return new MPJSqlInjector(sqlInjector); } @@ -113,7 +114,7 @@ public class MybatisPlusJoinAutoConfiguration { @ConditionalOnMissingBean(ISqlInjector.class) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) public MPJSqlInjector mpjSqlInjectorOnMiss() { - logger.info("MPJSqlInjector init"); + info("mybatis plus join SqlInjector init"); return new MPJSqlInjector(); } @@ -129,6 +130,12 @@ public class MybatisPlusJoinAutoConfiguration { } } + private void info(String info) { + if (properties.getBanner()) { + logger.info(info); + } + } + @Configuration @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) public static class MPJSpringContext implements SpringContentUtils.SpringContext, BeanFactoryPostProcessor, ApplicationContextAware { diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java index 637f000..e30fe5a 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java @@ -1,5 +1,7 @@ package com.github.yulichang.autoconfigure; +import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.LogicDelTypeEnum; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -43,7 +45,7 @@ public class MybatisPlusJoinProperties { /** * 逻辑删除类型 支持 where on */ - private String logicDelType = "on"; + private LogicDelTypeEnum logicDelType = LogicDelTypeEnum.ON; /** * 映射查询最大深度 @@ -54,4 +56,15 @@ public class MybatisPlusJoinProperties { * 子查询别名 */ private String subQueryAlias = "st"; + + /** + * Wrapper ifAbsent 判断策略 + *

+ * NOT_NULL 非null + *

+ * NOT_EMPTY 非空字符串 例: "" -> false, " " -> true ... + *

+ * NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... + */ + private IfAbsentEnum ifAbsent = IfAbsentEnum.NOT_EMPTY; } diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index e0d1738..464b374 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -40,8 +40,8 @@ }, { "name": "mybatis-plus-join.logic-del-type", - "defaultValue": "on", - "type": "java.lang.String", + "defaultValue": "com.github.yulichang.config.enums.LogicDelTypeEnum.ON", + "type": "com.github.yulichang.config.enums.LogicDelTypeEnum", "description": "逻辑删除的位置支持where和on两个." }, { @@ -55,21 +55,12 @@ "defaultValue": "st", "type": "java.lang.String", "description": "子查询表别名." - } - ], - "hints": [ + }, { - "name": "mybatis-plus-join.logic-del-type", - "values": [ - { - "value": "where", - "description": "logic delete condition to where." - }, - { - "value": "on", - "description": "logic delete condition to on." - } - ] + "name": "mybatis-plus-join.ifAbsent", + "defaultValue": "com.github.yulichang.config.enums.IfAbsentEnum.NOT_EMPTY", + "type": "com.github.yulichang.config.enums.IfAbsentEnum", + "description": "IfAbsent方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfAbsent." } ] } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index e110c34..a777d84 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -2,6 +2,7 @@ package com.github.yulichang.config; import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.adapter.base.ITableInfoAdapter; +import com.github.yulichang.config.enums.IfAbsentEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; /** @@ -11,7 +12,7 @@ import com.github.yulichang.config.enums.LogicDelTypeEnum; public class ConfigProperties { /** - * 是否开启副表逻辑删除 + * 是否打印banner */ public static boolean banner = true; /** @@ -35,7 +36,7 @@ public class ConfigProperties { */ public static LogicDelTypeEnum logicDelType = LogicDelTypeEnum.ON; /** - * 逻辑删除类型 支持 where on + * 映射查询最大深度 */ public static int mappingMaxCount = 5; /** @@ -46,4 +47,14 @@ public class ConfigProperties { * 子查询别名 */ public static String subQueryAlias = "st"; + /** + * Wrapper ifAbsent 判断策略 + *

+ * NOT_NULL 非null + *

+ * NOT_EMPTY 非空字符串 例: "" -> false, " " -> true ... + *

+ * NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... + */ + public static MybatisPlusJoinIfAbsent ifAbsent = IfAbsentEnum.NOT_EMPTY; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java new file mode 100644 index 0000000..e7e8b7a --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java @@ -0,0 +1,12 @@ +package com.github.yulichang.config; + +import java.util.function.Predicate; + +/** + * 自定义IfAbsent策略 + * + * @author yulichang + * @since 1.4.9 + */ +public interface MybatisPlusJoinIfAbsent extends Predicate { +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java new file mode 100644 index 0000000..91e7fa7 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java @@ -0,0 +1,40 @@ +package com.github.yulichang.config.enums; + +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.toolkit.MPJStringUtils; + +import java.util.Objects; +import java.util.function.Predicate; + +/** + * 条件判断策略 + * + * @author yulichang + * @since 1.4.9 + */ +public enum IfAbsentEnum implements MybatisPlusJoinIfAbsent { + + /** + * 非null + */ + NOT_NULL(Objects::nonNull), + /** + * 非空字符串 例: "" -> false, " " -> true ... + */ + NOT_EMPTY(val -> NOT_NULL.and(v -> v instanceof CharSequence).and(v -> MPJStringUtils.isNotEmpty((CharSequence) v)).test(val)), + /** + * NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... + */ + NOT_BLANK(val -> NOT_NULL.and(v -> v instanceof CharSequence).and(v -> MPJStringUtils.isNotBlank((CharSequence) v)).test(val)); + + private final Predicate predicate; + + IfAbsentEnum(Predicate predicate) { + this.predicate = predicate; + } + + @Override + public boolean test(Object obj) { + return this.predicate.test(obj); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index b5bcb31..c8b05a8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -11,7 +11,9 @@ import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; -import com.github.yulichang.kt.interfaces.Compare; +import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.kt.interfaces.CompareIfAbsent; import com.github.yulichang.kt.interfaces.Func; import com.github.yulichang.kt.interfaces.OnCompare; import com.github.yulichang.toolkit.KtUtils; @@ -20,7 +22,7 @@ import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; import com.github.yulichang.wrapper.enums.PrefixEnum; -import com.github.yulichang.wrapper.interfaces.CompareStr; +import com.github.yulichang.wrapper.interfaces.CompareStrIfAbsent; import com.github.yulichang.wrapper.interfaces.FuncStr; import com.github.yulichang.wrapper.interfaces.Join; import kotlin.reflect.KProperty; @@ -44,8 +46,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unused", "unchecked", "DuplicatedCode"}) public abstract class KtAbstractWrapper> extends Wrapper - implements Compare, Nested, Join, Func, OnCompare, - CompareStr, FuncStr { + implements CompareIfAbsent, Nested, Join, Func, OnCompare, + CompareStrIfAbsent, FuncStr { /** * 占位符 @@ -121,6 +123,12 @@ public abstract class KtAbstractWrapper, ?> params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { @@ -630,6 +643,7 @@ public abstract class KtAbstractWrapper extends Compare { + + MybatisPlusJoinIfAbsent getIfAbsent(); + + default Children eqIfAbsent(KProperty column, Object val) { + return eq(getIfAbsent().test(val), null, column, val); + } + + default Children eqIfAbsent(String alias, KProperty column, Object val) { + return eq(getIfAbsent().test(val), alias, column, val); + } + + default Children neIfAbsent(KProperty column, Object val) { + return ne(getIfAbsent().test(val), null, column, val); + } + + default Children neIfAbsent(String alias, KProperty column, Object val) { + return ne(getIfAbsent().test(val), alias, column, val); + } + + default Children gtIfAbsent(KProperty column, Object val) { + return gt(getIfAbsent().test(val), null, column, val); + } + + default Children gtIfAbsent(String alias, KProperty column, Object val) { + return gt(getIfAbsent().test(val), alias, column, val); + } + + + default Children geIfAbsent(KProperty column, Object val) { + return ge(getIfAbsent().test(val), null, column, val); + } + + default Children geIfAbsent(String alias, KProperty column, Object val) { + return ge(getIfAbsent().test(val), alias, column, val); + } + + default Children ltIfAbsent(KProperty column, Object val) { + return lt(getIfAbsent().test(val), null, column, val); + } + + default Children ltIfAbsent(String alias, KProperty column, Object val) { + return lt(getIfAbsent().test(val), alias, column, val); + } + + default Children leIfAbsent(KProperty column, Object val) { + return le(getIfAbsent().test(val), null, column, val); + } + + default Children leIfAbsent(String alias, KProperty column, Object val) { + return le(getIfAbsent().test(val), alias, column, val); + } + + default Children likeIfAbsent(KProperty column, Object val) { + return like(getIfAbsent().test(val), null, column, val); + } + + default Children likeIfAbsent(String alisa, KProperty column, Object val) { + return like(getIfAbsent().test(val), alisa, column, val); + } + + default Children notLikeIfAbsent(KProperty column, Object val) { + return notLike(getIfAbsent().test(val), null, column, val); + } + + default Children notLikeIfAbsent(String alias, KProperty column, Object val) { + return notLike(getIfAbsent().test(val), alias, column, val); + } + + default Children likeLeftIfAbsent(KProperty column, Object val) { + return likeLeft(getIfAbsent().test(val), null, column, val); + } + + default Children likeLeftIfAbsent(String alias, KProperty column, Object val) { + return likeLeft(getIfAbsent().test(val), alias, column, val); + } + + default Children likeRightIfAbsent(KProperty column, Object val) { + return likeRight(getIfAbsent().test(val), null, column, val); + } + + default Children likeRightIfAbsent(String alias, KProperty column, Object val) { + return likeRight(getIfAbsent().test(val), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index df2069f..f2ee99a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -6,18 +6,22 @@ import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.StringPool; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.query.interfaces.CompareIfAbsent; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.TableHelper; +import com.github.yulichang.toolkit.ThrowOptional; +import lombok.Getter; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -30,7 +34,8 @@ import java.util.stream.Collectors; */ @SuppressWarnings("unused") public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper> - implements Query, T, SFunction>, StringJoin, T> { + implements Query, T, SFunction>, StringJoin, T>, + CompareIfAbsent, SFunction> { /** * 查询字段 @@ -45,7 +50,8 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractLambdaWrapper tableNameFunc; + + @Getter + private MybatisPlusJoinIfAbsent ifAbsent = ConfigProperties.ifAbsent; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -75,9 +92,10 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper entityClass, SharedString from, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - List selectColumns, List ignoreColumns, boolean selectDistinct) { + List selectColumns, List ignoreColumns, boolean selectDistinct, + MybatisPlusJoinIfAbsent ifAbsent) { super.setEntity(entity); - super.setEntityClass(entityClass); + setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; this.paramNameValuePairs = paramNameValuePairs; this.expression = mergeSegments; @@ -85,10 +103,11 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper this.sqlFirst = sqlFirst).catchDo(); this.selectColumns = selectColumns; this.ignoreColumns = ignoreColumns; this.selectDistinct = selectDistinct; + this.ifAbsent = ifAbsent; } /** @@ -214,7 +233,8 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper stringQuery() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, - expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, selectDistinct); + expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, + selectDistinct, ifAbsent); } @Override @@ -241,15 +261,86 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper setAlias(String alias) { + Assert.isTrue(StringUtils.isNotBlank(alias), "别名不能为空"); + this.alias = alias; + return typedThis; } + /** + * 逻辑删除 + */ + public String getSubLogicSql() { + return StringPool.EMPTY; + } + + /** + * 关闭主表逻辑删除 + */ + public MPJLambdaQueryWrapper disableLogicDel() { + this.logicSql = false; + return typedThis; + } + + /** + * 启用主表逻辑删除 + */ + public MPJLambdaQueryWrapper enableLogicDel() { + this.logicSql = true; + return typedThis; + } + + /** + * 逻辑删除 + */ + public boolean getLogicSql() { + return logicSql; + } + + public boolean getSelectDistinct() { return selectDistinct; } + /** + * 动态表名 + * 如果主表需要动态表名,主表实体必须添加 @DynamicTableName 注解 + * 关联表则不需要 加不加注解都会生效 + *

+ * + * @see com.github.yulichang.annotation.DynamicTableName + */ + public MPJLambdaQueryWrapper setTableName(Function func) { + this.tableNameFunc = func; + return typedThis; + } + + public String getTableName(String tableName) { + if (this.tableNameFunc == null) { + return tableName; + } + return this.tableNameFunc.apply(tableName); + } + + @SuppressWarnings("DuplicatedCode") + public String getTableNameEnc(String tableName) { + String decode; + try { + decode = URLDecoder.decode(tableName, "UTF-8"); + } catch (UnsupportedEncodingException e) { + decode = tableName; + } + if (this.tableNameFunc == null) { + return decode; + } + return this.tableNameFunc.apply(decode); + } + + public MPJLambdaQueryWrapper setIfAbsent(MybatisPlusJoinIfAbsent ifAbsent) { + this.ifAbsent = ifAbsent; + return typedThis; + } + /** * 用于生成嵌套 sql *

故 sqlSelect selectColumn ignoreColumns from不向下传递

@@ -257,7 +348,34 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper instance() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null, selectDistinct); + new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + null, null, selectDistinct, ifAbsent); + } + + @Override + public Class getEntityClass() { + try { + return super.getEntityClass(); + } catch (Throwable throwable) { + return null; + } + } + + @Override + public MPJLambdaQueryWrapper setEntityClass(Class entityClass) { + try { + return super.setEntityClass(entityClass); + } catch (Throwable throwable) { + return this; + } + } + + public SharedString getSqlFirstField() { + try { + return sqlSelect; + } catch (Throwable throwable) { + return SharedString.emptyString(); + } } @Override @@ -267,6 +385,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractWrapper> implements - Query, T, String>, StringJoin, T>, Chain { + Query, T, String>, StringJoin, T>, Chain, + CompareIfAbsent, String> { /** * 查询字段 @@ -85,6 +89,9 @@ public class MPJQueryWrapper extends AbstractWrapper extends AbstractWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString sqlSelect, SharedString from, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - List selectColumns, List ignoreColumns, boolean selectDistinct) { + List selectColumns, List ignoreColumns, boolean selectDistinct, + MybatisPlusJoinIfAbsent ifAbsent) { super.setEntity(entity); - super.setEntityClass(entityClass); + setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; this.paramNameValuePairs = paramNameValuePairs; this.expression = mergeSegments; @@ -125,10 +133,11 @@ public class MPJQueryWrapper extends AbstractWrapper this.sqlFirst = sqlFirst).catchDo(); this.selectColumns = selectColumns; this.ignoreColumns = ignoreColumns; this.selectDistinct = selectDistinct; + this.ifAbsent = ifAbsent; } /** @@ -139,6 +148,11 @@ public class MPJQueryWrapper extends AbstractWrapper setIfAbsent(MybatisPlusJoinIfAbsent ifAbsent) { + this.ifAbsent = ifAbsent; + return this; + } + @Override protected String columnToString(String column) { if (checkSqlInjection && MPJSqlInjectionUtils.check(column)) { @@ -315,6 +329,7 @@ public class MPJQueryWrapper extends AbstractWrapper extends AbstractWrapper lambda() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs, - expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, selectDistinct); + expression, lastSql, sqlComment, getSqlFirstField(), selectColumns, ignoreColumns, selectDistinct, ifAbsent); + } + + @Override + public Class getEntityClass() { + try { + return super.getEntityClass(); + } catch (Throwable throwable) { + return null; + } + } + + @Override + public MPJQueryWrapper setEntityClass(Class entityClass) { + try { + return super.setEntityClass(entityClass); + } catch (Throwable throwable) { + return this; + } + } + + public SharedString getSqlFirstField() { + try { + return sqlSelect; + } catch (Throwable throwable) { + return SharedString.emptyString(); + } } /** @@ -343,7 +384,8 @@ public class MPJQueryWrapper extends AbstractWrapper instance() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(), - null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null, selectDistinct); + null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), + null, null, selectDistinct, ifAbsent); } @@ -354,6 +396,7 @@ public class MPJQueryWrapper extends AbstractWrapper比较值

+ * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareIfAbsent extends Compare { + + MybatisPlusJoinIfAbsent getIfAbsent(); + + /** + * 等于 = + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children eqIfAbsent(R column, Object val) { + return eq(getIfAbsent().test(val), column, val); + } + + /** + * 不等于 <> + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children neIfAbsent(R column, Object val) { + return ne(getIfAbsent().test(val), column, val); + } + + /** + * 大于 > + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children gtIfAbsent(R column, Object val) { + return gt(getIfAbsent().test(val), column, val); + } + + /** + * 大于等于 >= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children geIfAbsent(R column, Object val) { + return ge(getIfAbsent().test(val), column, val); + } + + /** + * 小于 < + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children ltIfAbsent(R column, Object val) { + return lt(getIfAbsent().test(val), column, val); + } + + /** + * 小于等于 <= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children leIfAbsent(R column, Object val) { + return le(getIfAbsent().test(val), column, val); + } + + /** + * LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeIfAbsent(R column, Object val) { + return like(getIfAbsent().test(val), column, val); + } + + /** + * NOT LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeIfAbsent(R column, Object val) { + return notLike(getIfAbsent().test(val), column, val); + } + + /** + * NOT LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeLeftIfAbsent(R column, Object val) { + return notLikeLeft(getIfAbsent().test(val), column, val); + } + + /** + * NOT LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeRightIfAbsent(R column, Object val) { + return notLikeRight(getIfAbsent().test(val), column, val); + } + + /** + * LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeLeftIfAbsent(R column, Object val) { + return likeLeft(getIfAbsent().test(val), column, val); + } + + /** + * LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeRightIfAbsent(R column, Object val) { + return likeRight(getIfAbsent().test(val), column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJStringUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJStringUtils.java index 0a8b55e..8506652 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJStringUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJStringUtils.java @@ -598,10 +598,25 @@ public final class MPJStringUtils { /** * 过滤sql黑名单字符,存在 SQL 注入,去除空白内容 */ - Matcher matcher = REPLACE_BLANK.matcher(str); - str = matcher.replaceAll(""); + str = replaceAllBlank(str); } return str; } + + /** + * 字符串去除空白内容: + *
    + *
  • \n 回车
  • + *
  • \t 水平制表符
  • + *
  • \s 空格
  • + *
  • \r 换行
  • + *
+ * + * @param str 字符串 + */ + public static String replaceAllBlank(String str) { + Matcher matcher = REPLACE_BLANK.matcher(str); + return matcher.replaceAll(""); + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java new file mode 100644 index 0000000..f0fcc39 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java @@ -0,0 +1,53 @@ +package com.github.yulichang.toolkit; + +import java.util.Objects; +import java.util.function.Consumer; + +/** + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public class ThrowOptional { + + private ThrowOptional() { + } + + private DoSomething doSomething; + + public static ThrowOptional tryDo(DoSomething doSomething) { + ThrowOptional optional = new ThrowOptional(); + Objects.requireNonNull(doSomething); + optional.doSomething = doSomething; + return optional; + } + + public void catchDo() { + try { + this.doSomething.doSomething(); + } catch (Throwable ignored) { + } + } + + public void catchDo(DoSomething doSomething) { + try { + this.doSomething.doSomething(); + } catch (Throwable ignored) { + doSomething.doSomething(); + } + } + + public void catchDo(Consumer consumer) { + try { + this.doSomething.doSomething(); + } catch (Throwable throwable) { + consumer.accept(throwable); + } + } + + + @FunctionalInterface + public interface DoSomething { + void doSomething(); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index d8ee2e4..d8d8b85 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; @@ -39,8 +41,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unchecked", "unused", "DuplicatedCode"}) public abstract class MPJAbstractWrapper> extends Wrapper - implements Compare, Nested, Join, Func, OnCompare, - CompareStr, FuncStr { + implements CompareIfAbsent, Nested, Join, Func, OnCompare, + CompareStrIfAbsent, FuncStr { /** * 占位符 @@ -116,6 +118,12 @@ public abstract class MPJAbstractWrapper val != null && StringUtils.isNotBlank(val)) + * + * @param ifAbsent 判断 + * @return Children + */ + public Children setIfAbsent(MybatisPlusJoinIfAbsent ifAbsent) { + this.ifAbsent = ifAbsent; + return typedThis; + } + @Override public Children allEq(boolean condition, Map, V> params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { @@ -400,7 +420,7 @@ public abstract class MPJAbstractWrapper Children groupBy(boolean condition, String alias, List> columns) { return maybeDo(condition, () -> { if (CollectionUtils.isNotEmpty(columns)) { - final String finalOne = columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns); + final String finalOne = columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns); appendSqlSegments(GROUP_BY, () -> finalOne); } }); @@ -737,6 +757,7 @@ public abstract class MPJAbstractWrapper extends MPJAbstractLambdaWrapper entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - TableList tableList, Integer index, String keyWord, Class joinClass, String tableName) { + TableList tableList, Integer index, String keyWord, Class joinClass, String tableName, + MybatisPlusJoinIfAbsent ifAbsent) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -139,6 +141,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null) { + new TableList(), null, null, null, null, ifAbsent) { }; wrapper.tableList.setAlias(st); wrapper.tableList.setRootClass(clazz); @@ -402,7 +405,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - this.tableList, index, keyWord, joinClass, tableName); + this.tableList, index, keyWord, joinClass, tableName, ifAbsent); } @Override @@ -415,5 +418,6 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends Compare { + + MybatisPlusJoinIfAbsent getIfAbsent(); + + default Children eqIfAbsent(SFunction column, Object val) { + return eq(getIfAbsent().test(val), null, column, val); + } + + default Children eqIfAbsent(String alias, SFunction column, Object val) { + return eq(getIfAbsent().test(val), alias, column, val); + } + + default Children neIfAbsent(SFunction column, Object val) { + return ne(getIfAbsent().test(val), null, column, val); + } + + default Children neIfAbsent(String alias, SFunction column, Object val) { + return ne(getIfAbsent().test(val), alias, column, val); + } + + default Children gtIfAbsent(SFunction column, Object val) { + return gt(getIfAbsent().test(val), null, column, val); + } + + default Children gtIfAbsent(String alias, SFunction column, Object val) { + return gt(getIfAbsent().test(val), alias, column, val); + } + + default Children geIfAbsent(SFunction column, Object val) { + return ge(getIfAbsent().test(val), null, column, val); + } + + default Children geIfAbsent(String alias, SFunction column, Object val) { + return ge(getIfAbsent().test(val), alias, column, val); + } + + default Children ltIfAbsent(SFunction column, Object val) { + return lt(getIfAbsent().test(val), null, column, val); + } + + default Children ltIfAbsent(String alias, SFunction column, Object val) { + return lt(getIfAbsent().test(val), alias, column, val); + } + + default Children leIfAbsent(SFunction column, Object val) { + return le(getIfAbsent().test(val), null, column, val); + } + + default Children leIfAbsent(String alias, SFunction column, Object val) { + return le(getIfAbsent().test(val), alias, column, val); + } + + default Children likeIfAbsent(SFunction column, Object val) { + return like(getIfAbsent().test(val), null, column, val); + } + + default Children likeIfAbsent(String alias, SFunction column, Object val) { + return like(getIfAbsent().test(val), alias, column, val); + } + + default Children notLikeIfAbsent(SFunction column, Object val) { + return notLike(getIfAbsent().test(val), null, column, val); + } + + default Children notLikeIfAbsent(String alias, SFunction column, Object val) { + return notLike(getIfAbsent().test(val), alias, column, val); + } + + default Children likeLeftIfAbsent(SFunction column, Object val) { + return likeLeft(getIfAbsent().test(val), null, column, val); + } + + default Children likeLeftIfAbsent(String alias, SFunction column, Object val) { + return likeLeft(getIfAbsent().test(val), alias, column, val); + } + + default Children likeRightIfAbsent(SFunction column, Object val) { + return likeRight(getIfAbsent().test(val), null, column, val); + } + + default Children likeRightIfAbsent(String alias, SFunction column, Object val) { + return likeRight(getIfAbsent().test(val), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java new file mode 100644 index 0000000..c9f5922 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java @@ -0,0 +1,55 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.github.yulichang.config.MybatisPlusJoinIfAbsent; + +/** + * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareStrIfAbsent extends CompareStr { + + MybatisPlusJoinIfAbsent getIfAbsent(); + + default Children eqIfAbsent(R column, Object val) { + return eq(getIfAbsent().test(val), column, val); + } + + default Children neIfAbsent(R column, Object val) { + return ne(getIfAbsent().test(val), column, val); + } + + default Children gtIfAbsent(R column, Object val) { + return gt(getIfAbsent().test(val), column, val); + } + + default Children geIfAbsent(R column, Object val) { + return ge(getIfAbsent().test(val), column, val); + } + + default Children ltIfAbsent(R column, Object val) { + return lt(getIfAbsent().test(val), column, val); + } + + default Children leIfAbsent(R column, Object val) { + return le(getIfAbsent().test(val), column, val); + } + + default Children likeIfAbsent(R column, Object val) { + return like(getIfAbsent().test(val), column, val); + } + + default Children notLikeIfAbsent(R column, Object val) { + return notLike(getIfAbsent().test(val), column, val); + } + + default Children likeLeftIfAbsent(R column, Object val) { + return likeLeft(getIfAbsent().test(val), column, val); + } + + default Children likeRightIfAbsent(R column, Object val) { + return likeRight(getIfAbsent().test(val), column, val); + } +} diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java index 43ec2cc..afce143 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/QueryWrapperTest.java @@ -115,4 +115,35 @@ class QueryWrapperTest { System.out.println(joinMaps); } + @Test + void test5() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t LEFT JOIN address t2 ON t2.user_id = t.id " + + "WHERE t.del = false AND (t.id <= ?)"); + List userDO = userMapper.selectJoinList(UserDO.class, new MPJQueryWrapper() + .selectAll(UserDO.class) + .leftJoin("address t2 on t2.user_id = t.id") + .le("t.id ", 10).lambda()); + System.out.println(userDO); + + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by, t2.address AS userAddress FROM `user` t " + + "LEFT JOIN address t2 ON t2.user_id = t.id WHERE t.del = false AND (t.id <= ?)"); + List dto = userMapper.selectJoinList(UserDTO.class, new MPJQueryWrapper() + .selectAll(UserDO.class) + .select("t2.address AS userAddress") + .leftJoin("address t2 on t2.user_id = t.id") + .le("t.id ", 10).lambda()); + System.out.println(dto); + } + + @Test + void test6() { + ThreadLocalUtils.set("SELECT t.id AS idea, t.user_id AS uuid, t.tenant_id FROM user_tenant t WHERE (t.id <= ?) AND t.tenant_id = 1"); + List userDO = userTenantMapper.selectJoinList(UserTenantDO.class, new MPJQueryWrapper() + .selectAll(UserTenantDO.class) + .le("t.id ", 10).lambda()); + System.out.println(userDO); + } + } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java new file mode 100644 index 0000000..fe46ba4 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java @@ -0,0 +1,66 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class IfAbsentTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + @Test + void ifAbsent() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "WHERE t.del = false AND (t.id = ? AND t.head_img = ? AND t.`name` = ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getPid, null) + .eqIfAbsent(UserDO::getAddressId, "") + .eqIfAbsent(UserDO::getImg, "\t") + .eqIfAbsent(UserDO::getName, "张三 1"); + List list = wrapper.list(); + list.forEach(System.out::println); + + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "WHERE t.del = false AND (t.id = ? AND t.`name` = ?)"); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .setIfAbsent(IfAbsentEnum.NOT_BLANK) + .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getPid, null) + .eqIfAbsent(UserDO::getAddressId, "") + .eqIfAbsent(UserDO::getImg, "\t") + .eqIfAbsent(UserDO::getName, "张三 1"); + List list1 = wrapper1.list(); + list1.forEach(System.out::println); + + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + + "WHERE t.del = false AND (t.id = ? AND t.pid = ? AND t.`name` = ? AND t.head_img = ? AND t.`name` = ?)"); + MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .setIfAbsent(o -> true) + .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getPid, null) + .eqIfAbsent(UserDO::getName, "") + .eqIfAbsent(UserDO::getImg, "\t") + .eqIfAbsent(UserDO::getName, "张三 1"); + List list2 = wrapper2.list(); + list2.forEach(System.out::println); + } +} From eda25c23f856f0c080be9276e6d1b6e31c4e3d0f Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 23 Dec 2023 17:00:59 +0800 Subject: [PATCH 42/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ifAbsent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../META-INF/additional-spring-configuration-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 464b374..df4fbf5 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -57,7 +57,7 @@ "description": "子查询表别名." }, { - "name": "mybatis-plus-join.ifAbsent", + "name": "mybatis-plus-join.if-absent", "defaultValue": "com.github.yulichang.config.enums.IfAbsentEnum.NOT_EMPTY", "type": "com.github.yulichang.config.enums.IfAbsentEnum", "description": "IfAbsent方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfAbsent." From a2756a9dde2a210f5a79f7fd0669da4aefc5ac6c Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sun, 24 Dec 2023 23:13:50 +0800 Subject: [PATCH 43/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ifAbsent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisPlusJoinAutoConfiguration.java | 10 ++-- .../MybatisPlusJoinIfAbsentConsumer.java | 14 ++++++ .../MybatisPlusJoinPropertiesConsumer.java | 4 +- .../yulichang/config/ConfigProperties.java | 5 +- .../config/MybatisPlusJoinIfAbsent.java | 12 ----- .../yulichang/config/enums/IfAbsentEnum.java | 20 ++++---- .../yulichang/kt/KtAbstractWrapper.java | 12 +++-- .../kt/interfaces/CompareIfAbsent.java | 46 ++++++++++--------- .../query/MPJLambdaQueryWrapper.java | 14 ++++-- .../yulichang/query/MPJQueryWrapper.java | 14 ++++-- .../query/interfaces/CompareIfAbsent.java | 30 ++++++------ .../yulichang/wrapper/MPJAbstractWrapper.java | 14 ++++-- .../yulichang/wrapper/MPJLambdaWrapper.java | 5 +- .../wrapper/enums/IfAbsentSqlKeyWordEnum.java | 22 +++++++++ .../wrapper/interfaces/CompareIfAbsent.java | 46 ++++++++++--------- .../interfaces/CompareStrIfAbsent.java | 26 ++++++----- .../yulichang/test/join/m/IfAbsentTest.java | 18 ++++++-- 17 files changed, 195 insertions(+), 117 deletions(-) create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java rename mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/{ => consumer}/MybatisPlusJoinPropertiesConsumer.java (75%) delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/IfAbsentSqlKeyWordEnum.java diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 0c7947f..94e6062 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -3,13 +3,15 @@ package com.github.yulichang.autoconfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.github.yulichang.autoconfigure.conditional.MPJSqlInjectorCondition; +import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfAbsentConsumer; +import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinPropertiesConsumer; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; import com.github.yulichang.toolkit.SpringContentUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; @@ -40,6 +42,7 @@ import javax.sql.DataSource; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.BiPredicate; /** * springboot 自动配置类 @@ -60,7 +63,7 @@ public class MybatisPlusJoinAutoConfiguration { public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, ObjectProvider propertiesConsumers, - ObjectProvider ifAbsentConsumers) { + ObjectProvider ifAbsentConsumers) { this.properties = Optional.ofNullable(propertiesConsumers.getIfAvailable()).map(c -> c.config(properties)).orElse(properties); ConfigProperties.banner = this.properties.getBanner(); ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); @@ -69,7 +72,8 @@ public class MybatisPlusJoinAutoConfiguration { ConfigProperties.joinPrefix = this.properties.getJoinPrefix(); ConfigProperties.logicDelType = this.properties.getLogicDelType(); ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); - ConfigProperties.ifAbsent = Optional.ofNullable(ifAbsentConsumers.getIfAvailable()).orElse(this.properties.getIfAbsent()); + ConfigProperties.ifAbsent = Optional.ofNullable(ifAbsentConsumers.getIfAvailable()) + .map(m -> (BiPredicate) m).orElse(this.properties.getIfAbsent()); info("mybatis plus join properties config complete"); } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java new file mode 100644 index 0000000..3e2287c --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java @@ -0,0 +1,14 @@ +package com.github.yulichang.autoconfigure.consumer; + +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * 自定义IfAbsent策略 + * + * @author yulichang + * @since 1.4.9 + */ +public interface MybatisPlusJoinIfAbsentConsumer extends BiPredicate { +} diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinPropertiesConsumer.java similarity index 75% rename from mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java rename to mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinPropertiesConsumer.java index 3c8a86b..24a4dc8 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinPropertiesConsumer.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinPropertiesConsumer.java @@ -1,4 +1,6 @@ -package com.github.yulichang.autoconfigure; +package com.github.yulichang.autoconfigure.consumer; + +import com.github.yulichang.autoconfigure.MybatisPlusJoinProperties; /** * 自定义配置 diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index a777d84..b5335fa 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -4,6 +4,9 @@ import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.adapter.base.ITableInfoAdapter; import com.github.yulichang.config.enums.IfAbsentEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; + +import java.util.function.BiPredicate; /** * @author yulichang @@ -56,5 +59,5 @@ public class ConfigProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - public static MybatisPlusJoinIfAbsent ifAbsent = IfAbsentEnum.NOT_EMPTY; + public static BiPredicate ifAbsent = IfAbsentEnum.NOT_EMPTY; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java deleted file mode 100644 index e7e8b7a..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MybatisPlusJoinIfAbsent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.yulichang.config; - -import java.util.function.Predicate; - -/** - * 自定义IfAbsent策略 - * - * @author yulichang - * @since 1.4.9 - */ -public interface MybatisPlusJoinIfAbsent extends Predicate { -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java index 91e7fa7..f04f852 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java @@ -1,10 +1,10 @@ package com.github.yulichang.config.enums; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.toolkit.MPJStringUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import java.util.Objects; -import java.util.function.Predicate; +import java.util.function.BiPredicate; /** * 条件判断策略 @@ -12,29 +12,29 @@ import java.util.function.Predicate; * @author yulichang * @since 1.4.9 */ -public enum IfAbsentEnum implements MybatisPlusJoinIfAbsent { +public enum IfAbsentEnum implements BiPredicate { /** * 非null */ - NOT_NULL(Objects::nonNull), + NOT_NULL((val, key) -> Objects.nonNull(val)), /** * 非空字符串 例: "" -> false, " " -> true ... */ - NOT_EMPTY(val -> NOT_NULL.and(v -> v instanceof CharSequence).and(v -> MPJStringUtils.isNotEmpty((CharSequence) v)).test(val)), + NOT_EMPTY((val, key) -> NOT_NULL.test(val, key) && (!(val instanceof CharSequence) || MPJStringUtils.isNotEmpty((CharSequence) val))), /** * NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - NOT_BLANK(val -> NOT_NULL.and(v -> v instanceof CharSequence).and(v -> MPJStringUtils.isNotBlank((CharSequence) v)).test(val)); + NOT_BLANK((val, key) -> NOT_NULL.test(val, key) && (!(val instanceof CharSequence) || MPJStringUtils.isNotBlank((CharSequence) val))); - private final Predicate predicate; + private final BiPredicate predicate; - IfAbsentEnum(Predicate predicate) { + IfAbsentEnum(BiPredicate predicate) { this.predicate = predicate; } @Override - public boolean test(Object obj) { - return this.predicate.test(obj); + public boolean test(Object obj, IfAbsentSqlKeyWordEnum keyword) { + return this.predicate.test(obj, keyword); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index c8b05a8..981aec3 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -12,7 +12,6 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.kt.interfaces.CompareIfAbsent; import com.github.yulichang.kt.interfaces.Func; import com.github.yulichang.kt.interfaces.OnCompare; @@ -21,6 +20,7 @@ import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; import com.github.yulichang.wrapper.interfaces.CompareStrIfAbsent; import com.github.yulichang.wrapper.interfaces.FuncStr; @@ -32,6 +32,7 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiPredicate; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.function.Supplier; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; @@ -127,7 +128,7 @@ public abstract class KtAbstractWrapper ifAbsent = ConfigProperties.ifAbsent; @Override public T getEntity() { @@ -180,11 +181,16 @@ public abstract class KtAbstractWrapper ifAbsent) { this.ifAbsent = ifAbsent; return typedThis; } + public Children setIfAbsent(Predicate ifAbsent) { + this.ifAbsent = (o, k) -> ifAbsent.test(o); + return typedThis; + } + @Override public Children allEq(boolean condition, Map, ?> params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java index 39d552b..f379a63 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java @@ -1,8 +1,10 @@ package com.github.yulichang.kt.interfaces; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import kotlin.reflect.KProperty; +import java.util.function.BiPredicate; + /** * ifAbsent * @@ -12,86 +14,86 @@ import kotlin.reflect.KProperty; @SuppressWarnings("unused") public interface CompareIfAbsent extends Compare { - MybatisPlusJoinIfAbsent getIfAbsent(); + BiPredicate getIfAbsent(); default Children eqIfAbsent(KProperty column, Object val) { - return eq(getIfAbsent().test(val), null, column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), null, column, val); } default Children eqIfAbsent(String alias, KProperty column, Object val) { - return eq(getIfAbsent().test(val), alias, column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), alias, column, val); } default Children neIfAbsent(KProperty column, Object val) { - return ne(getIfAbsent().test(val), null, column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), null, column, val); } default Children neIfAbsent(String alias, KProperty column, Object val) { - return ne(getIfAbsent().test(val), alias, column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), alias, column, val); } default Children gtIfAbsent(KProperty column, Object val) { - return gt(getIfAbsent().test(val), null, column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), null, column, val); } default Children gtIfAbsent(String alias, KProperty column, Object val) { - return gt(getIfAbsent().test(val), alias, column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), alias, column, val); } default Children geIfAbsent(KProperty column, Object val) { - return ge(getIfAbsent().test(val), null, column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), null, column, val); } default Children geIfAbsent(String alias, KProperty column, Object val) { - return ge(getIfAbsent().test(val), alias, column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), alias, column, val); } default Children ltIfAbsent(KProperty column, Object val) { - return lt(getIfAbsent().test(val), null, column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), null, column, val); } default Children ltIfAbsent(String alias, KProperty column, Object val) { - return lt(getIfAbsent().test(val), alias, column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), alias, column, val); } default Children leIfAbsent(KProperty column, Object val) { - return le(getIfAbsent().test(val), null, column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), null, column, val); } default Children leIfAbsent(String alias, KProperty column, Object val) { - return le(getIfAbsent().test(val), alias, column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), alias, column, val); } default Children likeIfAbsent(KProperty column, Object val) { - return like(getIfAbsent().test(val), null, column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), null, column, val); } default Children likeIfAbsent(String alisa, KProperty column, Object val) { - return like(getIfAbsent().test(val), alisa, column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), alisa, column, val); } default Children notLikeIfAbsent(KProperty column, Object val) { - return notLike(getIfAbsent().test(val), null, column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), null, column, val); } default Children notLikeIfAbsent(String alias, KProperty column, Object val) { - return notLike(getIfAbsent().test(val), alias, column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), alias, column, val); } default Children likeLeftIfAbsent(KProperty column, Object val) { - return likeLeft(getIfAbsent().test(val), null, column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), null, column, val); } default Children likeLeftIfAbsent(String alias, KProperty column, Object val) { - return likeLeft(getIfAbsent().test(val), alias, column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); } default Children likeRightIfAbsent(KProperty column, Object val) { - return likeRight(getIfAbsent().test(val), null, column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); } default Children likeRightIfAbsent(String alias, KProperty column, Object val) { - return likeRight(getIfAbsent().test(val), alias, column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index f2ee99a..ac13e59 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -9,18 +9,19 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.query.interfaces.CompareIfAbsent; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.ThrowOptional; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import lombok.Getter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -77,7 +78,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper tableNameFunc; @Getter - private MybatisPlusJoinIfAbsent ifAbsent = ConfigProperties.ifAbsent; + private BiPredicate ifAbsent = ConfigProperties.ifAbsent; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -93,7 +94,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, List selectColumns, List ignoreColumns, boolean selectDistinct, - MybatisPlusJoinIfAbsent ifAbsent) { + BiPredicate ifAbsent) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -336,11 +337,16 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper setIfAbsent(MybatisPlusJoinIfAbsent ifAbsent) { + public MPJLambdaQueryWrapper setIfAbsent(BiPredicate ifAbsent) { this.ifAbsent = ifAbsent; return typedThis; } + public MPJLambdaQueryWrapper setIfAbsent(Predicate ifAbsent) { + this.ifAbsent = (o, k) -> ifAbsent.test(o); + return typedThis; + } + /** * 用于生成嵌套 sql *

故 sqlSelect selectColumn ignoreColumns from不向下传递

diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java index 5e4f5d2..4031175 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java @@ -11,13 +11,13 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.query.interfaces.CompareIfAbsent; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.ThrowOptional; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import com.github.yulichang.wrapper.interfaces.Chain; import lombok.Getter; @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -90,7 +91,7 @@ public class MPJQueryWrapper extends AbstractWrapper ifAbsent = ConfigProperties.ifAbsent; public MPJQueryWrapper() { @@ -123,7 +124,7 @@ public class MPJQueryWrapper extends AbstractWrapper selectColumns, List ignoreColumns, boolean selectDistinct, - MybatisPlusJoinIfAbsent ifAbsent) { + BiPredicate ifAbsent) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -148,11 +149,16 @@ public class MPJQueryWrapper extends AbstractWrapper setIfAbsent(MybatisPlusJoinIfAbsent ifAbsent) { + public MPJQueryWrapper setIfAbsent(BiPredicate ifAbsent) { this.ifAbsent = ifAbsent; return this; } + public MPJQueryWrapper setIfAbsent(Predicate ifAbsent) { + this.ifAbsent = (o, k) -> ifAbsent.test(o); + return this; + } + @Override protected String columnToString(String column) { if (checkSqlInjection && MPJSqlInjectionUtils.check(column)) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java index 3867e5e..ccf8eb8 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java @@ -1,7 +1,9 @@ package com.github.yulichang.query.interfaces; import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; + +import java.util.function.BiPredicate; /** * 查询条件封装 @@ -13,7 +15,7 @@ import com.github.yulichang.config.MybatisPlusJoinIfAbsent; @SuppressWarnings("unused") public interface CompareIfAbsent extends Compare { - MybatisPlusJoinIfAbsent getIfAbsent(); + BiPredicate getIfAbsent(); /** * 等于 = @@ -23,7 +25,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children eqIfAbsent(R column, Object val) { - return eq(getIfAbsent().test(val), column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), column, val); } /** @@ -34,7 +36,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children neIfAbsent(R column, Object val) { - return ne(getIfAbsent().test(val), column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), column, val); } /** @@ -45,7 +47,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children gtIfAbsent(R column, Object val) { - return gt(getIfAbsent().test(val), column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), column, val); } /** @@ -56,7 +58,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children geIfAbsent(R column, Object val) { - return ge(getIfAbsent().test(val), column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), column, val); } /** @@ -67,7 +69,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children ltIfAbsent(R column, Object val) { - return lt(getIfAbsent().test(val), column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), column, val); } /** @@ -78,7 +80,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children leIfAbsent(R column, Object val) { - return le(getIfAbsent().test(val), column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), column, val); } /** @@ -89,7 +91,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children likeIfAbsent(R column, Object val) { - return like(getIfAbsent().test(val), column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), column, val); } /** @@ -100,7 +102,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children notLikeIfAbsent(R column, Object val) { - return notLike(getIfAbsent().test(val), column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), column, val); } /** @@ -111,7 +113,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children notLikeLeftIfAbsent(R column, Object val) { - return notLikeLeft(getIfAbsent().test(val), column, val); + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); } /** @@ -122,7 +124,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children notLikeRightIfAbsent(R column, Object val) { - return notLikeRight(getIfAbsent().test(val), column, val); + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); } /** @@ -133,7 +135,7 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children likeLeftIfAbsent(R column, Object val) { - return likeLeft(getIfAbsent().test(val), column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), column, val); } /** @@ -144,6 +146,6 @@ public interface CompareIfAbsent extends Compare { * @return children */ default Children likeRightIfAbsent(R column, Object val) { - return likeRight(getIfAbsent().test(val), column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), column, val); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java index d8d8b85..cd22de1 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java @@ -13,12 +13,12 @@ import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; import com.github.yulichang.wrapper.interfaces.*; import lombok.Getter; @@ -27,6 +27,7 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiPredicate; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.function.Supplier; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; @@ -122,7 +123,7 @@ public abstract class MPJAbstractWrapper ifAbsent = ConfigProperties.ifAbsent; @Override public T getEntity() { @@ -175,6 +176,11 @@ public abstract class MPJAbstractWrapper ifAbsent) { + this.ifAbsent = ifAbsent; + return typedThis; + } + /** * 设置 ifAbsent * .setIfAbsent(val -> val != null && StringUtils.isNotBlank(val)) @@ -182,8 +188,8 @@ public abstract class MPJAbstractWrapper ifAbsent) { + this.ifAbsent = (obj, key) -> ifAbsent.test(obj); return typedThis; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 08ba2c5..dcf5c84 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -6,10 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.*; import com.github.yulichang.toolkit.support.ColumnCache; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.Query; import com.github.yulichang.wrapper.interfaces.QueryLabel; @@ -20,6 +20,7 @@ import lombok.Getter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -125,7 +126,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, TableList tableList, Integer index, String keyWord, Class joinClass, String tableName, - MybatisPlusJoinIfAbsent ifAbsent) { + BiPredicate ifAbsent) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/IfAbsentSqlKeyWordEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/IfAbsentSqlKeyWordEnum.java new file mode 100644 index 0000000..43ad591 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/IfAbsentSqlKeyWordEnum.java @@ -0,0 +1,22 @@ +package com.github.yulichang.wrapper.enums; + +/** + * if absent 枚举 + * + * @author yulichang + * @since 1.4.9 + */ +public enum IfAbsentSqlKeyWordEnum { + EQ, + NE, + GT, + GE, + LT, + LE, + LIKE, + NOT_LIKE, + LIKE_RIGHT, + NOT_LIKE_RIGHT, + LIKE_LEFT, + NOT_LIKE_LEFT +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java index 4a8943a..2ac6ca4 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java @@ -1,7 +1,9 @@ package com.github.yulichang.wrapper.interfaces; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; + +import java.util.function.BiPredicate; /** * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} @@ -12,85 +14,85 @@ import com.github.yulichang.config.MybatisPlusJoinIfAbsent; @SuppressWarnings("unused") public interface CompareIfAbsent extends Compare { - MybatisPlusJoinIfAbsent getIfAbsent(); + BiPredicate getIfAbsent(); default Children eqIfAbsent(SFunction column, Object val) { - return eq(getIfAbsent().test(val), null, column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), null, column, val); } default Children eqIfAbsent(String alias, SFunction column, Object val) { - return eq(getIfAbsent().test(val), alias, column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), alias, column, val); } default Children neIfAbsent(SFunction column, Object val) { - return ne(getIfAbsent().test(val), null, column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), null, column, val); } default Children neIfAbsent(String alias, SFunction column, Object val) { - return ne(getIfAbsent().test(val), alias, column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), alias, column, val); } default Children gtIfAbsent(SFunction column, Object val) { - return gt(getIfAbsent().test(val), null, column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), null, column, val); } default Children gtIfAbsent(String alias, SFunction column, Object val) { - return gt(getIfAbsent().test(val), alias, column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), alias, column, val); } default Children geIfAbsent(SFunction column, Object val) { - return ge(getIfAbsent().test(val), null, column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), null, column, val); } default Children geIfAbsent(String alias, SFunction column, Object val) { - return ge(getIfAbsent().test(val), alias, column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), alias, column, val); } default Children ltIfAbsent(SFunction column, Object val) { - return lt(getIfAbsent().test(val), null, column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), null, column, val); } default Children ltIfAbsent(String alias, SFunction column, Object val) { - return lt(getIfAbsent().test(val), alias, column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), alias, column, val); } default Children leIfAbsent(SFunction column, Object val) { - return le(getIfAbsent().test(val), null, column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), null, column, val); } default Children leIfAbsent(String alias, SFunction column, Object val) { - return le(getIfAbsent().test(val), alias, column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), alias, column, val); } default Children likeIfAbsent(SFunction column, Object val) { - return like(getIfAbsent().test(val), null, column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), null, column, val); } default Children likeIfAbsent(String alias, SFunction column, Object val) { - return like(getIfAbsent().test(val), alias, column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), alias, column, val); } default Children notLikeIfAbsent(SFunction column, Object val) { - return notLike(getIfAbsent().test(val), null, column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), null, column, val); } default Children notLikeIfAbsent(String alias, SFunction column, Object val) { - return notLike(getIfAbsent().test(val), alias, column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), alias, column, val); } default Children likeLeftIfAbsent(SFunction column, Object val) { - return likeLeft(getIfAbsent().test(val), null, column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), null, column, val); } default Children likeLeftIfAbsent(String alias, SFunction column, Object val) { - return likeLeft(getIfAbsent().test(val), alias, column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); } default Children likeRightIfAbsent(SFunction column, Object val) { - return likeRight(getIfAbsent().test(val), null, column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); } default Children likeRightIfAbsent(String alias, SFunction column, Object val) { - return likeRight(getIfAbsent().test(val), alias, column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java index c9f5922..aede362 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java @@ -1,6 +1,8 @@ package com.github.yulichang.wrapper.interfaces; -import com.github.yulichang.config.MybatisPlusJoinIfAbsent; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; + +import java.util.function.BiPredicate; /** * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} @@ -11,45 +13,45 @@ import com.github.yulichang.config.MybatisPlusJoinIfAbsent; @SuppressWarnings("unused") public interface CompareStrIfAbsent extends CompareStr { - MybatisPlusJoinIfAbsent getIfAbsent(); + BiPredicate getIfAbsent(); default Children eqIfAbsent(R column, Object val) { - return eq(getIfAbsent().test(val), column, val); + return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), column, val); } default Children neIfAbsent(R column, Object val) { - return ne(getIfAbsent().test(val), column, val); + return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), column, val); } default Children gtIfAbsent(R column, Object val) { - return gt(getIfAbsent().test(val), column, val); + return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), column, val); } default Children geIfAbsent(R column, Object val) { - return ge(getIfAbsent().test(val), column, val); + return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), column, val); } default Children ltIfAbsent(R column, Object val) { - return lt(getIfAbsent().test(val), column, val); + return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), column, val); } default Children leIfAbsent(R column, Object val) { - return le(getIfAbsent().test(val), column, val); + return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), column, val); } default Children likeIfAbsent(R column, Object val) { - return like(getIfAbsent().test(val), column, val); + return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), column, val); } default Children notLikeIfAbsent(R column, Object val) { - return notLike(getIfAbsent().test(val), column, val); + return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), column, val); } default Children likeLeftIfAbsent(R column, Object val) { - return likeLeft(getIfAbsent().test(val), column, val); + return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), column, val); } default Children likeRightIfAbsent(R column, Object val) { - return likeRight(getIfAbsent().test(val), column, val); + return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), column, val); } } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java index fe46ba4..2235568 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java @@ -22,12 +22,24 @@ public class IfAbsentTest { @Test void ifAbsent() { + assert IfAbsentEnum.NOT_EMPTY.test("\t", null); + assert !IfAbsentEnum.NOT_EMPTY.test("", null); + assert IfAbsentEnum.NOT_EMPTY.test(" ", null); + assert IfAbsentEnum.NOT_EMPTY.test("\r", null); + assert IfAbsentEnum.NOT_EMPTY.test("a", null); + + assert !IfAbsentEnum.NOT_BLANK.test("\t", null); + assert !IfAbsentEnum.NOT_BLANK.test("", null); + assert !IfAbsentEnum.NOT_BLANK.test(" ", null); + assert !IfAbsentEnum.NOT_BLANK.test("\r", null); + assert IfAbsentEnum.NOT_BLANK.test("a", null); + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + "WHERE t.del = false AND (t.id = ? AND t.head_img = ? AND t.`name` = ?)"); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) - .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getId, 1) .eqIfAbsent(UserDO::getPid, null) .eqIfAbsent(UserDO::getAddressId, "") .eqIfAbsent(UserDO::getImg, "\t") @@ -41,7 +53,7 @@ public class IfAbsentTest { MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .setIfAbsent(IfAbsentEnum.NOT_BLANK) - .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getId, 1) .eqIfAbsent(UserDO::getPid, null) .eqIfAbsent(UserDO::getAddressId, "") .eqIfAbsent(UserDO::getImg, "\t") @@ -55,7 +67,7 @@ public class IfAbsentTest { MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .setIfAbsent(o -> true) - .eq(UserDO::getId, 1) + .eqIfAbsent(UserDO::getId, 1) .eqIfAbsent(UserDO::getPid, null) .eqIfAbsent(UserDO::getName, "") .eqIfAbsent(UserDO::getImg, "\t") From a2bdce761424185003c3771dc7358c15125b7531 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sun, 24 Dec 2023 23:37:14 +0800 Subject: [PATCH 44/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ifAbsent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisPlusJoinAutoConfiguration.java | 3 ++- .../yulichang/config/ConfigProperties.java | 2 +- .../yulichang/config/enums/IfAbsentEnum.java | 19 +++++++++--------- .../yulichang/test/join/m/IfAbsentTest.java | 20 +++++++++---------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 94e6062..3d8a6e5 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -73,7 +73,8 @@ public class MybatisPlusJoinAutoConfiguration { ConfigProperties.logicDelType = this.properties.getLogicDelType(); ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); ConfigProperties.ifAbsent = Optional.ofNullable(ifAbsentConsumers.getIfAvailable()) - .map(m -> (BiPredicate) m).orElse(this.properties.getIfAbsent()); + .map(m -> (BiPredicate) m) + .orElse((val, key) -> this.properties.getIfAbsent().test(val)); info("mybatis plus join properties config complete"); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index b5335fa..64b2a9a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -59,5 +59,5 @@ public class ConfigProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - public static BiPredicate ifAbsent = IfAbsentEnum.NOT_EMPTY; + public static BiPredicate ifAbsent = (val, key) -> IfAbsentEnum.NOT_EMPTY.test(val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java index f04f852..717567e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java @@ -1,10 +1,9 @@ package com.github.yulichang.config.enums; import com.github.yulichang.toolkit.MPJStringUtils; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import java.util.Objects; -import java.util.function.BiPredicate; +import java.util.function.Predicate; /** * 条件判断策略 @@ -12,29 +11,29 @@ import java.util.function.BiPredicate; * @author yulichang * @since 1.4.9 */ -public enum IfAbsentEnum implements BiPredicate { +public enum IfAbsentEnum implements Predicate { /** * 非null */ - NOT_NULL((val, key) -> Objects.nonNull(val)), + NOT_NULL(Objects::nonNull), /** * 非空字符串 例: "" -> false, " " -> true ... */ - NOT_EMPTY((val, key) -> NOT_NULL.test(val, key) && (!(val instanceof CharSequence) || MPJStringUtils.isNotEmpty((CharSequence) val))), + NOT_EMPTY(val -> NOT_NULL.and(v -> !(v instanceof CharSequence) || MPJStringUtils.isNotEmpty((CharSequence) v)).test(val)), /** * NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - NOT_BLANK((val, key) -> NOT_NULL.test(val, key) && (!(val instanceof CharSequence) || MPJStringUtils.isNotBlank((CharSequence) val))); + NOT_BLANK(val -> NOT_NULL.and(v -> !(v instanceof CharSequence) || MPJStringUtils.isNotBlank((CharSequence) v)).test(val)); - private final BiPredicate predicate; + private final Predicate predicate; - IfAbsentEnum(BiPredicate predicate) { + IfAbsentEnum(Predicate predicate) { this.predicate = predicate; } @Override - public boolean test(Object obj, IfAbsentSqlKeyWordEnum keyword) { - return this.predicate.test(obj, keyword); + public boolean test(Object obj) { + return this.predicate.test(obj); } } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java index 2235568..4b87971 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java @@ -22,17 +22,17 @@ public class IfAbsentTest { @Test void ifAbsent() { - assert IfAbsentEnum.NOT_EMPTY.test("\t", null); - assert !IfAbsentEnum.NOT_EMPTY.test("", null); - assert IfAbsentEnum.NOT_EMPTY.test(" ", null); - assert IfAbsentEnum.NOT_EMPTY.test("\r", null); - assert IfAbsentEnum.NOT_EMPTY.test("a", null); + assert IfAbsentEnum.NOT_EMPTY.test("\t"); + assert !IfAbsentEnum.NOT_EMPTY.test(""); + assert IfAbsentEnum.NOT_EMPTY.test(" "); + assert IfAbsentEnum.NOT_EMPTY.test("\r"); + assert IfAbsentEnum.NOT_EMPTY.test("a"); - assert !IfAbsentEnum.NOT_BLANK.test("\t", null); - assert !IfAbsentEnum.NOT_BLANK.test("", null); - assert !IfAbsentEnum.NOT_BLANK.test(" ", null); - assert !IfAbsentEnum.NOT_BLANK.test("\r", null); - assert IfAbsentEnum.NOT_BLANK.test("a", null); + assert !IfAbsentEnum.NOT_BLANK.test("\t"); + assert !IfAbsentEnum.NOT_BLANK.test(""); + assert !IfAbsentEnum.NOT_BLANK.test(" "); + assert !IfAbsentEnum.NOT_BLANK.test("\r"); + assert IfAbsentEnum.NOT_BLANK.test("a"); ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + From ef3301e7eb3b25dad284763a5de0125454bc3013 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 25 Dec 2023 00:57:04 +0800 Subject: [PATCH 45/88] =?UTF-8?q?=E6=B7=BB=E5=8A=A0notLikeLeft=E5=92=8Cnot?= =?UTF-8?q?LikeRight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/kt/KtAbstractWrapper.java | 10 ++++ .../yulichang/kt/interfaces/Compare.java | 47 +++++++++++++++++++ .../kt/interfaces/CompareIfAbsent.java | 16 +++++++ .../yulichang/wrapper/DeleteJoinWrapper.java | 8 +++- ...er.java => JoinAbstractLambdaWrapper.java} | 18 +++---- ...tWrapper.java => JoinAbstractWrapper.java} | 22 ++++++++- .../yulichang/wrapper/MPJLambdaWrapper.java | 2 +- .../yulichang/wrapper/UpdateJoinWrapper.java | 2 +- .../yulichang/wrapper/interfaces/Compare.java | 44 +++++++++++++++++ .../wrapper/interfaces/CompareIfAbsent.java | 16 +++++++ .../wrapper/interfaces/CompareStr.java | 35 ++++++++++++++ .../interfaces/CompareStrIfAbsent.java | 8 ++++ .../wrapper/interfaces/QueryJoin.java | 42 ++++++++--------- .../yulichang/test/join/m/IfAbsentTest.java | 6 +++ .../test/join/m/NotLikeLeftRightTest.java | 40 ++++++++++++++++ 15 files changed, 281 insertions(+), 35 deletions(-) rename mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/{MPJAbstractLambdaWrapper.java => JoinAbstractLambdaWrapper.java} (96%) rename mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/{MPJAbstractWrapper.java => JoinAbstractWrapper.java} (97%) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/NotLikeLeftRightTest.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index 981aec3..cc4211e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -252,11 +252,21 @@ public abstract class KtAbstractWrapper column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.LEFT); + } + @Override public Children likeRight(boolean condition, String alias, KProperty column, Object val) { return likeValue(condition, LIKE, alias, column, val, SqlLike.RIGHT); } + @Override + public Children notLikeRight(boolean condition, String alias, KProperty column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.RIGHT); + } + @Override public Children between(boolean condition, String alias, KProperty column, Object val1, Object val2) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), BETWEEN, diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java index b995c71..4726244 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Compare.java @@ -287,6 +287,28 @@ public interface Compare extends Serializable { */ Children likeLeft(boolean condition, String alias, KProperty column, Object val); + default Children notLikeLeft(KProperty column, Object val) { + return notLikeLeft(true, null, column, val); + } + + default Children notLikeLeft(String alias, KProperty column, Object val) { + return notLikeLeft(true, alias, column, val); + } + + default Children notLikeLeft(boolean condition, KProperty column, Object val) { + return notLikeLeft(condition, null, column, val); + } + + /** + * LIKE '%值' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeLeft(boolean condition, String alias, KProperty column, Object val); + default Children likeRight(KProperty column, Object val) { return likeRight(true, null, column, val); @@ -310,4 +332,29 @@ public interface Compare extends Serializable { * @return children */ Children likeRight(boolean condition, String alias, KProperty column, Object val); + + + + default Children notLikeRight(KProperty column, Object val) { + return notLikeRight(true, null, column, val); + } + + default Children notLikeRight(String alias, KProperty column, Object val) { + return notLikeRight(true, alias, column, val); + } + + default Children notLikeRight(boolean condition, KProperty column, Object val) { + return notLikeRight(condition, null, column, val); + } + + + /** + * LIKE '值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeRight(boolean condition, String alias, KProperty column, Object val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java index f379a63..71ae0fe 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java @@ -89,6 +89,14 @@ public interface CompareIfAbsent extends Compare { return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); } + default Children notLikeLeftIfAbsent(KProperty column, Object val) { + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfAbsent(String alias, KProperty column, Object val) { + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + default Children likeRightIfAbsent(KProperty column, Object val) { return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); } @@ -96,4 +104,12 @@ public interface CompareIfAbsent extends Compare { default Children likeRightIfAbsent(String alias, KProperty column, Object val) { return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); } + + default Children notLikeRightIfAbsent(KProperty column, Object val) { + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfAbsent(String alias, KProperty column, Object val) { + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/DeleteJoinWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/DeleteJoinWrapper.java index ff4915b..887c7d9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/DeleteJoinWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/DeleteJoinWrapper.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; * @author yulichang * @since 1.4.5 */ -public class DeleteJoinWrapper extends MPJAbstractLambdaWrapper> { +public class DeleteJoinWrapper extends JoinAbstractLambdaWrapper> { /** * 删除表 @@ -100,6 +100,7 @@ public class DeleteJoinWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper delete(Class... deleteClass) { Class entityClass = getEntityClass(); Assert.notNull(entityClass, "缺少主表类型, 请使用 new MPJLambdaWrapper<>(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); @@ -164,6 +166,7 @@ public class DeleteJoinWrapper extends MPJAbstractLambdaWrapper> classList) { Class entityClass = getEntityClass(); TableInfo tableInfo = TableHelper.get(entityClass); @@ -185,7 +188,8 @@ public class DeleteJoinWrapper extends MPJAbstractLambdaWrapper entityClass = getEntityClass(); Assert.notNull(entityClass, "缺少主表类型, 请使用 new MPJLambdaWrapper<>(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java similarity index 96% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java index c0fc4fc..0a2970d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java @@ -38,8 +38,8 @@ import static java.util.stream.Collectors.joining; * @author yulichang */ @SuppressWarnings({"DuplicatedCode", "unused"}) -public abstract class MPJAbstractLambdaWrapper> - extends MPJAbstractWrapper implements QueryJoin { +public abstract class JoinAbstractLambdaWrapper> + extends JoinAbstractWrapper implements QueryJoin { /** * 主表别名 @@ -101,14 +101,14 @@ public abstract class MPJAbstractLambdaWrapper clazz) { + public JoinAbstractLambdaWrapper(Class clazz) { initNeed(); setEntityClass(clazz); tableList.setRootClass(clazz); @@ -119,7 +119,7 @@ public abstract class MPJAbstractLambdaWrapper clazz, String alias) { + public JoinAbstractLambdaWrapper(Class clazz, String alias) { this.alias = alias; setEntityClass(clazz); initNeed(); @@ -156,7 +156,7 @@ public abstract class MPJAbstractLambdaWrapper Children join(String keyWord, Class clazz, String tableAlias, BiConsumer, Children> consumer) { + public Children join(String keyWord, Class clazz, String tableAlias, BiConsumer, Children> consumer) { Integer oldIndex = this.getIndex(); int newIndex = tableIndex; TableInfo info = TableHelper.get(clazz); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java similarity index 97% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java index cd22de1..7e97c4d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java @@ -41,7 +41,7 @@ import static java.util.stream.Collectors.joining; * @author yulichang */ @SuppressWarnings({"unchecked", "unused", "DuplicatedCode"}) -public abstract class MPJAbstractWrapper> extends Wrapper +public abstract class JoinAbstractWrapper> extends Wrapper implements CompareIfAbsent, Nested, Join, Func, OnCompare, CompareStrIfAbsent, FuncStr { @@ -272,11 +272,21 @@ public abstract class MPJAbstractWrapper Children notLikeLeft(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.LEFT); + } + @Override public Children likeRight(boolean condition, String alias, SFunction column, Object val) { return likeValue(condition, LIKE, alias, column, val, SqlLike.RIGHT); } + @Override + public Children notLikeRight(boolean condition, String alias, SFunction column, Object val) { + return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.RIGHT); + } + @Override public Children between(boolean condition, String alias, SFunction column, Object val1, Object val2) { return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), BETWEEN, @@ -1002,11 +1012,21 @@ public abstract class MPJAbstractWrapper appendSqlSegments(columnToSqlSegment(column), BETWEEN, diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index dcf5c84..488be2e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -31,7 +31,7 @@ import java.util.stream.Collectors; * @author yulichang */ @SuppressWarnings({"unused", "DuplicatedCode"}) -public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> implements +public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper> implements Query>, QueryLabel>, Chain, SelectWrapper> { /** diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java index 84628c3..405385d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java @@ -28,7 +28,7 @@ import java.util.stream.Collectors; * @since 1.4.5 */ @SuppressWarnings("unused") -public class UpdateJoinWrapper extends MPJAbstractLambdaWrapper> +public class UpdateJoinWrapper extends JoinAbstractLambdaWrapper> implements Update> { /** * SQL 更新字段内容,例如:name='1', age=2 diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java index 7b76b5a..d514904 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java @@ -305,6 +305,28 @@ public interface Compare extends Serializable { */ Children likeLeft(boolean condition, String alias, SFunction column, Object val); + default Children notLikeLeft(SFunction column, Object val) { + return notLikeLeft(true, null, column, val); + } + + default Children notLikeLeft(String alias, SFunction column, Object val) { + return notLikeLeft(true, alias, column, val); + } + + default Children notLikeLeft(boolean condition, SFunction column, Object val) { + return notLikeLeft(condition, null, column, val); + } + + /** + * LIKE '%值' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeLeft(boolean condition, String alias, SFunction column, Object val); + default Children likeRight(SFunction column, Object val) { return likeRight(true, null, column, val); } @@ -326,4 +348,26 @@ public interface Compare extends Serializable { * @return children */ Children likeRight(boolean condition, String alias, SFunction column, Object val); + + default Children notLikeRight(SFunction column, Object val) { + return notLikeRight(true, null, column, val); + } + + default Children notLikeRight(String alias, SFunction column, Object val) { + return notLikeRight(true, alias, column, val); + } + + default Children notLikeRight(boolean condition, SFunction column, Object val) { + return notLikeRight(condition, null, column, val); + } + + /** + * LIKE '值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeRight(boolean condition, String alias, SFunction column, Object val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java index 2ac6ca4..51582cc 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java @@ -88,6 +88,14 @@ public interface CompareIfAbsent extends Compare { return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); } + default Children notLikeLeftIfAbsent(SFunction column, Object val) { + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfAbsent(String alias, SFunction column, Object val) { + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + default Children likeRightIfAbsent(SFunction column, Object val) { return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); } @@ -95,4 +103,12 @@ public interface CompareIfAbsent extends Compare { default Children likeRightIfAbsent(String alias, SFunction column, Object val) { return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); } + + default Children notLikeRightIfAbsent(SFunction column, Object val) { + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfAbsent(String alias, SFunction column, Object val) { + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStr.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStr.java index c70f917..e428555 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStr.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStr.java @@ -265,6 +265,23 @@ public interface CompareStr extends Serializable { */ Children likeLeft(boolean condition, R column, Object val); + /** + * ignore + */ + default Children notLikeLeft(R column, Object val) { + return notLikeLeft(true, column, val); + } + + /** + * LIKE '%值' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeLeft(boolean condition, R column, Object val); + /** * ignore */ @@ -281,4 +298,22 @@ public interface CompareStr extends Serializable { * @return children */ Children likeRight(boolean condition, R column, Object val); + + + /** + * ignore + */ + default Children notLikeRight(R column, Object val) { + return notLikeRight(true, column, val); + } + + /** + * LIKE '值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLikeRight(boolean condition, R column, Object val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java index aede362..a58520d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java @@ -54,4 +54,12 @@ public interface CompareStrIfAbsent extends CompareStr default Children likeRightIfAbsent(R column, Object val) { return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), column, val); } + + default Children notLikeLeftIfAbsent(R column, Object val) { + return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); + } + + default Children notLikeRightIfAbsent(R column, Object val) { + return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java index ddeece3..09bb0ad 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryJoin.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Constant; -import com.github.yulichang.wrapper.MPJAbstractLambdaWrapper; +import com.github.yulichang.wrapper.JoinAbstractLambdaWrapper; import java.util.function.BiConsumer; @@ -45,7 +45,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param function 条件` */ - default Children leftJoin(Class clazz, WrapperFunction> function) { + default Children leftJoin(Class clazz, WrapperFunction> function) { return join(Constant.LEFT_JOIN, clazz, function); } @@ -68,7 +68,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param consumer 条件 */ - default Children leftJoin(Class clazz, BiConsumer, Children> consumer) { + default Children leftJoin(Class clazz, BiConsumer, Children> consumer) { return join(Constant.LEFT_JOIN, clazz, consumer); } @@ -103,7 +103,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param function 条件 */ - default Children leftJoin(Class clazz, String alias, WrapperFunction> function) { + default Children leftJoin(Class clazz, String alias, WrapperFunction> function) { return join(Constant.LEFT_JOIN, clazz, alias, function); } @@ -126,7 +126,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param consumer 条件 */ - default Children leftJoin(Class clazz, String alias, BiConsumer, Children> consumer) { + default Children leftJoin(Class clazz, String alias, BiConsumer, Children> consumer) { return join(Constant.LEFT_JOIN, clazz, alias, consumer); } @@ -148,7 +148,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, WrapperFunction> function) { + default Children rightJoin(Class clazz, WrapperFunction> function) { return join(Constant.RIGHT_JOIN, clazz, function); } @@ -162,7 +162,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, BiConsumer, Children> consumer) { + default Children rightJoin(Class clazz, BiConsumer, Children> consumer) { return join(Constant.RIGHT_JOIN, clazz, consumer); } @@ -176,7 +176,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, String alias, WrapperFunction> function) { + default Children rightJoin(Class clazz, String alias, WrapperFunction> function) { return join(Constant.RIGHT_JOIN, clazz, alias, function); } @@ -190,7 +190,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children rightJoin(Class clazz, String alias, BiConsumer, Children> consumer) { + default Children rightJoin(Class clazz, String alias, BiConsumer, Children> consumer) { return join(Constant.RIGHT_JOIN, clazz, alias, consumer); } @@ -212,7 +212,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children innerJoin(Class clazz, WrapperFunction> function) { + default Children innerJoin(Class clazz, WrapperFunction> function) { return join(Constant.INNER_JOIN, clazz, function); } @@ -226,7 +226,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children innerJoin(Class clazz, BiConsumer, Children> consumer) { + default Children innerJoin(Class clazz, BiConsumer, Children> consumer) { return join(Constant.INNER_JOIN, clazz, consumer); } @@ -241,7 +241,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children innerJoin(Class clazz, String alias, WrapperFunction> function) { + default Children innerJoin(Class clazz, String alias, WrapperFunction> function) { return join(Constant.INNER_JOIN, clazz, alias, function); } @@ -255,7 +255,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children innerJoin(Class clazz, String alias, BiConsumer, Children> consumer) { + default Children innerJoin(Class clazz, String alias, BiConsumer, Children> consumer) { return join(Constant.INNER_JOIN, clazz, alias, consumer); } @@ -276,7 +276,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children fullJoin(Class clazz, WrapperFunction> function) { + default Children fullJoin(Class clazz, WrapperFunction> function) { return join(Constant.FULL_JOIN, clazz, function); } @@ -290,7 +290,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children fullJoin(Class clazz, BiConsumer, Children> consumer) { + default Children fullJoin(Class clazz, BiConsumer, Children> consumer) { return join(Constant.FULL_JOIN, clazz, consumer); } @@ -311,7 +311,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children fullJoin(Class clazz, String alias, WrapperFunction> function) { + default Children fullJoin(Class clazz, String alias, WrapperFunction> function) { return join(Constant.FULL_JOIN, clazz, alias, function); } @@ -325,7 +325,7 @@ public interface QueryJoin extends MPJBaseJoin, String /** * ignore 参考 left join */ - default Children fullJoin(Class clazz, String alias, BiConsumer, Children> consumer) { + default Children fullJoin(Class clazz, String alias, BiConsumer, Children> consumer) { return join(Constant.FULL_JOIN, clazz, alias, consumer); } @@ -366,7 +366,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param function 条件 */ - default Children join(String keyWord, Class clazz, WrapperFunction> function) { + default Children join(String keyWord, Class clazz, WrapperFunction> function) { return join(keyWord, clazz, (on, e) -> function.apply(on)); } @@ -422,7 +422,7 @@ public interface QueryJoin extends MPJBaseJoin, String * @param clazz 关联实体类 * @param function 条件 */ - default Children join(String keyWord, Class clazz, String alias, WrapperFunction> function) { + default Children join(String keyWord, Class clazz, String alias, WrapperFunction> function) { return join(keyWord, clazz, alias, (on, e) -> function.apply(on)); } @@ -443,12 +443,12 @@ public interface QueryJoin extends MPJBaseJoin, String /** * 内部使用, 不建议直接调用 */ - default Children join(String keyWord, Class clazz, BiConsumer, Children> consumer) { + default Children join(String keyWord, Class clazz, BiConsumer, Children> consumer) { return join(keyWord, clazz, null, consumer); } /** * 内部使用, 不建议直接调用 */ - Children join(String keyWord, Class clazz, String alias, BiConsumer, Children> consumer); + Children join(String keyWord, Class clazz, String alias, BiConsumer, Children> consumer); } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java index 4b87971..f12eedd 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java @@ -27,12 +27,18 @@ public class IfAbsentTest { assert IfAbsentEnum.NOT_EMPTY.test(" "); assert IfAbsentEnum.NOT_EMPTY.test("\r"); assert IfAbsentEnum.NOT_EMPTY.test("a"); + assert IfAbsentEnum.NOT_EMPTY.test(1); + assert IfAbsentEnum.NOT_EMPTY.test(true); + assert IfAbsentEnum.NOT_EMPTY.test('A'); assert !IfAbsentEnum.NOT_BLANK.test("\t"); assert !IfAbsentEnum.NOT_BLANK.test(""); assert !IfAbsentEnum.NOT_BLANK.test(" "); assert !IfAbsentEnum.NOT_BLANK.test("\r"); assert IfAbsentEnum.NOT_BLANK.test("a"); + assert IfAbsentEnum.NOT_EMPTY.test(1); + assert IfAbsentEnum.NOT_EMPTY.test(true); + assert IfAbsentEnum.NOT_EMPTY.test('A'); ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/NotLikeLeftRightTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/NotLikeLeftRightTest.java new file mode 100644 index 0000000..a396366 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/NotLikeLeftRightTest.java @@ -0,0 +1,40 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class NotLikeLeftRightTest { + + @BeforeEach + void setUp() { + Reset.reset(); + } + + @Test + void notLikeLeftRight() { + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.`name` NOT LIKE ?)"); + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .notLikeLeft(UserDO::getName, "aa"); + List list = wrapper.list(); + list.forEach(System.out::println); + + ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.`name` NOT LIKE ?)"); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .notLikeRight(UserDO::getName, "aa"); + List list1 = wrapper1.list(); + list1.forEach(System.out::println); + } +} From 6a6b6415efb4d514be509bad21f55945a1373833 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 25 Dec 2023 23:38:24 +0800 Subject: [PATCH 46/88] MP -> 3.5.5 --- mybatis-plus-join-test/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 251c30b..fd5218d 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -51,7 +51,7 @@ 1.4.8.1 - 3.5.4.1 + 3.5.5 1.8 1.8 diff --git a/pom.xml b/pom.xml index b7d4d51..e54380e 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 1.4.8.1 - 3.5.4.1 + 3.5.5 1.8 1.8 From 3d3762f47009eabd136f180c8b0096cc93812c6c Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 25 Dec 2023 23:52:50 +0800 Subject: [PATCH 47/88] MP -> 3.5.5 --- .../com/github/yulichang/kt/KtAbstractWrapper.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index cc4211e..ca03000 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -898,11 +898,21 @@ public abstract class KtAbstractWrapper appendSqlSegments(columnToSqlSegment(column), BETWEEN, From dbdea7b592af5015d26838a79c2c7d74c149695d Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 27 Dec 2023 14:55:56 +0800 Subject: [PATCH 48/88] fix https://gitee.com/best_handsome/mybatis-plus-join/issues/I8RE0R --- .../yulichang/interceptor/MPJInterceptor.java | 12 +--- mybatis-plus-join-test/pom.xml | 30 ++++++++++ .../test/join/LambdaWrapperTest.java | 6 +- .../yulichang/test/join/m/FieldAliasTest.java | 59 +++++++++++++++++++ 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldAliasTest.java diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index 3d7bf01..0eea4f3 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.interfaces.MPJBaseJoin; -import com.github.yulichang.method.MPJResultType; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.MPJReflectionKit; @@ -77,19 +76,14 @@ public class MPJInterceptor implements Interceptor { if (CollectionUtils.isNotEmpty(ms.getResultMaps())) { Class entity = MPJTableMapperHelper.getEntity(getMapper(ms.getId(), ms.getResource())); Class type = ms.getResultMaps().get(0).getType(); - if (Objects.nonNull(entity) && Objects.nonNull(type) && entity == type) { + if (Objects.nonNull(entity) && Objects.nonNull(type) + && !MPJReflectionKit.isPrimitiveOrWrapper(type) && entity == type) { rt = type; } } } if (Objects.nonNull(rt)) { - List list = ms.getResultMaps(); - if (CollectionUtils.isNotEmpty(list)) { - ResultMap resultMap = list.get(0); - if (resultMap.getType() == MPJResultType.class) { - args[0] = getMappedStatement(ms, rt, ew); - } - } + args[0] = getMappedStatement(ms, rt, ew); } } } diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index fd5218d..7506d26 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -104,4 +104,34 @@ + + + + org.codehaus.mojo + flatten-maven-plugin + 1.5.0 + + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index c6cbb4e..4cc9630 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -260,7 +260,6 @@ class LambdaWrapperTest { @Test - @SuppressWarnings("unchecked") void testMSCache() { ThreadLocalUtils.set("SELECT t.id,\n" + " t.pid,\n" + @@ -738,7 +737,9 @@ class LambdaWrapperTest { .lt(UserDO::getId, 8)); assert dos.size() == 4; - ThreadLocalUtils.set("SELECT id,pid,`name`,`json`,sex,head_img,create_time,address_id,address_id2,del,create_by,update_by FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?)", + ThreadLocalUtils.set( + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.id > ? AND t.id < ?)", + "SELECT id, pid, `name`, `json`, sex, head_img, create_time, address_id, address_id2, del, create_by, update_by FROM `user` t WHERE t.del = false AND (t.id > ? AND t.id < ?)", "SELECT * FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?) "); List dos1 = userMapper.selectList(new MPJLambdaWrapper() .gt(UserDO::getId, 3) @@ -993,6 +994,7 @@ class LambdaWrapperTest { void joinOrder() { if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", + "SELECT t.id, t.user_id, t.name FROM order_t t ORDER BY t.name DESC", "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc"); } else { ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t", diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldAliasTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldAliasTest.java new file mode 100644 index 0000000..515f366 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FieldAliasTest.java @@ -0,0 +1,59 @@ +package com.github.yulichang.test.join.m; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.join.entity.UserTenantDO; +import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.join.mapper.UserTenantMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class FieldAliasTest { + + @Autowired + private UserMapper userMapper; + + @Autowired + private UserTenantMapper userTenantMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + @Test + void fieldAlias() { + List list = userMapper.selectList(JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); + + list.forEach(System.out::println); + + assert list.get(0).getImg() != null; + + } + + @Test + void fieldAlias1() { + MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserTenantDO.class) + .selectAll(UserTenantDO.class) + .leftJoin(UserDO.class, UserDO::getId, UserTenantDO::getUuid); + List list = userTenantMapper.selectList(wrapper); + + new LambdaQueryWrapper().getSqlSelect(); + list.forEach(System.out::println); + System.out.println(wrapper.getSqlSelect()); + assert list.get(0).getIdea() != null; + assert list.get(0).getUuid() != null; + } +} From 63e5c3787ef79b1c2aa55283ae4c47cb36c1ad22 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 29 Dec 2023 21:33:36 +0800 Subject: [PATCH 49/88] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B1=BB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autoconfigure/MybatisPlusJoinAutoConfiguration.java | 4 ++-- ...qlInjectorCondition.java => JoinSqlInjectorCondition.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/{MPJSqlInjectorCondition.java => JoinSqlInjectorCondition.java} (88%) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 3d8a6e5..0a51a03 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -2,7 +2,7 @@ package com.github.yulichang.autoconfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; import com.baomidou.mybatisplus.core.injector.ISqlInjector; -import com.github.yulichang.autoconfigure.conditional.MPJSqlInjectorCondition; +import com.github.yulichang.autoconfigure.conditional.JoinSqlInjectorCondition; import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfAbsentConsumer; import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinPropertiesConsumer; import com.github.yulichang.config.ConfigProperties; @@ -102,7 +102,7 @@ public class MybatisPlusJoinAutoConfiguration { */ @Bean @Primary - @MPJSqlInjectorCondition + @JoinSqlInjectorCondition @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnBean(ISqlInjector.class) @ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class}) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/JoinSqlInjectorCondition.java similarity index 88% rename from mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java rename to mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/JoinSqlInjectorCondition.java index ac24fec..20d3987 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/JoinSqlInjectorCondition.java @@ -13,5 +13,5 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Conditional(OnSqlInjectorCondition.class) -public @interface MPJSqlInjectorCondition { +public @interface JoinSqlInjectorCondition { } From e021c8281bc1cd5a71bf80ded4507d141880ca68 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 30 Dec 2023 14:30:37 +0800 Subject: [PATCH 50/88] solon-plugin --- mybatis-plus-join-solon-plugin/pom.xml | 53 +++++++++++ .../solon/plugin/XPluginImpl.java | 91 +++++++++++++++++++ .../mybatis-plus-join-solon-plugin.properties | 3 + pom.xml | 1 + 4 files changed, 148 insertions(+) create mode 100644 mybatis-plus-join-solon-plugin/pom.xml create mode 100644 mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java create mode 100644 mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties diff --git a/mybatis-plus-join-solon-plugin/pom.xml b/mybatis-plus-join-solon-plugin/pom.xml new file mode 100644 index 0000000..5fd1732 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + com.github.yulichang + mybatis-plus-join-root + ${revision} + + + mybatis-plus-join-solon-plugin + + + 2.6.3 + 8 + 8 + UTF-8 + + + + + com.github.yulichang + mybatis-plus-join-extension + ${revision} + + + com.baomidou + mybatis-plus-core + ${mpj.mybatis.plus.version} + provided + + + org.noear + solon + ${solon.varrsion} + provided + + + org.noear + mybatis-solon-plugin + ${solon.varrsion} + provided + + + org.noear + mybatis-plus-solon-plugin + ${solon.varrsion} + provided + + + + \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java new file mode 100644 index 0000000..b6ab44f --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -0,0 +1,91 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin; + +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; +import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; +import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.config.MPJInterceptorConfig; +import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.LogicDelTypeEnum; +import com.github.yulichang.extension.mapping.config.MappingConfig; +import com.github.yulichang.injector.MPJSqlInjector; +import com.github.yulichang.toolkit.SpringContentUtils; +import com.github.yulichang.toolkit.reflect.GenericTypeUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.solon.MybatisAdapter; +import org.apache.ibatis.solon.integration.MybatisAdapterManager; +import org.noear.solon.core.AppContext; +import org.noear.solon.core.Plugin; +import org.noear.solon.core.Props; +import org.noear.solon.core.event.AppLoadEndEvent; +import org.noear.solon.core.util.GenericUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; + +public class XPluginImpl implements Plugin { + + @Override + public void start(AppContext context) throws Throwable { + /* 设置 MPJSqlInjector + 反射修改GlobalConfigUtils.GLOBAL_CONFIG属性 + 修改final修饰的变量会出现警告 + 使用solon方式配置不生效采用的“曲线救国”方式 + issue https://gitee.com/noear/solon/issues/I8SJ0Z */ + Field field = GlobalConfigUtils.class.getDeclaredField("GLOBAL_CONFIG"); + field.setAccessible(true); + Field modifier = Field.class.getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, new ConcurrentHashMap() { + @Override + @SuppressWarnings("NullableProblems") + public GlobalConfig putIfAbsent(String key, GlobalConfig value) { + value.setSqlInjector(new MPJSqlInjector()); + return super.putIfAbsent(key, value); + } + }); + GenericTypeUtils.setGenericTypeResolver(GenericUtil::resolveTypeArguments); + // SpringContext兼容 + SpringContentUtils.setSpringContext(new SpringContentUtils.SpringContext() { + @Override + public T getBean(Class clazz) { + return context.getBean(clazz); + } + + @Override + public Map getBeansOfType(Class clazz) { + return context.getBeansMapOfType(clazz); + } + }); + // 读取配置 + Props prop = context.cfg().getProp("mybatis-plus-join"); + ConfigProperties.banner = prop.getBool("banner", ConfigProperties.banner); + ConfigProperties.subTableLogic = prop.getBool("subTableLogic", ConfigProperties.subTableLogic); + ConfigProperties.msCache = prop.getBool("msCache", ConfigProperties.msCache); + ConfigProperties.tableAlias = prop.get("tableAlias", ConfigProperties.tableAlias); + ConfigProperties.joinPrefix = prop.get("joinPrefix", ConfigProperties.joinPrefix); + ConfigProperties.logicDelType = prop.getOrDefault("logicDelType", ConfigProperties.logicDelType, val -> + Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误"))); + ConfigProperties.mappingMaxCount = prop.getInt("mappingMaxCount", ConfigProperties.mappingMaxCount); + ConfigProperties.ifAbsent = prop.getOrDefault("ifAbsent", ConfigProperties.ifAbsent, val -> + Arrays.stream(IfAbsentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .map(m -> (BiPredicate) (o, ifAbsentSqlKeyWordEnum) -> m.test(o)) + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifAbsent 配置错误"))); + // 后续操作 + context.onEvent(AppLoadEndEvent.class, e -> { + List sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream() + .map(MybatisAdapter::getFactory).collect(Collectors.toList()); + new MPJInterceptorConfig(sqlSessionFactoryList, false); + MappingConfig.init(); + }); + } +} \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties b/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties new file mode 100644 index 0000000..ce4223a --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties @@ -0,0 +1,3 @@ +# suppress inspection "UnusedProperty" for whole file +solon.plugin=com.github.yulichang.mybatisplusjoin.solon.plugin.XPluginImpl +solon.plugin.priority=3 \ No newline at end of file diff --git a/pom.xml b/pom.xml index e54380e..4808b33 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ mybatis-plus-join-core mybatis-plus-join-annotation mybatis-plus-join-extension + mybatis-plus-join-solon-plugin mybatis-plus-join-test From 75fc373f2cc848bbeb0d226c14c087d0ff7f1523 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 30 Dec 2023 14:52:32 +0800 Subject: [PATCH 51/88] solon-plugin --- mybatis-plus-join-solon-plugin/README.md | 9 +++++++++ .../mybatisplusjoin/solon/plugin/XPluginImpl.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 mybatis-plus-join-solon-plugin/README.md diff --git a/mybatis-plus-join-solon-plugin/README.md b/mybatis-plus-join-solon-plugin/README.md new file mode 100644 index 0000000..6f8e809 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/README.md @@ -0,0 +1,9 @@ +## mybatis-plus-join-solon-plugin + +```xml + + com.github.yulichang + mybatis-plus-join-solon-plugin + lastVersion + +``` \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index b6ab44f..9ad963e 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -84,7 +84,7 @@ public class XPluginImpl implements Plugin { context.onEvent(AppLoadEndEvent.class, e -> { List sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream() .map(MybatisAdapter::getFactory).collect(Collectors.toList()); - new MPJInterceptorConfig(sqlSessionFactoryList, false); + new MPJInterceptorConfig(sqlSessionFactoryList, ConfigProperties.banner); MappingConfig.init(); }); } From f038a10e1e75d121458f8fbda799c6ccd56f1490 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 30 Dec 2023 15:03:55 +0800 Subject: [PATCH 52/88] 1.4.9 --- README-zh.md | 4 ++-- README.md | 4 ++-- .../com/github/yulichang/config/MPJInterceptorConfig.java | 2 +- mybatis-plus-join-test/pom.xml | 2 +- mybatis-plus-join/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README-zh.md b/README-zh.md index 88e80fe..3d4d970 100644 --- a/README-zh.md +++ b/README-zh.md @@ -49,12 +49,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.8.1 + 1.4.9 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8.1' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.9' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/README.md b/README.md index d44ae08..d9dba93 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ QQ群:1022221898 或者 com.github.yulichang mybatis-plus-join-boot-starter - 1.4.8.1 + 1.4.9 ``` - Gradle ``` - implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.8.1' + implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.9' ``` 或者clone代码到本地执行 mvn install, 再引入以上依赖
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java index b47a29d..ccef440 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/MPJInterceptorConfig.java @@ -30,7 +30,7 @@ public class MPJInterceptorConfig { System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" + "| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" + " / | /\n" + - " 1.4.8.1"); + " 1.4.9"); } } diff --git a/mybatis-plus-join-test/pom.xml b/mybatis-plus-join-test/pom.xml index 7506d26..8ee3b2a 100644 --- a/mybatis-plus-join-test/pom.xml +++ b/mybatis-plus-join-test/pom.xml @@ -50,7 +50,7 @@ - 1.4.8.1 + 1.4.9 3.5.5 1.8 diff --git a/mybatis-plus-join/pom.xml b/mybatis-plus-join/pom.xml index 6bcab65..5486ac5 100644 --- a/mybatis-plus-join/pom.xml +++ b/mybatis-plus-join/pom.xml @@ -41,7 +41,7 @@ - 1.4.8.1 + 1.4.9 1.8 1.8 diff --git a/pom.xml b/pom.xml index 4808b33..9a9b697 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ - 1.4.8.1 + 1.4.9 3.5.5 1.8 From aee5f54559f17c9e8bec5706bfb23fe8de4e4354 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sun, 31 Dec 2023 11:49:50 +0800 Subject: [PATCH 53/88] solon --- .../solon/plugin/XPluginImpl.java | 31 +++++-------------- 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index 9ad963e..f87d660 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -1,8 +1,6 @@ package com.github.yulichang.mybatisplusjoin.solon.plugin; -import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; -import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; import com.github.yulichang.config.enums.IfAbsentEnum; @@ -15,43 +13,28 @@ import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.solon.MybatisAdapter; import org.apache.ibatis.solon.integration.MybatisAdapterManager; +import org.noear.solon.Utils; import org.noear.solon.core.AppContext; import org.noear.solon.core.Plugin; import org.noear.solon.core.Props; import org.noear.solon.core.event.AppLoadEndEvent; import org.noear.solon.core.util.GenericUtil; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; +import javax.sql.DataSource; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiPredicate; import java.util.stream.Collectors; public class XPluginImpl implements Plugin { @Override - public void start(AppContext context) throws Throwable { - /* 设置 MPJSqlInjector - 反射修改GlobalConfigUtils.GLOBAL_CONFIG属性 - 修改final修饰的变量会出现警告 - 使用solon方式配置不生效采用的“曲线救国”方式 - issue https://gitee.com/noear/solon/issues/I8SJ0Z */ - Field field = GlobalConfigUtils.class.getDeclaredField("GLOBAL_CONFIG"); - field.setAccessible(true); - Field modifier = Field.class.getDeclaredField("modifiers"); - modifier.setAccessible(true); - modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, new ConcurrentHashMap() { - @Override - @SuppressWarnings("NullableProblems") - public GlobalConfig putIfAbsent(String key, GlobalConfig value) { - value.setSqlInjector(new MPJSqlInjector()); - return super.putIfAbsent(key, value); - } - }); + public void start(AppContext context) { + // MPJSqlInjector + context.subWrapsOfType(DataSource.class, bw -> context.cfg().putIfAbsent(Utils.isEmpty(bw.name()) ? + "mybatis.globalConfig.sqlInjector" : ("mybatis." + bw.name() + ".globalConfig.sqlInjector"), MPJSqlInjector.class.getName())); + // setGenericTypeResolver GenericTypeUtils.setGenericTypeResolver(GenericUtil::resolveTypeArguments); // SpringContext兼容 SpringContentUtils.setSpringContext(new SpringContentUtils.SpringContext() { From 26d7ff580b27a07675709e387e6e07c9c1d79c80 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 5 Jan 2024 11:17:12 +0800 Subject: [PATCH 54/88] solon --- .../solon/plugin/XPluginImpl.java | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index f87d660..d6fad17 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -21,10 +21,9 @@ import org.noear.solon.core.event.AppLoadEndEvent; import org.noear.solon.core.util.GenericUtil; import javax.sql.DataSource; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiPredicate; +import java.util.function.Function; import java.util.stream.Collectors; public class XPluginImpl implements Plugin { @@ -33,7 +32,8 @@ public class XPluginImpl implements Plugin { public void start(AppContext context) { // MPJSqlInjector context.subWrapsOfType(DataSource.class, bw -> context.cfg().putIfAbsent(Utils.isEmpty(bw.name()) ? - "mybatis.globalConfig.sqlInjector" : ("mybatis." + bw.name() + ".globalConfig.sqlInjector"), MPJSqlInjector.class.getName())); + "mybatis.globalConfig.sqlInjector" : ("mybatis." + bw.name() + ".globalConfig.sqlInjector"), + MPJSqlInjector.class.getName())); // setGenericTypeResolver GenericTypeUtils.setGenericTypeResolver(GenericUtil::resolveTypeArguments); // SpringContext兼容 @@ -49,19 +49,19 @@ public class XPluginImpl implements Plugin { } }); // 读取配置 - Props prop = context.cfg().getProp("mybatis-plus-join"); - ConfigProperties.banner = prop.getBool("banner", ConfigProperties.banner); - ConfigProperties.subTableLogic = prop.getBool("subTableLogic", ConfigProperties.subTableLogic); - ConfigProperties.msCache = prop.getBool("msCache", ConfigProperties.msCache); - ConfigProperties.tableAlias = prop.get("tableAlias", ConfigProperties.tableAlias); - ConfigProperties.joinPrefix = prop.get("joinPrefix", ConfigProperties.joinPrefix); - ConfigProperties.logicDelType = prop.getOrDefault("logicDelType", ConfigProperties.logicDelType, val -> + Prop prop = new Prop(context.cfg().getProp("mybatis-plus-join")); + ConfigProperties.banner = prop.get("banner", Boolean::parseBoolean); + ConfigProperties.subTableLogic = prop.get("subTableLogic", Boolean::parseBoolean); + ConfigProperties.msCache = prop.get("msCache", Boolean::parseBoolean); + ConfigProperties.tableAlias = prop.get("tableAlias", Function.identity()); + ConfigProperties.joinPrefix = prop.get("joinPrefix", Function.identity()); + ConfigProperties.logicDelType = prop.get("logicDelType", val -> Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误"))); - ConfigProperties.mappingMaxCount = prop.getInt("mappingMaxCount", ConfigProperties.mappingMaxCount); - ConfigProperties.ifAbsent = prop.getOrDefault("ifAbsent", ConfigProperties.ifAbsent, val -> + ConfigProperties.mappingMaxCount = prop.get("mappingMaxCount", Integer::parseInt); + ConfigProperties.ifAbsent = prop.get("ifAbsent", val -> Arrays.stream(IfAbsentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() - .map(m -> (BiPredicate) (o, ifAbsentSqlKeyWordEnum) -> m.test(o)) + .map(m -> (BiPredicate) (o, enums) -> m.test(o)) .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifAbsent 配置错误"))); // 后续操作 context.onEvent(AppLoadEndEvent.class, e -> { @@ -71,4 +71,26 @@ public class XPluginImpl implements Plugin { MappingConfig.init(); }); } + + private static class Prop { + + private final Properties props; + + public Prop(Props props) { + this.props = new Properties(); + props.forEach((k, v) -> this.props.put(k.toString() + .replaceAll("[-_]", "").toUpperCase(Locale.ENGLISH), v)); + } + + @SuppressWarnings("unchecked") + public T get(String key, Function convert) { + try { + return Optional.ofNullable(this.props.get(key.toUpperCase(Locale.ENGLISH))) + .map(v -> convert.apply(v.toString())) + .orElse((T) ConfigProperties.class.getDeclaredField(key).get(null)); + } catch (IllegalAccessException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + } } \ No newline at end of file From 8a347e4a23ff9657c736cf2a306b5d8e44d46e06 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 5 Jan 2024 11:57:07 +0800 Subject: [PATCH 55/88] ifPresent --- .../MybatisPlusJoinAutoConfiguration.java | 12 +- .../MybatisPlusJoinProperties.java | 6 +- .../MybatisPlusJoinIfAbsentConsumer.java | 14 -- .../MybatisPlusJoinIfPresentConsumer.java | 14 ++ ...itional-spring-configuration-metadata.json | 8 +- .../yulichang/config/ConfigProperties.java | 8 +- .../{IfAbsentEnum.java => IfPresentEnum.java} | 4 +- .../yulichang/kt/KtAbstractWrapper.java | 24 +-- .../kt/interfaces/CompareIfAbsent.java | 115 ------------- .../kt/interfaces/CompareIfPresent.java | 115 +++++++++++++ .../query/MPJLambdaQueryWrapper.java | 26 +-- .../yulichang/query/MPJQueryWrapper.java | 26 +-- .../query/interfaces/CompareIfAbsent.java | 151 ------------------ .../query/interfaces/CompareIfPresent.java | 151 ++++++++++++++++++ .../wrapper/JoinAbstractWrapper.java | 26 +-- .../yulichang/wrapper/MPJLambdaWrapper.java | 12 +- ...Enum.java => IfPresentSqlKeyWordEnum.java} | 2 +- .../wrapper/interfaces/CompareIfAbsent.java | 114 ------------- .../wrapper/interfaces/CompareIfPresent.java | 114 +++++++++++++ .../interfaces/CompareStrIfAbsent.java | 65 -------- .../interfaces/CompareStrIfPresent.java | 65 ++++++++ .../solon/plugin/XPluginImpl.java | 12 +- .../test/join/m/CustomWrapperTest.java | 7 +- .../{IfAbsentTest.java => IfPresentTest.java} | 72 ++++----- .../github/yulichang/test/kt/entity/UserDO.kt | 3 + .../yulichang/test/kt/LambdaWrapperTest.kt | 4 +- .../yulichang/test/kt/m/CustomWrapperTest.kt | 14 +- .../src/main/resources/application.yml | 3 +- 28 files changed, 596 insertions(+), 591 deletions(-) delete mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java rename mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/{IfAbsentEnum.java => IfPresentEnum.java} (89%) delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java rename mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/{IfAbsentSqlKeyWordEnum.java => IfPresentSqlKeyWordEnum.java} (87%) delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java rename mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/{IfAbsentTest.java => IfPresentTest.java} (53%) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 0a51a03..66bf5c0 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -3,7 +3,7 @@ package com.github.yulichang.autoconfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.github.yulichang.autoconfigure.conditional.JoinSqlInjectorCondition; -import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfAbsentConsumer; +import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfPresentConsumer; import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinPropertiesConsumer; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; @@ -11,7 +11,7 @@ import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; import com.github.yulichang.toolkit.SpringContentUtils; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; @@ -63,7 +63,7 @@ public class MybatisPlusJoinAutoConfiguration { public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, ObjectProvider propertiesConsumers, - ObjectProvider ifAbsentConsumers) { + ObjectProvider ifPresentConsumers) { this.properties = Optional.ofNullable(propertiesConsumers.getIfAvailable()).map(c -> c.config(properties)).orElse(properties); ConfigProperties.banner = this.properties.getBanner(); ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); @@ -72,9 +72,9 @@ public class MybatisPlusJoinAutoConfiguration { ConfigProperties.joinPrefix = this.properties.getJoinPrefix(); ConfigProperties.logicDelType = this.properties.getLogicDelType(); ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); - ConfigProperties.ifAbsent = Optional.ofNullable(ifAbsentConsumers.getIfAvailable()) - .map(m -> (BiPredicate) m) - .orElse((val, key) -> this.properties.getIfAbsent().test(val)); + ConfigProperties.ifPresent = Optional.ofNullable(ifPresentConsumers.getIfAvailable()) + .map(m -> (BiPredicate) m) + .orElse((val, key) -> this.properties.getIfPresent().test(val)); info("mybatis plus join properties config complete"); } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java index e30fe5a..5948c63 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java @@ -1,6 +1,6 @@ package com.github.yulichang.autoconfigure; -import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.IfPresentEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; import lombok.Data; import lombok.experimental.Accessors; @@ -58,7 +58,7 @@ public class MybatisPlusJoinProperties { private String subQueryAlias = "st"; /** - * Wrapper ifAbsent 判断策略 + * Wrapper ifPresent 判断策略 *

* NOT_NULL 非null *

@@ -66,5 +66,5 @@ public class MybatisPlusJoinProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - private IfAbsentEnum ifAbsent = IfAbsentEnum.NOT_EMPTY; + private IfPresentEnum ifPresent = IfPresentEnum.NOT_EMPTY; } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java deleted file mode 100644 index 3e2287c..0000000 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfAbsentConsumer.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.yulichang.autoconfigure.consumer; - -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * 自定义IfAbsent策略 - * - * @author yulichang - * @since 1.4.9 - */ -public interface MybatisPlusJoinIfAbsentConsumer extends BiPredicate { -} diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java new file mode 100644 index 0000000..d5c4fe2 --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java @@ -0,0 +1,14 @@ +package com.github.yulichang.autoconfigure.consumer; + +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * 自定义IfPresent策略 + * + * @author yulichang + * @since 1.4.9 + */ +public interface MybatisPlusJoinIfPresentConsumer extends BiPredicate { +} diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index df4fbf5..b5e4f71 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -57,10 +57,10 @@ "description": "子查询表别名." }, { - "name": "mybatis-plus-join.if-absent", - "defaultValue": "com.github.yulichang.config.enums.IfAbsentEnum.NOT_EMPTY", - "type": "com.github.yulichang.config.enums.IfAbsentEnum", - "description": "IfAbsent方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfAbsent." + "name": "mybatis-plus-join.if-present", + "defaultValue": "com.github.yulichang.config.enums.IfPresentEnum.NOT_EMPTY", + "type": "com.github.yulichang.config.enums.IfPresentEnum", + "description": "IfPresent方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfPresentConsumer." } ] } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index 64b2a9a..d2e07ba 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -2,9 +2,9 @@ package com.github.yulichang.config; import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.adapter.base.ITableInfoAdapter; -import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.IfPresentEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import java.util.function.BiPredicate; @@ -51,7 +51,7 @@ public class ConfigProperties { */ public static String subQueryAlias = "st"; /** - * Wrapper ifAbsent 判断策略 + * Wrapper ifPresent 判断策略 *

* NOT_NULL 非null *

@@ -59,5 +59,5 @@ public class ConfigProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - public static BiPredicate ifAbsent = (val, key) -> IfAbsentEnum.NOT_EMPTY.test(val); + public static BiPredicate ifPresent = (val, key) -> IfPresentEnum.NOT_EMPTY.test(val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java similarity index 89% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java index 717567e..913aa74 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfAbsentEnum.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java @@ -11,7 +11,7 @@ import java.util.function.Predicate; * @author yulichang * @since 1.4.9 */ -public enum IfAbsentEnum implements Predicate { +public enum IfPresentEnum implements Predicate { /** * 非null @@ -28,7 +28,7 @@ public enum IfAbsentEnum implements Predicate { private final Predicate predicate; - IfAbsentEnum(Predicate predicate) { + IfPresentEnum(Predicate predicate) { this.predicate = predicate; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index ca03000..ed11efd 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.kt.interfaces.CompareIfAbsent; +import com.github.yulichang.kt.interfaces.CompareIfPresent; import com.github.yulichang.kt.interfaces.Func; import com.github.yulichang.kt.interfaces.OnCompare; import com.github.yulichang.toolkit.KtUtils; @@ -20,9 +20,9 @@ import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; -import com.github.yulichang.wrapper.interfaces.CompareStrIfAbsent; +import com.github.yulichang.wrapper.interfaces.CompareStrIfPresent; import com.github.yulichang.wrapper.interfaces.FuncStr; import com.github.yulichang.wrapper.interfaces.Join; import kotlin.reflect.KProperty; @@ -47,8 +47,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unused", "unchecked", "DuplicatedCode"}) public abstract class KtAbstractWrapper> extends Wrapper - implements CompareIfAbsent, Nested, Join, Func, OnCompare, - CompareStrIfAbsent, FuncStr { + implements CompareIfPresent, Nested, Join, Func, OnCompare, + CompareStrIfPresent, FuncStr { /** * 占位符 @@ -125,10 +125,10 @@ public abstract class KtAbstractWrapper ifAbsent = ConfigProperties.ifAbsent; + protected BiPredicate ifPresent = ConfigProperties.ifPresent; @Override public T getEntity() { @@ -181,13 +181,13 @@ public abstract class KtAbstractWrapper ifAbsent) { - this.ifAbsent = ifAbsent; + public Children setIfPresent(BiPredicate ifPresent) { + this.ifPresent = ifPresent; return typedThis; } - public Children setIfAbsent(Predicate ifAbsent) { - this.ifAbsent = (o, k) -> ifAbsent.test(o); + public Children setIfPresent(Predicate ifPresent) { + this.ifPresent = (o, k) -> ifPresent.test(o); return typedThis; } @@ -659,7 +659,7 @@ public abstract class KtAbstractWrapper extends Compare { - - BiPredicate getIfAbsent(); - - default Children eqIfAbsent(KProperty column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), null, column, val); - } - - default Children eqIfAbsent(String alias, KProperty column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), alias, column, val); - } - - default Children neIfAbsent(KProperty column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), null, column, val); - } - - default Children neIfAbsent(String alias, KProperty column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), alias, column, val); - } - - default Children gtIfAbsent(KProperty column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), null, column, val); - } - - default Children gtIfAbsent(String alias, KProperty column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), alias, column, val); - } - - - default Children geIfAbsent(KProperty column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), null, column, val); - } - - default Children geIfAbsent(String alias, KProperty column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), alias, column, val); - } - - default Children ltIfAbsent(KProperty column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), null, column, val); - } - - default Children ltIfAbsent(String alias, KProperty column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), alias, column, val); - } - - default Children leIfAbsent(KProperty column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), null, column, val); - } - - default Children leIfAbsent(String alias, KProperty column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), alias, column, val); - } - - default Children likeIfAbsent(KProperty column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), null, column, val); - } - - default Children likeIfAbsent(String alisa, KProperty column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), alisa, column, val); - } - - default Children notLikeIfAbsent(KProperty column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), null, column, val); - } - - default Children notLikeIfAbsent(String alias, KProperty column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), alias, column, val); - } - - default Children likeLeftIfAbsent(KProperty column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), null, column, val); - } - - default Children likeLeftIfAbsent(String alias, KProperty column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); - } - - default Children notLikeLeftIfAbsent(KProperty column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); - } - - default Children notLikeLeftIfAbsent(String alias, KProperty column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); - } - - default Children likeRightIfAbsent(KProperty column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); - } - - default Children likeRightIfAbsent(String alias, KProperty column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); - } - - default Children notLikeRightIfAbsent(KProperty column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); - } - - default Children notLikeRightIfAbsent(String alias, KProperty column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java new file mode 100644 index 0000000..ab1a0a6 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java @@ -0,0 +1,115 @@ +package com.github.yulichang.kt.interfaces; + +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import kotlin.reflect.KProperty; + +import java.util.function.BiPredicate; + +/** + * ifPresent + * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareIfPresent extends Compare { + + BiPredicate getIfPresent(); + + default Children eqIfPresent(KProperty column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), null, column, val); + } + + default Children eqIfPresent(String alias, KProperty column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), alias, column, val); + } + + default Children neIfPresent(KProperty column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), null, column, val); + } + + default Children neIfPresent(String alias, KProperty column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), alias, column, val); + } + + default Children gtIfPresent(KProperty column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), null, column, val); + } + + default Children gtIfPresent(String alias, KProperty column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), alias, column, val); + } + + + default Children geIfPresent(KProperty column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), null, column, val); + } + + default Children geIfPresent(String alias, KProperty column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), alias, column, val); + } + + default Children ltIfPresent(KProperty column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), null, column, val); + } + + default Children ltIfPresent(String alias, KProperty column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), alias, column, val); + } + + default Children leIfPresent(KProperty column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), null, column, val); + } + + default Children leIfPresent(String alias, KProperty column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), alias, column, val); + } + + default Children likeIfPresent(KProperty column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), null, column, val); + } + + default Children likeIfPresent(String alisa, KProperty column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), alisa, column, val); + } + + default Children notLikeIfPresent(KProperty column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), null, column, val); + } + + default Children notLikeIfPresent(String alias, KProperty column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), alias, column, val); + } + + default Children likeLeftIfPresent(KProperty column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), null, column, val); + } + + default Children likeLeftIfPresent(String alias, KProperty column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); + } + + default Children notLikeLeftIfPresent(KProperty column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfPresent(String alias, KProperty column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + + default Children likeRightIfPresent(KProperty column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); + } + + default Children likeRightIfPresent(String alias, KProperty column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); + } + + default Children notLikeRightIfPresent(KProperty column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfPresent(String alias, KProperty column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index ac13e59..97f880d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -9,12 +9,12 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.query.interfaces.CompareIfAbsent; +import com.github.yulichang.query.interfaces.CompareIfPresent; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.ThrowOptional; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import lombok.Getter; import java.io.UnsupportedEncodingException; @@ -36,7 +36,7 @@ import java.util.stream.Collectors; @SuppressWarnings("unused") public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper> implements Query, T, SFunction>, StringJoin, T>, - CompareIfAbsent, SFunction> { + CompareIfPresent, SFunction> { /** * 查询字段 @@ -78,7 +78,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper tableNameFunc; @Getter - private BiPredicate ifAbsent = ConfigProperties.ifAbsent; + private BiPredicate ifPresent = ConfigProperties.ifPresent; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -94,7 +94,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, List selectColumns, List ignoreColumns, boolean selectDistinct, - BiPredicate ifAbsent) { + BiPredicate ifPresent) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -108,7 +108,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractLambdaWrapper stringQuery() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, - selectDistinct, ifAbsent); + selectDistinct, ifPresent); } @Override @@ -337,13 +337,13 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper setIfAbsent(BiPredicate ifAbsent) { - this.ifAbsent = ifAbsent; + public MPJLambdaQueryWrapper setIfPresent(BiPredicate ifPresent) { + this.ifPresent = ifPresent; return typedThis; } - public MPJLambdaQueryWrapper setIfAbsent(Predicate ifAbsent) { - this.ifAbsent = (o, k) -> ifAbsent.test(o); + public MPJLambdaQueryWrapper setIfPresent(Predicate ifPresent) { + this.ifPresent = (o, k) -> ifPresent.test(o); return typedThis; } @@ -355,7 +355,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper instance() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - null, null, selectDistinct, ifAbsent); + null, null, selectDistinct, ifPresent); } @Override @@ -391,7 +391,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractWrapper> implements Query, T, String>, StringJoin, T>, Chain, - CompareIfAbsent, String> { + CompareIfPresent, String> { /** * 查询字段 @@ -91,7 +91,7 @@ public class MPJQueryWrapper extends AbstractWrapper ifAbsent = ConfigProperties.ifAbsent; + private BiPredicate ifPresent = ConfigProperties.ifPresent; public MPJQueryWrapper() { @@ -124,7 +124,7 @@ public class MPJQueryWrapper extends AbstractWrapper selectColumns, List ignoreColumns, boolean selectDistinct, - BiPredicate ifAbsent) { + BiPredicate ifPresent) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -138,7 +138,7 @@ public class MPJQueryWrapper extends AbstractWrapper extends AbstractWrapper setIfAbsent(BiPredicate ifAbsent) { - this.ifAbsent = ifAbsent; + public MPJQueryWrapper setIfPresent(BiPredicate ifPresent) { + this.ifPresent = ifPresent; return this; } - public MPJQueryWrapper setIfAbsent(Predicate ifAbsent) { - this.ifAbsent = (o, k) -> ifAbsent.test(o); + public MPJQueryWrapper setIfPresent(Predicate ifPresent) { + this.ifPresent = (o, k) -> ifPresent.test(o); return this; } @@ -354,7 +354,7 @@ public class MPJQueryWrapper extends AbstractWrapper lambda() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs, - expression, lastSql, sqlComment, getSqlFirstField(), selectColumns, ignoreColumns, selectDistinct, ifAbsent); + expression, lastSql, sqlComment, getSqlFirstField(), selectColumns, ignoreColumns, selectDistinct, ifPresent); } @Override @@ -391,7 +391,7 @@ public class MPJQueryWrapper extends AbstractWrapper instance() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(), null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - null, null, selectDistinct, ifAbsent); + null, null, selectDistinct, ifPresent); } @@ -402,7 +402,7 @@ public class MPJQueryWrapper extends AbstractWrapper比较值

- * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareIfAbsent extends Compare { - - BiPredicate getIfAbsent(); - - /** - * 等于 = - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children eqIfAbsent(R column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), column, val); - } - - /** - * 不等于 <> - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children neIfAbsent(R column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), column, val); - } - - /** - * 大于 > - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children gtIfAbsent(R column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), column, val); - } - - /** - * 大于等于 >= - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children geIfAbsent(R column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), column, val); - } - - /** - * 小于 < - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children ltIfAbsent(R column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), column, val); - } - - /** - * 小于等于 <= - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children leIfAbsent(R column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), column, val); - } - - /** - * LIKE '%值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeIfAbsent(R column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), column, val); - } - - /** - * NOT LIKE '%值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeIfAbsent(R column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), column, val); - } - - /** - * NOT LIKE '%值' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeLeftIfAbsent(R column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); - } - - /** - * NOT LIKE '值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeRightIfAbsent(R column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); - } - - /** - * LIKE '%值' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeLeftIfAbsent(R column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), column, val); - } - - /** - * LIKE '值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeRightIfAbsent(R column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java new file mode 100644 index 0000000..06b9066 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java @@ -0,0 +1,151 @@ +package com.github.yulichang.query.interfaces; + +import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * 查询条件封装 + *

比较值

+ * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareIfPresent extends Compare { + + BiPredicate getIfPresent(); + + /** + * 等于 = + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children eqIfPresent(R column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), column, val); + } + + /** + * 不等于 <> + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children neIfPresent(R column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), column, val); + } + + /** + * 大于 > + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children gtIfPresent(R column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), column, val); + } + + /** + * 大于等于 >= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children geIfPresent(R column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), column, val); + } + + /** + * 小于 < + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children ltIfPresent(R column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), column, val); + } + + /** + * 小于等于 <= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children leIfPresent(R column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), column, val); + } + + /** + * LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeIfPresent(R column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), column, val); + } + + /** + * NOT LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeIfPresent(R column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), column, val); + } + + /** + * NOT LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeLeftIfPresent(R column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); + } + + /** + * NOT LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeRightIfPresent(R column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); + } + + /** + * LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeLeftIfPresent(R column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), column, val); + } + + /** + * LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeRightIfPresent(R column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java index 7e97c4d..785c690 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java @@ -18,7 +18,7 @@ import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; import com.github.yulichang.wrapper.interfaces.*; import lombok.Getter; @@ -42,8 +42,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unchecked", "unused", "DuplicatedCode"}) public abstract class JoinAbstractWrapper> extends Wrapper - implements CompareIfAbsent, Nested, Join, Func, OnCompare, - CompareStrIfAbsent, FuncStr { + implements CompareIfPresent, Nested, Join, Func, OnCompare, + CompareStrIfPresent, FuncStr { /** * 占位符 @@ -120,10 +120,10 @@ public abstract class JoinAbstractWrapper ifAbsent = ConfigProperties.ifAbsent; + protected BiPredicate ifPresent = ConfigProperties.ifPresent; @Override public T getEntity() { @@ -176,20 +176,20 @@ public abstract class JoinAbstractWrapper ifAbsent) { - this.ifAbsent = ifAbsent; + public Children setIfPresent(BiPredicate ifPresent) { + this.ifPresent = ifPresent; return typedThis; } /** - * 设置 ifAbsent - * .setIfAbsent(val -> val != null && StringUtils.isNotBlank(val)) + * 设置 ifPresent + * .ifPresent(val -> val != null && StringUtils.isNotBlank(val)) * - * @param ifAbsent 判断 + * @param ifPresent 判断 * @return Children */ - public Children setIfAbsent(Predicate ifAbsent) { - this.ifAbsent = (obj, key) -> ifAbsent.test(obj); + public Children setIfPresent(Predicate ifPresent) { + this.ifPresent = (obj, key) -> ifPresent.test(obj); return typedThis; } @@ -773,7 +773,7 @@ public abstract class JoinAbstractWrapper extends JoinAbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, TableList tableList, Integer index, String keyWord, Class joinClass, String tableName, - BiPredicate ifAbsent) { + BiPredicate ifPresent) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -142,7 +142,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper extends JoinAbstractLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null, ifAbsent) { + new TableList(), null, null, null, null, ifPresent) { }; wrapper.tableList.setAlias(st); wrapper.tableList.setRootClass(clazz); @@ -406,7 +406,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - this.tableList, index, keyWord, joinClass, tableName, ifAbsent); + this.tableList, index, keyWord, joinClass, tableName, ifPresent); } @Override @@ -419,6 +419,6 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper extends Compare { - - BiPredicate getIfAbsent(); - - default Children eqIfAbsent(SFunction column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), null, column, val); - } - - default Children eqIfAbsent(String alias, SFunction column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), alias, column, val); - } - - default Children neIfAbsent(SFunction column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), null, column, val); - } - - default Children neIfAbsent(String alias, SFunction column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), alias, column, val); - } - - default Children gtIfAbsent(SFunction column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), null, column, val); - } - - default Children gtIfAbsent(String alias, SFunction column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), alias, column, val); - } - - default Children geIfAbsent(SFunction column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), null, column, val); - } - - default Children geIfAbsent(String alias, SFunction column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), alias, column, val); - } - - default Children ltIfAbsent(SFunction column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), null, column, val); - } - - default Children ltIfAbsent(String alias, SFunction column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), alias, column, val); - } - - default Children leIfAbsent(SFunction column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), null, column, val); - } - - default Children leIfAbsent(String alias, SFunction column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), alias, column, val); - } - - default Children likeIfAbsent(SFunction column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), null, column, val); - } - - default Children likeIfAbsent(String alias, SFunction column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), alias, column, val); - } - - default Children notLikeIfAbsent(SFunction column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), null, column, val); - } - - default Children notLikeIfAbsent(String alias, SFunction column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), alias, column, val); - } - - default Children likeLeftIfAbsent(SFunction column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), null, column, val); - } - - default Children likeLeftIfAbsent(String alias, SFunction column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); - } - - default Children notLikeLeftIfAbsent(SFunction column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); - } - - default Children notLikeLeftIfAbsent(String alias, SFunction column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); - } - - default Children likeRightIfAbsent(SFunction column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); - } - - default Children likeRightIfAbsent(String alias, SFunction column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); - } - - default Children notLikeRightIfAbsent(SFunction column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); - } - - default Children notLikeRightIfAbsent(String alias, SFunction column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java new file mode 100644 index 0000000..28c493f --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java @@ -0,0 +1,114 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareIfPresent extends Compare { + + BiPredicate getIfPresent(); + + default Children eqIfPresent(SFunction column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), null, column, val); + } + + default Children eqIfPresent(String alias, SFunction column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), alias, column, val); + } + + default Children neIfPresent(SFunction column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), null, column, val); + } + + default Children neIfPresent(String alias, SFunction column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), alias, column, val); + } + + default Children gtIfPresent(SFunction column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), null, column, val); + } + + default Children gtIfPresent(String alias, SFunction column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), alias, column, val); + } + + default Children geIfPresent(SFunction column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), null, column, val); + } + + default Children geIfPresent(String alias, SFunction column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), alias, column, val); + } + + default Children ltIfPresent(SFunction column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), null, column, val); + } + + default Children ltIfPresent(String alias, SFunction column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), alias, column, val); + } + + default Children leIfPresent(SFunction column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), null, column, val); + } + + default Children leIfPresent(String alias, SFunction column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), alias, column, val); + } + + default Children likeIfPresent(SFunction column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), null, column, val); + } + + default Children likeIfPresent(String alias, SFunction column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), alias, column, val); + } + + default Children notLikeIfPresent(SFunction column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), null, column, val); + } + + default Children notLikeIfPresent(String alias, SFunction column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), alias, column, val); + } + + default Children likeLeftIfPresent(SFunction column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), null, column, val); + } + + default Children likeLeftIfPresent(String alias, SFunction column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); + } + + default Children notLikeLeftIfPresent(SFunction column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfPresent(String alias, SFunction column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + + default Children likeRightIfPresent(SFunction column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); + } + + default Children likeRightIfPresent(String alias, SFunction column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); + } + + default Children notLikeRightIfPresent(SFunction column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfPresent(String alias, SFunction column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java deleted file mode 100644 index a58520d..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfAbsent.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.github.yulichang.wrapper.interfaces; - -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} - * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareStrIfAbsent extends CompareStr { - - BiPredicate getIfAbsent(); - - default Children eqIfAbsent(R column, Object val) { - return eq(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.EQ), column, val); - } - - default Children neIfAbsent(R column, Object val) { - return ne(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NE), column, val); - } - - default Children gtIfAbsent(R column, Object val) { - return gt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GT), column, val); - } - - default Children geIfAbsent(R column, Object val) { - return ge(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.GE), column, val); - } - - default Children ltIfAbsent(R column, Object val) { - return lt(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LT), column, val); - } - - default Children leIfAbsent(R column, Object val) { - return le(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LE), column, val); - } - - default Children likeIfAbsent(R column, Object val) { - return like(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE), column, val); - } - - default Children notLikeIfAbsent(R column, Object val) { - return notLike(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE), column, val); - } - - default Children likeLeftIfAbsent(R column, Object val) { - return likeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_LEFT), column, val); - } - - default Children likeRightIfAbsent(R column, Object val) { - return likeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.LIKE_RIGHT), column, val); - } - - default Children notLikeLeftIfAbsent(R column, Object val) { - return notLikeLeft(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); - } - - default Children notLikeRightIfAbsent(R column, Object val) { - return notLikeRight(getIfAbsent().test(val, IfAbsentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java new file mode 100644 index 0000000..04b77fd --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java @@ -0,0 +1,65 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareStrIfPresent extends CompareStr { + + BiPredicate getIfPresent(); + + default Children eqIfPresent(R column, Object val) { + return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), column, val); + } + + default Children neIfPresent(R column, Object val) { + return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), column, val); + } + + default Children gtIfPresent(R column, Object val) { + return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), column, val); + } + + default Children geIfPresent(R column, Object val) { + return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), column, val); + } + + default Children ltIfPresent(R column, Object val) { + return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), column, val); + } + + default Children leIfPresent(R column, Object val) { + return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), column, val); + } + + default Children likeIfPresent(R column, Object val) { + return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), column, val); + } + + default Children notLikeIfPresent(R column, Object val) { + return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), column, val); + } + + default Children likeLeftIfPresent(R column, Object val) { + return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), column, val); + } + + default Children likeRightIfPresent(R column, Object val) { + return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), column, val); + } + + default Children notLikeLeftIfPresent(R column, Object val) { + return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); + } + + default Children notLikeRightIfPresent(R column, Object val) { + return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); + } +} diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index d6fad17..655dbc9 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -3,13 +3,13 @@ package com.github.yulichang.mybatisplusjoin.solon.plugin; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; -import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.IfPresentEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.toolkit.SpringContentUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; -import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.solon.MybatisAdapter; import org.apache.ibatis.solon.integration.MybatisAdapterManager; @@ -59,10 +59,10 @@ public class XPluginImpl implements Plugin { Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误"))); ConfigProperties.mappingMaxCount = prop.get("mappingMaxCount", Integer::parseInt); - ConfigProperties.ifAbsent = prop.get("ifAbsent", val -> - Arrays.stream(IfAbsentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() - .map(m -> (BiPredicate) (o, enums) -> m.test(o)) - .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifAbsent 配置错误"))); + ConfigProperties.ifPresent = prop.get("ifPresent", val -> + Arrays.stream(IfPresentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .map(m -> (BiPredicate) (o, enums) -> m.test(o)) + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifPresent 配置错误"))); // 后续操作 context.onEvent(AppLoadEndEvent.class, e -> { List sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream() diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java index 7808b7f..d2114db 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/CustomWrapperTest.java @@ -34,7 +34,8 @@ public class CustomWrapperTest { return null; } - public CWrapper eqIfAbsent(SFunction column, Object val) { + @Override + public CWrapper eqIfPresent(SFunction column, Object val) { super.eq(Objects.nonNull(val), column, val); return this; } @@ -47,7 +48,7 @@ public class CustomWrapperTest { .selectAll(UserDO.class) // .toChildren(new Ref>()) .toChildren(CWrapper::toCWrapper) - .eqIfAbsent(UserDO::getId, 1); + .eqIfPresent(UserDO::getId, 1); List dos = userMapper.selectList(wrapper); dos.forEach(System.out::println); @@ -56,7 +57,7 @@ public class CustomWrapperTest { .selectAll(UserDO.class) .toChildren(new Ref>()) // .toChildren(CWrapper::toCWrapper) - .eqIfAbsent(UserDO::getId, null); + .eqIfPresent(UserDO::getId, null); List dos1 = userMapper.selectList(wrapper1); dos1.forEach(System.out::println); } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfPresentTest.java similarity index 53% rename from mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java rename to mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfPresentTest.java index f12eedd..5101c39 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfAbsentTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/IfPresentTest.java @@ -1,6 +1,6 @@ package com.github.yulichang.test.join.m; -import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.IfPresentEnum; import com.github.yulichang.test.join.entity.UserDO; import com.github.yulichang.test.util.Reset; import com.github.yulichang.test.util.ThreadLocalUtils; @@ -13,7 +13,7 @@ import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest -public class IfAbsentTest { +public class IfPresentTest { @BeforeEach void setUp() { @@ -21,35 +21,35 @@ public class IfAbsentTest { } @Test - void ifAbsent() { - assert IfAbsentEnum.NOT_EMPTY.test("\t"); - assert !IfAbsentEnum.NOT_EMPTY.test(""); - assert IfAbsentEnum.NOT_EMPTY.test(" "); - assert IfAbsentEnum.NOT_EMPTY.test("\r"); - assert IfAbsentEnum.NOT_EMPTY.test("a"); - assert IfAbsentEnum.NOT_EMPTY.test(1); - assert IfAbsentEnum.NOT_EMPTY.test(true); - assert IfAbsentEnum.NOT_EMPTY.test('A'); + void ifPresent() { + assert IfPresentEnum.NOT_EMPTY.test("\t"); + assert !IfPresentEnum.NOT_EMPTY.test(""); + assert IfPresentEnum.NOT_EMPTY.test(" "); + assert IfPresentEnum.NOT_EMPTY.test("\r"); + assert IfPresentEnum.NOT_EMPTY.test("a"); + assert IfPresentEnum.NOT_EMPTY.test(1); + assert IfPresentEnum.NOT_EMPTY.test(true); + assert IfPresentEnum.NOT_EMPTY.test('A'); - assert !IfAbsentEnum.NOT_BLANK.test("\t"); - assert !IfAbsentEnum.NOT_BLANK.test(""); - assert !IfAbsentEnum.NOT_BLANK.test(" "); - assert !IfAbsentEnum.NOT_BLANK.test("\r"); - assert IfAbsentEnum.NOT_BLANK.test("a"); - assert IfAbsentEnum.NOT_EMPTY.test(1); - assert IfAbsentEnum.NOT_EMPTY.test(true); - assert IfAbsentEnum.NOT_EMPTY.test('A'); + assert !IfPresentEnum.NOT_BLANK.test("\t"); + assert !IfPresentEnum.NOT_BLANK.test(""); + assert !IfPresentEnum.NOT_BLANK.test(" "); + assert !IfPresentEnum.NOT_BLANK.test("\r"); + assert IfPresentEnum.NOT_BLANK.test("a"); + assert IfPresentEnum.NOT_EMPTY.test(1); + assert IfPresentEnum.NOT_EMPTY.test(true); + assert IfPresentEnum.NOT_EMPTY.test('A'); ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, " + "t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " + "WHERE t.del = false AND (t.id = ? AND t.head_img = ? AND t.`name` = ?)"); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) - .eqIfAbsent(UserDO::getId, 1) - .eqIfAbsent(UserDO::getPid, null) - .eqIfAbsent(UserDO::getAddressId, "") - .eqIfAbsent(UserDO::getImg, "\t") - .eqIfAbsent(UserDO::getName, "张三 1"); + .eqIfPresent(UserDO::getId, 1) + .eqIfPresent(UserDO::getPid, null) + .eqIfPresent(UserDO::getAddressId, "") + .eqIfPresent(UserDO::getImg, "\t") + .eqIfPresent(UserDO::getName, "张三 1"); List list = wrapper.list(); list.forEach(System.out::println); @@ -58,12 +58,12 @@ public class IfAbsentTest { "WHERE t.del = false AND (t.id = ? AND t.`name` = ?)"); MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) - .setIfAbsent(IfAbsentEnum.NOT_BLANK) - .eqIfAbsent(UserDO::getId, 1) - .eqIfAbsent(UserDO::getPid, null) - .eqIfAbsent(UserDO::getAddressId, "") - .eqIfAbsent(UserDO::getImg, "\t") - .eqIfAbsent(UserDO::getName, "张三 1"); + .setIfPresent(IfPresentEnum.NOT_BLANK) + .eqIfPresent(UserDO::getId, 1) + .eqIfPresent(UserDO::getPid, null) + .eqIfPresent(UserDO::getAddressId, "") + .eqIfPresent(UserDO::getImg, "\t") + .eqIfPresent(UserDO::getName, "张三 1"); List list1 = wrapper1.list(); list1.forEach(System.out::println); @@ -72,12 +72,12 @@ public class IfAbsentTest { "WHERE t.del = false AND (t.id = ? AND t.pid = ? AND t.`name` = ? AND t.head_img = ? AND t.`name` = ?)"); MPJLambdaWrapper wrapper2 = JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) - .setIfAbsent(o -> true) - .eqIfAbsent(UserDO::getId, 1) - .eqIfAbsent(UserDO::getPid, null) - .eqIfAbsent(UserDO::getName, "") - .eqIfAbsent(UserDO::getImg, "\t") - .eqIfAbsent(UserDO::getName, "张三 1"); + .setIfPresent(o -> true) + .eqIfPresent(UserDO::getId, 1) + .eqIfPresent(UserDO::getPid, null) + .eqIfPresent(UserDO::getName, "") + .eqIfPresent(UserDO::getImg, "\t") + .eqIfPresent(UserDO::getName, "张三 1"); List list2 = wrapper2.list(); list2.forEach(System.out::println); } diff --git a/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt index c2860e6..73f428c 100644 --- a/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt +++ b/mybatis-plus-join-test/test-kotlin/src/main/java/com/github/yulichang/test/kt/entity/UserDO.kt @@ -52,4 +52,7 @@ open class UserDO : ID(), Serializable { @TableField(exist = false) var addressList2: List? = null + override fun toString(): String { + return "UserDO(pid=$pid, name=$name, json=$json, sex=$sex, img=$img, createTime=$createTime, addressId=$addressId, addressId2=$addressId2, del=$del, createBy=$createBy, createName=$createName, updateBy=$updateBy, updateName=$updateName, alias=$alias, children=$children, addressList=$addressList, addressList2=$addressList2)" + } } diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt index 1be531a..ecb9835 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/LambdaWrapperTest.kt @@ -734,7 +734,7 @@ class LambdaWrapperTest { assert(dos!!.size == 4) ThreadLocalUtils.set( - "SELECT id,pid,`name`,`json`,sex,head_img,create_time,address_id,address_id2,del,create_by,update_by FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?)", + "SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.id > ? AND t.id < ?)", "SELECT * FROM `user` t WHERE t.del=false AND (t.id > ? AND t.id < ?) " ) val dos1: MutableList? = userMapper.selectList( @@ -1009,7 +1009,7 @@ class LambdaWrapperTest { @Test fun joinOrder() { ThreadLocalUtils.set( - "SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", + "SELECT t.id, t.user_id, t.name FROM order_t t ORDER BY t.name DESC", "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc" ) val wrapper: KtLambdaWrapper = KtWrappers.query(OrderDO::class.java) diff --git a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt index 78c94a8..550f236 100644 --- a/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt +++ b/mybatis-plus-join-test/test-kotlin/src/test/java/com/github/yulichang/test/kt/m/CustomWrapperTest.kt @@ -26,7 +26,7 @@ class CustomWrapperTest { //自定义wrapper扩展 class CWrapper : KtLambdaWrapper() { - fun eqIfAbsent(column: KProperty<*>, `val`: Any?): CWrapper { + override fun eqIfPresent(column: KProperty<*>?, `val`: Any?): CWrapper { eq(Objects.nonNull(`val`), column, `val`) return this } @@ -42,16 +42,16 @@ class CustomWrapperTest { fun testWrapperCustomer() { ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false AND (t.id = ?)") val wrapper: CWrapper = CWrapper() - .selectAll(UserDO::class.java) - .toChildren> { CWrapper.toCWrapper() } - .eqIfAbsent(UserDO::id, 1) + .selectAll(UserDO::class.java) + .toChildren> { CWrapper.toCWrapper() } + .eqIfPresent(UserDO::id, 1) val dos = userMapper?.selectList(wrapper) dos?.forEach(System.out::println) ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t WHERE t.del = false") val wrapper1: CWrapper = CWrapper() - .selectAll(UserDO::class.java) - .toChildren(Ref>()) - .eqIfAbsent(UserDO::id, null) + .selectAll(UserDO::class.java) + .toChildren(Ref>()) + .eqIfPresent(UserDO::id, null) val dos1 = userMapper?.selectList(wrapper1) dos1?.forEach(System.out::println) } diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/src/main/resources/application.yml b/mybatis-plus-join-test/test-springboot3-jdk17/src/main/resources/application.yml index 7f43c6c..2713cd3 100644 --- a/mybatis-plus-join-test/test-springboot3-jdk17/src/main/resources/application.yml +++ b/mybatis-plus-join-test/test-springboot3-jdk17/src/main/resources/application.yml @@ -25,4 +25,5 @@ mybatis-plus: mybatis-plus-join: banner: true sub-table-logic: true - ms-cache: true \ No newline at end of file + ms-cache: true + logic-del-type: where \ No newline at end of file From fb3bf665454a77697005196c1023a8b3e2c76c0d Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Fri, 5 Jan 2024 12:37:33 +0800 Subject: [PATCH 56/88] =?UTF-8?q?=E5=8D=87=E7=BA=A7springboot=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test-springboot3-jdk17/pom.xml | 51 ++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml index fbdd336..8f66fac 100644 --- a/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml +++ b/mybatis-plus-join-test/test-springboot3-jdk17/pom.xml @@ -4,16 +4,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - mybatis-plus-join-test - com.github.yulichang - ${revision} + org.springframework.boot + spring-boot-starter-parent + 3.2.1 + 4.0.0 test-springboot3-jdk17 - 3.1.2 + 1.4.9 + 3.5.5 17 17 @@ -24,7 +26,6 @@ org.springframework.boot spring-boot-starter - ${springboot.version} org.springframework.boot @@ -35,13 +36,49 @@ org.springframework.boot spring-boot-starter-test - ${springboot.version} test + + com.h2database + h2 + 2.2.224 + runtime + + + org.projectlombok + lombok + 1.18.30 + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${revision} + + + com.fasterxml.jackson.core + jackson-databind + 2.16.1 + + + com.baomidou + mybatis-plus-boot-starter + ${mpj.mybatis.plus.version} + + + org.mybatis + mybatis-spring + + + + + org.mybatis + mybatis-spring + 3.0.3 + org.springframework spring-jdbc - 6.0.5 + 6.1.2 From 7f859b78d7020ecd4b9d6cfe92e45c20edb64e29 Mon Sep 17 00:00:00 2001 From: tuine Date: Wed, 10 Jan 2024 18:02:43 +0800 Subject: [PATCH 57/88] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E8=A1=A8=E6=98=AF=E5=90=A6=E5=B7=B2=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wrapper/JoinAbstractLambdaWrapper.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java index 0a2970d..61a7b05 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractLambdaWrapper.java @@ -368,6 +368,35 @@ public abstract class JoinAbstractLambdaWrapper Date: Mon, 15 Jan 2024 00:29:31 +0800 Subject: [PATCH 58/88] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/kt/interfaces/QueryLabel.java | 4 +- .../yulichang/query/MPJQueryWrapper.java | 2 +- .../yulichang/toolkit/JoinWrappers.java | 6 +- .../github/yulichang/toolkit/MPJWrappers.java | 4 +- .../yulichang/wrapper/interfaces/Chain.java | 81 +++++++------------ .../yulichang/wrapper/interfaces/Compare.java | 2 +- .../wrapper/interfaces/QueryLabel.java | 38 ++++----- 7 files changed, 59 insertions(+), 78 deletions(-) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryLabel.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryLabel.java index 931fd07..e450196 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryLabel.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/QueryLabel.java @@ -32,7 +32,7 @@ public interface QueryLabel { *

* 举例 UserDO AddressDO 为一对多关系 UserDTO 为结果类 *

-     *     MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper();
+     *     MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>();
      *     wrapper.selectAll(UserDO.class)
      *            .selectCollection(AddressDO.class, UserDTO::getAddressListDTO)
      *            .leftJoin(AddressDO.class, ...... )
@@ -71,7 +71,7 @@ public interface QueryLabel {
      * 

* 举例 UserDO AddressDO 为一对多关系 UserDTO 为结果类 *

-     *   MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper();
+     *   MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper();
      *   wrapper.selectAll(UserDO.class)
      *      .selectCollection(AddressDO.class, UserDTO::getAddressListDTO, map -> map
      *           .id(AddressDO::getId, AddressDTO::getId)                 //如果属性名一致 可以传一个
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
index a13cabb..a19a16f 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
 
 /**
  * copy {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
- * 推荐使用 JoinWrappers.queryJoin();构造
+ * 推荐使用 JoinWrappers.<UserDO>query();构造
  *
  * @author yulichang
  * @see com.github.yulichang.toolkit.JoinWrappers
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JoinWrappers.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JoinWrappers.java
index b2eac1e..35895ae 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JoinWrappers.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JoinWrappers.java
@@ -13,7 +13,7 @@ import com.github.yulichang.wrapper.UpdateJoinWrapper;
 public class JoinWrappers {
 
     /**
-     * JoinWrappers.query()
+     * JoinWrappers.<UserDO>query()
      */
     public static  MPJQueryWrapper query() {
         return new MPJQueryWrapper<>();
@@ -34,14 +34,14 @@ public class JoinWrappers {
     }
 
     /**
-     * JoinWrappers.lambda()
+     * JoinWrappers.<UserDO>lambda()
      */
     public static  MPJLambdaWrapper lambda() {
         return new MPJLambdaWrapper<>();
     }
 
     /**
-     * JoinWrappers.lambda("t")
+     * JoinWrappers.<UserDO>lambda("t")
      */
     public static  MPJLambdaWrapper lambda(String alias) {
         return new MPJLambdaWrapper<>(alias);
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJWrappers.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJWrappers.java
index 13abf50..ef034d8 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJWrappers.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/MPJWrappers.java
@@ -13,7 +13,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 public class MPJWrappers {
 
     /**
-     * MPJWrappers.queryJoin()
+     * MPJWrappers.<UserDO>query()
      */
     public static  MPJQueryWrapper queryJoin() {
         return new MPJQueryWrapper<>();
@@ -28,7 +28,7 @@ public class MPJWrappers {
     }
 
     /**
-     * MPJWrappers.lambdaJoin()
+     * MPJWrappers.<UserDO>lambda()
      */
     public static  MPJLambdaWrapper lambdaJoin() {
         return new MPJLambdaWrapper<>();
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Chain.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Chain.java
index 404f8ba..5c15dc4 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Chain.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Chain.java
@@ -12,11 +12,10 @@ import java.util.List;
 
 /**
  * 链式调用
- * 构造方法必须传 class 或 entity 否则会报错
- * new MPJLambdaWrapper(User.class)
- * new MPJQueryWrapper(User.class)
- * JoinWrappers.\lambdaJoin(User.class)
- * JoinWrappers.\queryJoin(User.class)
+ * 

+ * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
* * @author yulichang * @since 1.4.4 @@ -29,11 +28,9 @@ public interface Chain { /** * 链式调用 等效于MP mapper的 selectCount() *

- * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default Long count() { return SqlHelper.exec(getEntityClass(), mapper -> { @@ -45,11 +42,9 @@ public interface Chain { /** * 链式调用 等效于 selectOne *

- * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default T one() { return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectOne((Wrapper) this)); @@ -58,11 +53,9 @@ public interface Chain { /** * 链式调用 等效于 selectJoinOne *

- * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default R one(Class resultType) { return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinOne(resultType, (MPJBaseJoin) this)); @@ -71,11 +64,9 @@ public interface Chain { /** * 链式调用 查询列表第一个 匹配多个不会抛异常 *

- * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default T first() { List list = list(); @@ -85,11 +76,9 @@ public interface Chain { /** * 链式调用 查询列表第一个 匹配多个不会抛异常 *

- * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default R first(Class resultType) { List list = list(resultType); @@ -98,11 +87,9 @@ public interface Chain { /** * 链式调用 - * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default List list() { return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectList((Wrapper) this)); @@ -110,11 +97,9 @@ public interface Chain { /** * 链式调用 - * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default List list(Class resultType) { return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinList(resultType, (MPJBaseJoin) this)); @@ -122,11 +107,9 @@ public interface Chain { /** * 链式调用 - * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default

> P page(P page) { return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectPage(page, (Wrapper) this)); @@ -134,11 +117,9 @@ public interface Chain { /** * 链式调用 - * 构造方法必须传 class 或 entity 否则会报错 - * new MPJLambdaWrapper(User.class) - * new MPJQueryWrapper(User.class) - * JoinWrappers.\lambdaJoin(User.class) - * JoinWrappers.\queryJoin(User.class) + * 构造方法必须传 class 或 entity 否则会报错
+ * new MPJLambdaWrapper(User.class)
+ * JoinWrappers.lambda(User.class)
*/ default > P page(P page, Class resultType) { return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinPage(page, resultType, (MPJBaseJoin) this)); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java index d514904..a9bd165 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Compare.java @@ -29,7 +29,7 @@ public interface Compare extends Serializable { * * @param condition 执行条件 * @param params map 类型的参数, key 是字段名, value 是字段值 - * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段\ + * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段 * @return children */ Children allEq(boolean condition, Map, V> params, boolean null2IsNull); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java index 0f0d6c0..b175059 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/QueryLabel.java @@ -28,18 +28,18 @@ public interface QueryLabel { Children getChildren(); /** - * 一对多查询 调用此方法发必需要调用对应的 left join / right join ... 连表方法,否则会报错 + * 一对多查询 调用此方法必需要调用对应的 left join / right join ... 连表方法,否则会报错 *

* 举例 UserDO AddressDO 为一对多关系 UserDTO 为结果类 *

-     *     MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper();
+     *     MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>();
      *     wrapper.selectAll(UserDO.class)
      *            .selectCollection(AddressDO.class, UserDTO::getAddressListDTO)
      *            .leftJoin(AddressDO.class, ...... )
      *            .eq(...)
      *            ...
      * 
-     * 会自动将 AddressDO类中相同属性的字段 以mybatis的方式映射到UserDTO.addressListDTO属性中
+     * 会自动将 AddressDO类中相同属性的字段 以mybatis<collection>的方式映射到UserDTO.addressListDTO属性中
      *
      * @since 1.3.0
      *
@@ -50,11 +50,11 @@ public interface QueryLabel {
      * @param       包装类集合泛型
      * @param       包装类集合字段泛型
      */
-    default > Children selectCollection(Class child, SFunction dtoField) {
+    default > Children selectCollection(Class child, SFunction dtoField) {
         return selectCollection(null, child, dtoField);
     }
 
-    default > Children selectCollection(String prefix, Class child, SFunction dtoField) {
+    default > Children selectCollection(String prefix, Class child, SFunction dtoField) {
         String dtoFieldName = LambdaUtils.getName(dtoField);
         Class dtoClass = LambdaUtils.getEntityClass(dtoField);
         Map fieldMap = MPJReflectionKit.getFieldMap(dtoClass);
@@ -73,22 +73,22 @@ public interface QueryLabel {
     }
 
     /**
-     * 一对多查询 调用此方法发必需要调用对应的 left join / right join ... 连表方法,否则会报错
+     * 一对多查询 调用此方法必需要调用对应的 left join / right join ... 连表方法,否则会报错
      * 

* 举例 UserDO AddressDO 为一对多关系 UserDTO 为结果类 *

-     *   MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper();
-     *   wrapper.selectAll(UserDO.class)
+     *   MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
+     *      .selectAll(UserDO.class)
      *      .selectCollection(AddressDO.class, UserDTO::getAddressListDTO, map -> map
      *           .id(AddressDO::getId, AddressDTO::getId)                 //如果属性名一致 可以传一个
      *           .result(AddressDO::getUserId)                            //如果属性名一致 可以传一个
-     *           .result(AddressDO::getAddress, AddressDTO::getAddress))) //如果属性名一致 可以传一个
+     *           .result(AddressDO::getAddress, AddressDTO::getAddress))  //如果属性名一致 可以传一个
      *      .leftJoin(AddressDO.class, ...... )
      *      .eq(...)
      *      ...
      * 
      *
-     * 会自动将 AddressDO类中指定的字段 以mybatis的方式映射到UserDTO.addressListDTO属性中
+     * 会自动将 AddressDO类中指定的字段 以mybatis<collection>的方式映射到UserDTO.addressListDTO属性中
      *
      * @since 1.3.0
      *
@@ -100,14 +100,14 @@ public interface QueryLabel {
      * @param         包装类集合泛型
      * @param         包装类集合字段泛型
      */
-    default > Children selectCollection(Class child,
-                                                                                   SFunction dtoField,
-                                                                                   MFunc> collection) {
+    default > Children selectCollection(Class child,
+                                                                         SFunction dtoField,
+                                                                         MFunc> collection) {
         return selectCollection(null, child, dtoField, collection);
     }
 
-    default > Children selectCollection(SFunction dtoField,
-                                                                                MFunc> collection) {
+    default > Children selectCollection(SFunction dtoField,
+                                                                      MFunc> collection) {
         //自由映射必须存在泛型Z
         String dtoFieldName = LambdaUtils.getName(dtoField);
         Class dtoClass = LambdaUtils.getEntityClass(dtoField);
@@ -121,10 +121,10 @@ public interface QueryLabel {
         return getChildren();
     }
 
-    default > Children selectCollection(String prefix,
-                                                                                   Class child,
-                                                                                   SFunction dtoField,
-                                                                                   MFunc> collection) {
+    default > Children selectCollection(String prefix,
+                                                                         Class child,
+                                                                         SFunction dtoField,
+                                                                         MFunc> collection) {
         String dtoFieldName = LambdaUtils.getName(dtoField);
         Class dtoClass = LambdaUtils.getEntityClass(dtoField);
         FieldCache field = MPJReflectionKit.getFieldMap(dtoClass).get(dtoFieldName);

From 15fefbd458df4f004e2480d667ada494302747cf Mon Sep 17 00:00:00 2001
From: yulichang <570810310@qq.com>
Date: Mon, 15 Jan 2024 00:41:22 +0800
Subject: [PATCH 59/88] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=9B=B4=E6=AD=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/github/yulichang/kt/KtLambdaWrapper.java     | 8 ++++----
 .../com/github/yulichang/wrapper/MPJLambdaWrapper.java    | 6 ++++--
 .../com/github/yulichang/wrapper/UpdateJoinWrapper.java   | 1 +
 .../github/yulichang/wrapper/resultmap/MybatisLabel.java  | 1 -
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java
index 51f4eb6..000b94c 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java
@@ -224,14 +224,14 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper
-     * 推荐使用 union(Class clazz, Consumer> consumer)
+     * 推荐使用 union(Class<U> clazz, Consumer<MPJLambdaWrapper<U>> consumer)
      * 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class))
      *
      * @see #union(Class, Consumer)
      * @deprecated union 不支持子查询
      */
     @Deprecated
-    @SuppressWarnings("DeprecatedIsStillUsed")
+    @SuppressWarnings("ALL")
     public final KtLambdaWrapper union(KtLambdaWrapper... wrappers) {
         StringBuilder sb = new StringBuilder();
         for (KtLambdaWrapper wrapper : wrappers) {
@@ -272,14 +272,14 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper
-     * 推荐使用 unionAll(Class clazz, Consumer> consumer)
+     * 推荐使用 unionAll(Class<U> clazz, Consumer<MPJLambdaWrapper<U>> consumer)
      * 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class))
      *
      * @see #unionAll(Class, Consumer)
      * @deprecated union 不支持子查询
      */
     @Deprecated
-    @SuppressWarnings("DeprecatedIsStillUsed")
+    @SuppressWarnings("ALL")
     public final KtLambdaWrapper unionAll(KtLambdaWrapper... wrappers) {
         StringBuilder sb = new StringBuilder();
         for (KtLambdaWrapper wrapper : wrappers) {
diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
index 4a5bd01..7b6116c 100644
--- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
+++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
@@ -227,7 +227,8 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper
-     * 推荐使用 union(Class clazz, Consumer> consumer)
+     * 推荐使用 union(Class<U> clazz, ConsumerConsumer<MPJLambdaWrapper<U>> consumer)
+     * 

* 例: wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class)) * * @see #union(Class, Consumer) @@ -275,7 +276,8 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper - * 推荐使用 unionAll(Class clazz, Consumer> consumer) + * 推荐使用 unionAll(Class<U> clazz, Consumer<MPJLambdaWrapper<U>> consumer) + *

* 例: wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class)) * * @see #unionAll(Class, Consumer) diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java index 405385d..36f221d 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/UpdateJoinWrapper.java @@ -129,6 +129,7 @@ public class UpdateJoinWrapper extends JoinAbstractLambdaWrapper implements Label { /** * 自动构建 */ - @SuppressWarnings("unchecked") public Builder(String index, String property, Class entityClass, Class javaType) { this.mybatisLabel = new MybatisLabel<>(); mybatisLabel.property = property; From a286bf811d730baf3a291c251b7676af46f64bf6 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 15 Jan 2024 01:13:00 +0800 Subject: [PATCH 60/88] solon --- .../mybatisplusjoin/solon/plugin/XPluginImpl.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index 655dbc9..f39dc0c 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -49,7 +49,7 @@ public class XPluginImpl implements Plugin { } }); // 读取配置 - Prop prop = new Prop(context.cfg().getProp("mybatis-plus-join")); + Prop prop = new Prop(context.cfg()); ConfigProperties.banner = prop.get("banner", Boolean::parseBoolean); ConfigProperties.subTableLogic = prop.get("subTableLogic", Boolean::parseBoolean); ConfigProperties.msCache = prop.get("msCache", Boolean::parseBoolean); @@ -76,10 +76,12 @@ public class XPluginImpl implements Plugin { private final Properties props; + @SuppressWarnings("SpellCheckingInspection") public Prop(Props props) { - this.props = new Properties(); - props.forEach((k, v) -> this.props.put(k.toString() - .replaceAll("[-_]", "").toUpperCase(Locale.ENGLISH), v)); + this.props = props.entrySet().stream().filter(e -> format(e.getKey().toString()) + .startsWith("MYBATISPLUSJOIN.")).collect(Collectors.toMap(e -> e.getKey().toString() + .substring(e.getKey().toString().lastIndexOf(".") + 1) + .toUpperCase(Locale.ENGLISH), Map.Entry::getValue, (o, n) -> n, Properties::new)); } @SuppressWarnings("unchecked") @@ -92,5 +94,9 @@ public class XPluginImpl implements Plugin { throw new RuntimeException(e); } } + + private String format(String key) { + return key.replaceAll("[-_]", "").toUpperCase(Locale.ENGLISH); + } } } \ No newline at end of file From fbce257571cb1e40e35ee821a7f2b3c019d93ee5 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 16 Jan 2024 13:08:23 +0800 Subject: [PATCH 61/88] https://gitee.com/best_handsome/mybatis-plus-join/issues/I7OLR3#note_24413498_link --- mybatis-plus-join-solon-plugin/README.md | 33 +++ mybatis-plus-join-solon-plugin/pom.xml | 8 +- .../solon/plugin/XPluginImpl.java | 10 +- .../solon/plugin/base/JoinDeepService.java | 244 ++++++++++++++++++ .../plugin/base/JoinRelationService.java | 61 +++++ .../solon/plugin/base/JoinService.java | 99 +++++++ .../solon/plugin/base/JoinServiceImpl.java | 13 + 7 files changed, 456 insertions(+), 12 deletions(-) create mode 100644 mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java create mode 100644 mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java create mode 100644 mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java create mode 100644 mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java diff --git a/mybatis-plus-join-solon-plugin/README.md b/mybatis-plus-join-solon-plugin/README.md index 6f8e809..2b12503 100644 --- a/mybatis-plus-join-solon-plugin/README.md +++ b/mybatis-plus-join-solon-plugin/README.md @@ -6,4 +6,37 @@ mybatis-plus-join-solon-plugin lastVersion +``` + +### mapper继承JoinBaseMapper + +```java +import com.github.yulichang.base.MPJBaseMapper; + +@Mapper +public interface UserMapper extends MPJBaseMapper { + +} +``` + +### (可选)service继承JoinBaseService + +```java +import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinService; + +public interface UserService extends JoinService { + +} +``` + +### (可选)serviceImpl继承JoinBaseServiceImpl + +```java +import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinServiceImpl; +import org.noear.solon.annotation.Component; + +@Component +public class UserServiceImpl extends JoinServiceImpl implements UserService { + +} ``` \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/pom.xml b/mybatis-plus-join-solon-plugin/pom.xml index 5fd1732..b27d424 100644 --- a/mybatis-plus-join-solon-plugin/pom.xml +++ b/mybatis-plus-join-solon-plugin/pom.xml @@ -24,12 +24,6 @@ mybatis-plus-join-extension ${revision} - - com.baomidou - mybatis-plus-core - ${mpj.mybatis.plus.version} - provided - org.noear solon @@ -44,7 +38,7 @@ org.noear - mybatis-plus-solon-plugin + mybatis-plus-extension-solon-plugin ${solon.varrsion} provided diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index f39dc0c..7db2be8 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -76,10 +76,9 @@ public class XPluginImpl implements Plugin { private final Properties props; - @SuppressWarnings("SpellCheckingInspection") public Prop(Props props) { - this.props = props.entrySet().stream().filter(e -> format(e.getKey().toString()) - .startsWith("MYBATISPLUSJOIN.")).collect(Collectors.toMap(e -> e.getKey().toString() + this.props = props.entrySet().stream().filter(e -> format(e.getKey()) + .startsWith(format("mybatis-plus-join."))).collect(Collectors.toMap(e -> e.getKey().toString() .substring(e.getKey().toString().lastIndexOf(".") + 1) .toUpperCase(Locale.ENGLISH), Map.Entry::getValue, (o, n) -> n, Properties::new)); } @@ -95,8 +94,9 @@ public class XPluginImpl implements Plugin { } } - private String format(String key) { - return key.replaceAll("[-_]", "").toUpperCase(Locale.ENGLISH); + private String format(Object key) { + return Optional.ofNullable(key).map(k -> k.toString().replaceAll("[-_]", "") + .toUpperCase(Locale.ENGLISH)).orElse(""); } } } \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java new file mode 100644 index 0000000..70629e8 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java @@ -0,0 +1,244 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin.base; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.solon.service.IService; +import com.github.yulichang.annotation.EntityMapping; +import com.github.yulichang.annotation.FieldMapping; +import com.github.yulichang.extension.mapping.config.DeepConfig; +import com.github.yulichang.extension.mapping.relation.Relation; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +/** + * 深度查询 + *

+ * 对配置了映射注解的字段进行查询 + * 目前查询深度只支持2级(只解析当前实体类的映射注解,不会对查询结果再次解析注解) + * 多级查询可能存在循环引用的问题,也可能会导致全量查询 + * + * @author yulichang + * @see EntityMapping + * @see FieldMapping + * @since 1.2.0 + */ +@SuppressWarnings({"unused"}) +public interface JoinDeepService extends IService { + + /** + * 根据 ID 查询 并关联全部映射 + * + * @param id 主键ID + */ + default T getByIdDeep(Serializable id) { + return Relation.mpjGetRelation(getById(id), DeepConfig.defaultConfig()); + } + + /** + * 根据 ID 查询 并关联指定映射 + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param id 主键ID + * @param config 映射配置 + */ + default T getByIdDeep(Serializable id, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(getById(id), config.apply(DeepConfig.builder()).build()); + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectByIdDeep(1, Arrays.asList(User::getId, ... )) + * + * @param id 主键ID + * @param config 映射配置 + */ + default T getByIdDeep(Serializable id, DeepConfig config) { + return Relation.mpjGetRelation(getById(id), config); + } + + /** + * 查询(根据ID 批量查询) + * + * @param idList 主键ID列表(不能为 null 以及 empty) + */ + default List listByIdsDeep(Collection idList) { + return Relation.mpjGetRelation(listByIds(idList), DeepConfig.defaultConfig()); + } + + /** + * 查询(根据ID 批量查询) + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param idList 主键ID列表(不能为 null 以及 empty) + * @param config 映射配置 + */ + default List listByIdsDeep(Collection idList, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(listByIds(idList), config.apply(DeepConfig.builder()).build()); + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectBatchIdsDeep(idList, Arrays.asList(User::getId, ... )) + * + * @param idList 主键ID列表(不能为 null 以及 empty) + * @param config 映射配置 + */ + default List listByIdsDeep(Collection idList, DeepConfig config) { + return Relation.mpjGetRelation(listByIds(idList), config); + } + + /** + * 查询(根据 columnMap 条件) + * + * @param columnMap 表字段 map 对象 + */ + default List listByMapDeep(Map columnMap) { + return Relation.mpjGetRelation(listByMap(columnMap), DeepConfig.defaultConfig()); + } + + /** + * 查询(根据 columnMap 条件) + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param columnMap 表字段 map 对象 + * @param config 映射配置 + */ + default List listByMapDeep(Map columnMap, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(listByMap(columnMap), config.apply(DeepConfig.builder()).build()); + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectByMapDeep(columnMap, Arrays.asList(User::getId, ... )) + * + * @param columnMap 表字段 map 对象 + * @param config 映射配置 + */ + default List listByMapDeep(Map columnMap, DeepConfig config) { + return Relation.mpjGetRelation(listByMap(columnMap), config); + } + + /** + * 根据 entity 条件,查询一条记录 + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + */ + default T getOneDeep(Wrapper queryWrapper) { + return Relation.mpjGetRelation(getOne(queryWrapper), DeepConfig.defaultConfig()); + } + + /** + * 根据 entity 条件,查询一条记录 + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default T getOneDeep(Wrapper queryWrapper, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(getOne(queryWrapper), config.apply(DeepConfig.builder()).build()); + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectOneDeep(queryWrapper, Arrays.asList(User::getId, ... )) + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default T getOneDeep(Wrapper queryWrapper, DeepConfig config) { + return Relation.mpjGetRelation(getOne(queryWrapper), config); + } + + /** + * 根据 entity 条件,查询全部记录 + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + */ + default List listDeep(Wrapper queryWrapper) { + return Relation.mpjGetRelation(list(queryWrapper), DeepConfig.defaultConfig()); + } + + /** + * 根据 entity 条件,查询全部记录 + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default List listDeep(Wrapper queryWrapper, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(list(queryWrapper), config.apply(DeepConfig.builder()).build()); + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectListDeep(queryWrapper, Arrays.asList(User::getId, ... )) + * + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default List listDeep(Wrapper queryWrapper, DeepConfig config) { + return Relation.mpjGetRelation(list(queryWrapper), config); + } + + /** + * 根据 entity 条件,查询全部记录(并翻页) + * + * @param page 分页查询条件(可以为 RowBounds.DEFAULT) + * @param queryWrapper 实体对象封装操作类(可以为 null) + */ + default > E pageDeep(E page, Wrapper queryWrapper) { + E e = page(page, queryWrapper); + Relation.mpjGetRelation(e.getRecords(), DeepConfig.defaultConfig()); + return e; + } + + /** + * 根据 entity 条件,查询全部记录(并翻页) + *

+ * JDK 默认不推荐泛型数组,会引起 Java堆污染(Heap Pollution) + * + * @param page 分页查询条件(可以为 RowBounds.DEFAULT) + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default > E pageDeep(E page, Wrapper queryWrapper, Function, DeepConfig.Builder> config) { + E e = page(page, queryWrapper); + Relation.mpjGetRelation(e.getRecords(), config.apply(DeepConfig.builder()).build()); + return e; + } + + /** + * 针对可变参数堆污染提供的重载 + * list为null或空,会查询全部映射关系 + *

+ * 例: selectPageDeep(page, queryWrapper, Arrays.asList(User::getId, ... )) + * + * @param page 分页查询条件(可以为 RowBounds.DEFAULT) + * @param queryWrapper 实体对象封装操作类(可以为 null) + * @param config 映射配置 + */ + default > E pageDeep(E page, Wrapper queryWrapper, DeepConfig config) { + E e = page(page, queryWrapper); + Relation.mpjGetRelation(e.getRecords(), config); + return e; + } +} diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java new file mode 100644 index 0000000..8d76afe --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java @@ -0,0 +1,61 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin.base; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.solon.service.IService; +import com.github.yulichang.annotation.EntityMapping; +import com.github.yulichang.annotation.FieldMapping; +import com.github.yulichang.extension.mapping.config.DeepConfig; +import com.github.yulichang.extension.mapping.relation.Relation; + +import java.util.function.Function; + +/** + * 深度查询 + *

+ * 对配置了映射注解的字段进行查询 + * 目前查询深度只支持2级(只解析当前实体类的映射注解,不会对查询结果再次解析注解) + * 多级查询可能存在循环引用的问题,也可能会导致全量查询 + * 用于替换deep + * + * @author yulichang + * @see EntityMapping + * @see FieldMapping + * @since 1.4.4 + */ +@SuppressWarnings({"unchecked", "unused"}) +public interface JoinRelationService extends IService { + + /** + * 通过注解实现单表多次查询 + * + * @param function BaseMapper调用方法 + * @see EntityMapping + * @see FieldMapping + */ + default > R getRelation(Function function) { + return Relation.mpjGetRelation(function.apply((M) getBaseMapper()), DeepConfig.defaultConfig()); + } + + /** + * 通过注解实现单表多次查询 + * + * @param function BaseMapper调用方法 + * @see EntityMapping + * @see FieldMapping + */ + default > R getRelation(Function function, DeepConfig config) { + return Relation.mpjGetRelation(function.apply((M) getBaseMapper()), config); + } + + /** + * 通过注解实现单表多次查询 + * + * @param function BaseMapper调用方法 + * @param config 映射配置 + * @see EntityMapping + * @see FieldMapping + */ + default > R getRelation(Function function, Function, DeepConfig.Builder> config) { + return Relation.mpjGetRelation(function.apply((M) getBaseMapper()), config.apply(DeepConfig.builder()).build()); + } +} diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java new file mode 100644 index 0000000..13af811 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java @@ -0,0 +1,99 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin.base; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.solon.service.IService; +import com.baomidou.mybatisplus.solon.toolkit.SqlHelper; +import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.interfaces.MPJBaseJoin; + +import java.util.List; +import java.util.Map; + +/** + * 基础service + * 目前包含两个模块 连表查询 和 关系映射 + * + * @author yulichang + */ +@SuppressWarnings({"unused"}) +public interface JoinService extends IService { + + + /** + * 根据 Wrapper 条件,连表删除 + * + * @param wrapper joinWrapper + */ + default boolean deleteJoin(MPJBaseJoin wrapper) { + return SqlHelper.retBool(((MPJBaseMapper) getBaseMapper()).deleteJoin(wrapper)); + } + + /** + * 根据 whereEntity 条件,更新记录 + * + * @param entity 实体对象 (set 条件值,可以为 null) + * @param wrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) + */ + default boolean updateJoin(T entity, MPJBaseJoin wrapper) { + return SqlHelper.retBool(((MPJBaseMapper) getBaseMapper()).updateJoin(entity, wrapper)); + } + + /** + * 根据 whereEntity 条件,更新记录 (null字段也会更新 !!!) + * + * @param entity 实体对象 (set 条件值,可以为 null) + * @param wrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) + */ + default boolean updateJoinAndNull(T entity, MPJBaseJoin wrapper) { + return SqlHelper.retBool(((MPJBaseMapper) getBaseMapper()).updateJoinAndNull(entity, wrapper)); + } + + /** + * 根据 Wrapper 条件,查询总记录数 + */ + default Long selectJoinCount(MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinCount(wrapper); + } + + /** + * 连接查询返回一条记录 + */ + default DTO selectJoinOne(Class clazz, MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinOne(clazz, wrapper); + } + + /** + * 连接查询返回集合 + */ + default List selectJoinList(Class clazz, MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinList(clazz, wrapper); + } + + /** + * 连接查询返回集合并分页 + */ + default > P selectJoinListPage(P page, Class clazz, MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinPage(page, clazz, wrapper); + } + + /** + * 连接查询返回Map + */ + default Map selectJoinMap(MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinMap(wrapper); + } + + /** + * 连接查询返回Map集合 + */ + default List> selectJoinMaps(MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinMaps(wrapper); + } + + /** + * 连接查询返回Map集合并分页 + */ + default

>> P selectJoinMapsPage(P page, MPJBaseJoin wrapper) { + return ((MPJBaseMapper) getBaseMapper()).selectJoinMapsPage(page, wrapper); + } +} diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java new file mode 100644 index 0000000..6d577b0 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java @@ -0,0 +1,13 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin.base; + +import com.baomidou.mybatisplus.solon.service.impl.ServiceImpl; +import com.github.yulichang.base.MPJBaseMapper; + +/** + * @author yulichang + * @see ServiceImpl + */ +@SuppressWarnings("unused") +public class JoinServiceImpl, T> extends ServiceImpl implements JoinService { + +} From 185d92f05443e0ef80efb9b2e9559ed2c7c1cebc Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 16 Jan 2024 13:10:19 +0800 Subject: [PATCH 62/88] solon --- mybatis-plus-join-solon-plugin/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/README.md b/mybatis-plus-join-solon-plugin/README.md index 2b12503..adacad7 100644 --- a/mybatis-plus-join-solon-plugin/README.md +++ b/mybatis-plus-join-solon-plugin/README.md @@ -8,7 +8,7 @@ ``` -### mapper继承JoinBaseMapper +### mapper继承MPJBaseMapper ```java import com.github.yulichang.base.MPJBaseMapper; @@ -19,7 +19,7 @@ public interface UserMapper extends MPJBaseMapper { } ``` -### (可选)service继承JoinBaseService +### (可选)service继承JoinService ```java import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinService; @@ -29,7 +29,7 @@ public interface UserService extends JoinService { } ``` -### (可选)serviceImpl继承JoinBaseServiceImpl +### (可选)serviceImpl继承JoinServiceImpl ```java import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinServiceImpl; From 48c1b6e8a1f6f496561c778643d0b9401dcab3bc Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Tue, 16 Jan 2024 19:38:45 +0800 Subject: [PATCH 63/88] solon --- mybatis-plus-join-solon-plugin/README.md | 8 ++++---- .../plugin/base/{JoinService.java => MPJBaseService.java} | 2 +- .../{JoinServiceImpl.java => MPJBaseServiceImpl.java} | 2 +- .../base/{JoinDeepService.java => MPJDeepService.java} | 2 +- .../{JoinRelationService.java => MPJRelationService.java} | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) rename mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/{JoinService.java => MPJBaseService.java} (98%) rename mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/{JoinServiceImpl.java => MPJBaseServiceImpl.java} (68%) rename mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/{JoinDeepService.java => MPJDeepService.java} (99%) rename mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/{JoinRelationService.java => MPJRelationService.java} (97%) diff --git a/mybatis-plus-join-solon-plugin/README.md b/mybatis-plus-join-solon-plugin/README.md index adacad7..1719943 100644 --- a/mybatis-plus-join-solon-plugin/README.md +++ b/mybatis-plus-join-solon-plugin/README.md @@ -22,9 +22,9 @@ public interface UserMapper extends MPJBaseMapper { ### (可选)service继承JoinService ```java -import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinService; +import com.github.yulichang.mybatisplusjoin.solon.plugin.base.MPJBaseService; -public interface UserService extends JoinService { +public interface UserService extends MPJBaseService { } ``` @@ -32,11 +32,11 @@ public interface UserService extends JoinService { ### (可选)serviceImpl继承JoinServiceImpl ```java -import com.github.yulichang.mybatisplusjoin.solon.plugin.base.JoinServiceImpl; +import com.github.yulichang.mybatisplusjoin.solon.plugin.base.MPJBaseServiceImpl; import org.noear.solon.annotation.Component; @Component -public class UserServiceImpl extends JoinServiceImpl implements UserService { +public class UserServiceImpl extends MPJBaseServiceImpl implements UserService { } ``` \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseService.java similarity index 98% rename from mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java rename to mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseService.java index 13af811..7074f5f 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinService.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseService.java @@ -16,7 +16,7 @@ import java.util.Map; * @author yulichang */ @SuppressWarnings({"unused"}) -public interface JoinService extends IService { +public interface MPJBaseService extends IService { /** diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseServiceImpl.java similarity index 68% rename from mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java rename to mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseServiceImpl.java index 6d577b0..90201d3 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinServiceImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJBaseServiceImpl.java @@ -8,6 +8,6 @@ import com.github.yulichang.base.MPJBaseMapper; * @see ServiceImpl */ @SuppressWarnings("unused") -public class JoinServiceImpl, T> extends ServiceImpl implements JoinService { +public class MPJBaseServiceImpl, T> extends ServiceImpl implements MPJBaseService { } diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJDeepService.java similarity index 99% rename from mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java rename to mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJDeepService.java index 70629e8..50524ba 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinDeepService.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJDeepService.java @@ -27,7 +27,7 @@ import java.util.function.Function; * @since 1.2.0 */ @SuppressWarnings({"unused"}) -public interface JoinDeepService extends IService { +public interface MPJDeepService extends IService { /** * 根据 ID 查询 并关联全部映射 diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJRelationService.java similarity index 97% rename from mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java rename to mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJRelationService.java index 8d76afe..0af851f 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/JoinRelationService.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/base/MPJRelationService.java @@ -23,7 +23,7 @@ import java.util.function.Function; * @since 1.4.4 */ @SuppressWarnings({"unchecked", "unused"}) -public interface JoinRelationService extends IService { +public interface MPJRelationService extends IService { /** * 通过注解实现单表多次查询 From 0475d410d0fbc892b322da2d5e3d0ec518dca074 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 17 Jan 2024 02:17:26 +0800 Subject: [PATCH 64/88] fix https://gitee.com/best_handsome/mybatis-plus-join/issues/I8WPCL https://gitee.com/best_handsome/mybatis-plus-join/issues/I8WP8Q https://gitee.com/best_handsome/mybatis-plus-join/issues/I83IEV https://github.com/yulichang/mybatis-plus-join/issues/89 --- .../yulichang/annotation/EntityMapping.java | 2 +- .../yulichang/interceptor/MPJInterceptor.java | 32 +++++++---- .../github/yulichang/kt/KtLambdaWrapper.java | 2 +- .../github/yulichang/kt/interfaces/Query.java | 8 +-- .../yulichang/toolkit/JSqlParserHelper.java | 55 +++++++++++++++++++ .../yulichang/toolkit/ThrowOptional.java | 8 ++- .../yulichang/wrapper/MPJLambdaWrapper.java | 3 +- .../yulichang/wrapper/interfaces/Query.java | 9 ++- .../wrapper/interfaces/SelectWrapper.java | 4 ++ .../wrapper/segments/SelectString.java | 18 +++--- .../yulichang/wrapper/segments/SelectSub.java | 10 +++- .../test/join/LambdaWrapperTest.java | 9 ++- .../test/join/m/StringColumTest.java | 48 ++++++++++++++++ 13 files changed, 165 insertions(+), 43 deletions(-) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JSqlParserHelper.java create mode 100644 mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/StringColumTest.java diff --git a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java index fa47e6b..74e30ef 100644 --- a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java +++ b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java @@ -10,7 +10,7 @@ import java.lang.annotation.*; * @since 1.2.0 */ @Documented -@SuppressWarnings({"unused"}) +@SuppressWarnings("unused") @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface EntityMapping { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java index 0eea4f3..9f20dfe 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java @@ -2,15 +2,13 @@ package com.github.yulichang.interceptor; import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.core.toolkit.*; import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.query.MPJQueryWrapper; -import com.github.yulichang.toolkit.Constant; -import com.github.yulichang.toolkit.MPJReflectionKit; -import com.github.yulichang.toolkit.MPJTableMapperHelper; -import com.github.yulichang.toolkit.TableHelper; +import com.github.yulichang.toolkit.*; import com.github.yulichang.toolkit.support.FieldCache; import com.github.yulichang.wrapper.interfaces.SelectWrapper; import com.github.yulichang.wrapper.resultmap.IResult; @@ -50,7 +48,7 @@ public class MPJInterceptor implements Interceptor { private static final List EMPTY_RESULT_MAPPING = new ArrayList<>(0); /** - * 缓存MappedStatement,不需要每次都去重新构建MappedStatement + * 缓存MappedStatement,不需要每次都去构建MappedStatement */ private static final Map> MS_CACHE = new ConcurrentHashMap<>(); @@ -199,11 +197,23 @@ public class MPJInterceptor implements Interceptor { } } else { FieldCache field = fieldMap.get(i.getColumProperty()); - columnSet.add(i.getTagColumn()); - if (Objects.nonNull(field)) { - ResultMapping.Builder builder = new ResultMapping.Builder(ms.getConfiguration(), i.getColumProperty(), - i.getTagColumn(), field.getType()); - resultMappings.add(selectToResult(wrapper.getEntityClass(), i, field.getType(), builder)); + if (StringUtils.isNotBlank(i.getTagColumn())) { + columnSet.add(i.getTagColumn()); + if (Objects.nonNull(field)) { + ResultMapping.Builder builder = new ResultMapping.Builder(ms.getConfiguration(), i.getColumProperty(), + i.getTagColumn(), field.getType()); + resultMappings.add(selectToResult(wrapper.getEntityClass(), i, field.getType(), builder)); + } + } else if (wrapper.isResultMap()) { + ThrowOptional.tryDo(() -> JSqlParserHelper.paresColum(wrapper, i.getColumn(), col -> { + FieldCache strField = fieldMap.get(col); + columnSet.add(col); + if (Objects.nonNull(strField)) { + ResultMapping.Builder builder = new ResultMapping.Builder(ms.getConfiguration(), col, + col, strField.getType()); + resultMappings.add(selectToResult(wrapper.getEntityClass(), i, strField.getType(), builder)); + } + })).catchDo(); } } } @@ -430,7 +440,7 @@ public class MPJInterceptor implements Interceptor { public void setProperties(Properties properties) { try { Interceptor.super.setProperties(properties); - } catch (Exception ignored) { + } catch (Throwable ignored) { } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java index 000b94c..7c65b76 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtLambdaWrapper.java @@ -217,7 +217,7 @@ public class KtLambdaWrapper extends KtAbstractLambdaWrapper KtWrapperUtils.buildSubSqlByWrapper( - clazz, wrapper, alias.getName()), hasAlias, this.alias)); + clazz, wrapper, alias.getName()), hasAlias, this.alias, alias.getName())); return typedThis; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java index 77c5a85..33729fe 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/Query.java @@ -90,7 +90,8 @@ public interface Query extends Serializable { * @param columns 列 */ default Children select(String... columns) { - getSelectColum().addAll(Arrays.stream(columns).map(i -> new SelectString(i, isHasAlias(), getAlias())).collect(Collectors.toList())); + getSelectColum().addAll(Arrays.stream(columns).map(i -> + new SelectString(i, null)).collect(Collectors.toList())); return getChildren(); } @@ -100,7 +101,7 @@ public interface Query extends Serializable { * @param column 列 */ default Children selectAs(String column, KProperty alias) { - getSelectColum().add(new SelectString(column + Constants.AS + alias.getName(), isHasAlias(), getAlias())); + getSelectColum().add(new SelectString(column + Constants.AS + alias.getName(), alias.getName())); return getChildren(); } @@ -113,8 +114,7 @@ public interface Query extends Serializable { Map cacheMap = ColumnCache.getMapField(KtUtils.ref(column)); SelectCache cache = cacheMap.get(column.getName()); getSelectColum().add(new SelectString( - index + Constants.DOT + cache.getColumn() + Constants.AS + alias.getName(), - isHasAlias(), getAlias())); + index + Constants.DOT + cache.getColumn() + Constants.AS + alias.getName(), alias.getName())); return getChildren(); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JSqlParserHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JSqlParserHelper.java new file mode 100644 index 0000000..3473d84 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/JSqlParserHelper.java @@ -0,0 +1,55 @@ +package com.github.yulichang.toolkit; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.github.yulichang.wrapper.interfaces.SelectWrapper; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.*; + +import java.util.function.Consumer; + +/** + * @author yulichang + * @since 1.4.10 + */ +public final class JSqlParserHelper { + + /** + * 解析sql select字段 刚接触JSqlParser有更好的用法欢迎PR + * + * @param selectSql 要解析的select sql片段 + * @param columConsumer 解析的字段处理 + */ + public static void paresColum(SelectWrapper wrapper, String selectSql, Consumer columConsumer) throws Exception { + Statement statement = CCJSqlParserUtil.parse(String.format("SELECT %s FROM table %s %s", selectSql, wrapper.getAlias(), wrapper.getFrom())); + if (statement instanceof Select) { + Select select = (Select) statement; + SelectBody selectBody = select.getSelectBody(); + if (selectBody instanceof PlainSelect) { + PlainSelect plainSelect = (PlainSelect) selectBody; + if (CollectionUtils.isNotEmpty(plainSelect.getSelectItems())) { + for (SelectItem item : plainSelect.getSelectItems()) { + if (item instanceof SelectExpressionItem) { + String col; + SelectExpressionItem selectExpressionItem = (SelectExpressionItem) item; + if (null == selectExpressionItem.getAlias()) { + if (selectExpressionItem.getExpression() instanceof Column) { + col = StringUtils.getTargetColumn(((Column) selectExpressionItem.getExpression()).getColumnName()); + } else { + col = StringUtils.getTargetColumn(selectExpressionItem.getExpression().toString()); + } + } else { + col = StringUtils.getTargetColumn(selectExpressionItem.getAlias().getName()); + } + if (StringUtils.isNotBlank(col)) { + columConsumer.accept(col); + } + } + } + } + } + } + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java index f0fcc39..da86173 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/ThrowOptional.java @@ -33,7 +33,11 @@ public class ThrowOptional { try { this.doSomething.doSomething(); } catch (Throwable ignored) { - doSomething.doSomething(); + try { + doSomething.doSomething(); + } catch (Throwable e) { + throw new RuntimeException(e); + } } } @@ -48,6 +52,6 @@ public class ThrowOptional { @FunctionalInterface public interface DoSomething { - void doSomething(); + void doSomething() throws Throwable; } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 7b6116c..137e5c5 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -220,7 +220,8 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, LambdaUtils.getName(alias)), hasAlias, this.alias)); + String name = LambdaUtils.getName(alias); + this.selectColumns.add(new SelectSub(() -> WrapperUtils.buildSubSqlByWrapper(clazz, wrapper, name), hasAlias, this.alias, name)); return typedThis; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index f49f7be..5aae207 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -3,6 +3,7 @@ package com.github.yulichang.wrapper.interfaces; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.LambdaUtils; @@ -15,7 +16,6 @@ import com.github.yulichang.wrapper.enums.DefaultFuncEnum; import com.github.yulichang.wrapper.segments.*; import java.io.Serializable; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -90,7 +90,7 @@ public interface Query extends Serializable { * @param columns 列 */ default Children select(String... columns) { - getSelectColum().addAll(Arrays.stream(columns).map(i -> new SelectString(i, isHasAlias(), getAlias())).collect(Collectors.toList())); + getSelectColum().add(new SelectString(String.join(StringPool.COMMA, columns), null)); return getChildren(); } @@ -100,7 +100,7 @@ public interface Query extends Serializable { * @param column 列 */ default Children selectAs(String column, SFunction alias) { - getSelectColum().add(new SelectString(column + Constants.AS + LambdaUtils.getName(alias), isHasAlias(), getAlias())); + getSelectColum().add(new SelectString(column + Constants.AS + LambdaUtils.getName(alias), LambdaUtils.getName(alias))); return getChildren(); } @@ -113,8 +113,7 @@ public interface Query extends Serializable { Map cacheMap = ColumnCache.getMapField(LambdaUtils.getEntityClass(column)); SelectCache cache = cacheMap.get(LambdaUtils.getName(column)); getSelectColum().add(new SelectString( - index + Constants.DOT + cache.getColumn() + Constants.AS + LambdaUtils.getName(alias), - isHasAlias(), getAlias())); + index + Constants.DOT + cache.getColumn() + Constants.AS + LambdaUtils.getName(alias), LambdaUtils.getName(alias))); return getChildren(); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/SelectWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/SelectWrapper.java index 69a66d9..5e8a29f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/SelectWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/SelectWrapper.java @@ -21,4 +21,8 @@ public interface SelectWrapper { boolean isResultMap(); List getResultMapMybatisLabel(); + + String getFrom(); + + String getAlias(); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectString.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectString.java index 3f6546f..31b60dd 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectString.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectString.java @@ -1,6 +1,7 @@ package com.github.yulichang.wrapper.segments; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.github.yulichang.wrapper.enums.BaseFuncEnum; import org.apache.ibatis.type.TypeHandler; @@ -13,14 +14,11 @@ import org.apache.ibatis.type.TypeHandler; public class SelectString implements Select { private final String column; - private final boolean hasTableAlias; + private final String tagProperty; - private final String tableAlias; - - public SelectString(String column, boolean hasTableAlias, String tableAlias) { + public SelectString(String column, String tagProperty) { this.column = column; - this.hasTableAlias = hasTableAlias; - this.tableAlias = tableAlias; + this.tagProperty = null == tagProperty ? null : StringUtils.getTargetColumn(tagProperty); } @Override @@ -35,12 +33,12 @@ public class SelectString implements Select { @Override public boolean isHasTableAlias() { - return this.hasTableAlias; + throw new UnsupportedOperationException(); } @Override public String getTableAlias() { - return this.tableAlias; + throw new UnsupportedOperationException(); } @Override @@ -60,12 +58,12 @@ public class SelectString implements Select { @Override public String getTagColumn() { - return null; + return tagProperty; } @Override public String getColumProperty() { - return null; + return tagProperty; } @Override diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java index 6b35a8d..68908a9 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectSub.java @@ -2,6 +2,7 @@ package com.github.yulichang.wrapper.segments; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.github.yulichang.wrapper.enums.BaseFuncEnum; import org.apache.ibatis.type.TypeHandler; @@ -22,10 +23,13 @@ public class SelectSub implements Select { private final String tableAlias; - public SelectSub(Supplier column, boolean hasTableAlias, String tableAlias) { + private final String tagProperty; + + public SelectSub(Supplier column, boolean hasTableAlias, String tableAlias,String tagProperty) { this.column = column; this.hasTableAlias = hasTableAlias; this.tableAlias = tableAlias; + this.tagProperty = null == tagProperty ? null : StringUtils.getTargetColumn(tagProperty); } @Override @@ -65,12 +69,12 @@ public class SelectSub implements Select { @Override public String getTagColumn() { - return null; + return tagProperty; } @Override public String getColumProperty() { - return null; + return tagProperty; } @Override diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 4cc9630..f95bd05 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -64,15 +64,15 @@ class LambdaWrapperTest { @Test void testSelectSort() { ThreadLocalUtils.set("SELECT t.id, t.user_id, t.tenant_id FROM user_tenant t WHERE t.tenant_id = 1"); - MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class); - lambda.selectAsClass(UserTenantDO.class, UserTenantDTO.class); + MPJLambdaWrapper lambda = JoinWrappers.lambda(UserTenantDO.class) + .selectAsClass(UserTenantDO.class, UserTenantDTO.class); List list = userTenantMapper.selectJoinList(UserTenantDO.class, lambda); assert list.size() == 5 && list.get(0).getIdea() != null; ThreadLocalUtils.set("SELECT t.tenant_id, t.user_id, t.id FROM user_tenant t WHERE t.tenant_id = 1"); - MPJLambdaWrapper lambda1 = JoinWrappers.lambda(UserTenantDO.class); - lambda1.selectAsClass(UserTenantDO.class, UserTenantDescDTO.class); + MPJLambdaWrapper lambda1 = JoinWrappers.lambda(UserTenantDO.class) + .selectAsClass(UserTenantDO.class, UserTenantDescDTO.class); List list1 = userTenantMapper.selectJoinList(UserTenantDO.class, lambda1); assert list1.size() == 5 && list1.get(0).getIdea() != null; } @@ -526,7 +526,6 @@ class LambdaWrapperTest { assert l4.size() == 14 && l4.get(0).getAddressList().size() == 5; } - /** * 别名测试 */ diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/StringColumTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/StringColumTest.java new file mode 100644 index 0000000..aa00c34 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/StringColumTest.java @@ -0,0 +1,48 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.dto.UserDTO; +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.UserDO; +import com.github.yulichang.test.join.mapper.UserMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import lombok.SneakyThrows; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; +import java.util.List; + +@SpringBootTest +public class StringColumTest { + + @Resource + private UserMapper userMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + @Test + @SneakyThrows + void stringColum() { + ThreadLocalUtils.set("SELECT (SELECT id FROM `user` u WHERE u.id = t.id) id, t.`name` AS PName, t.`name` PName, t.`name`," + + " (SELECT id FROM `user` u WHERE u.id = t.id), t1.id AS joina_id, t1.user_id, t1.area_id, t1.tel, " + + "t1.address, t1.del FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del = false AND t1.del = false LIMIT 1"); + List l3 = userMapper.selectJoinList(UserDTO.class, new MPJLambdaWrapper() + .select("(select id from `user` u where u.id = t.id) id") + .select("t.`name` as PName") + .select("t.`name` PName") + .select("t.`name`") + .select("(select id from `user` u where u.id = t.id) ") + .selectAssociation(AddressDO.class, UserDTO::getAddressDTO) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .last("limit 1")); + assert l3.get(0).getPName() != null; + l3.forEach(System.out::println); + } +} From 5acf97e08aa9107ad573660d999fa71daebdc28b Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 17 Jan 2024 02:20:09 +0800 Subject: [PATCH 65/88] solon --- mybatis-plus-join-solon-plugin/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/README.md b/mybatis-plus-join-solon-plugin/README.md index 1719943..9fcacd0 100644 --- a/mybatis-plus-join-solon-plugin/README.md +++ b/mybatis-plus-join-solon-plugin/README.md @@ -19,7 +19,7 @@ public interface UserMapper extends MPJBaseMapper { } ``` -### (可选)service继承JoinService +### (可选)service继承MPJBaseService ```java import com.github.yulichang.mybatisplusjoin.solon.plugin.base.MPJBaseService; @@ -29,7 +29,7 @@ public interface UserService extends MPJBaseService { } ``` -### (可选)serviceImpl继承JoinServiceImpl +### (可选)serviceImpl继承MPJBaseServiceImpl ```java import com.github.yulichang.mybatisplusjoin.solon.plugin.base.MPJBaseServiceImpl; From c7ea5485fdc3a282a8af5ec7d561beb666caf3ac Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 17 Jan 2024 14:12:26 +0800 Subject: [PATCH 66/88] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mybatis-plus-join-solon-plugin/pom.xml | 2 +- .../mybatisplusjoin/solon/plugin/XPluginImpl.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mybatis-plus-join-solon-plugin/pom.xml b/mybatis-plus-join-solon-plugin/pom.xml index b27d424..4fd0e8c 100644 --- a/mybatis-plus-join-solon-plugin/pom.xml +++ b/mybatis-plus-join-solon-plugin/pom.xml @@ -12,7 +12,7 @@ mybatis-plus-join-solon-plugin - 2.6.3 + 2.6.4 8 8 UTF-8 diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java index 7db2be8..b7bcf07 100644 --- a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -3,13 +3,13 @@ package com.github.yulichang.mybatisplusjoin.solon.plugin; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; -import com.github.yulichang.config.enums.IfPresentEnum; +import com.github.yulichang.config.enums.IfExistsEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.toolkit.SpringContentUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.solon.MybatisAdapter; import org.apache.ibatis.solon.integration.MybatisAdapterManager; @@ -59,10 +59,10 @@ public class XPluginImpl implements Plugin { Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误"))); ConfigProperties.mappingMaxCount = prop.get("mappingMaxCount", Integer::parseInt); - ConfigProperties.ifPresent = prop.get("ifPresent", val -> - Arrays.stream(IfPresentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() - .map(m -> (BiPredicate) (o, enums) -> m.test(o)) - .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifPresent 配置错误"))); + ConfigProperties.ifExists = prop.get("ifExists", val -> + Arrays.stream(IfExistsEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .map(m -> (BiPredicate) (o, enums) -> m.test(o)) + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifExists 配置错误"))); // 后续操作 context.onEvent(AppLoadEndEvent.class, e -> { List sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream() From 39942b28cef9cb2268ff9de18125a3def2905021 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 17 Jan 2024 14:21:01 +0800 Subject: [PATCH 67/88] ifPresent -> ifExists --- .../MybatisPlusJoinAutoConfiguration.java | 12 +- .../MybatisPlusJoinProperties.java | 6 +- .../MybatisPlusJoinIfExistsConsumer.java | 14 ++ .../MybatisPlusJoinIfPresentConsumer.java | 14 -- ...itional-spring-configuration-metadata.json | 8 +- .../yulichang/config/ConfigProperties.java | 8 +- .../{IfPresentEnum.java => IfExistsEnum.java} | 4 +- .../yulichang/kt/KtAbstractWrapper.java | 24 +-- .../kt/interfaces/CompareIfExists.java | 115 +++++++++++++ .../kt/interfaces/CompareIfPresent.java | 115 ------------- .../query/MPJLambdaQueryWrapper.java | 26 +-- .../yulichang/query/MPJQueryWrapper.java | 26 +-- .../query/interfaces/CompareIfExists.java | 151 ++++++++++++++++++ .../query/interfaces/CompareIfPresent.java | 151 ------------------ .../wrapper/JoinAbstractWrapper.java | 26 +-- .../yulichang/wrapper/MPJLambdaWrapper.java | 12 +- ...dEnum.java => IfExistsSqlKeyWordEnum.java} | 2 +- .../wrapper/interfaces/CompareIfExists.java | 114 +++++++++++++ .../wrapper/interfaces/CompareIfPresent.java | 114 ------------- .../interfaces/CompareStrIfExists.java | 65 ++++++++ .../interfaces/CompareStrIfPresent.java | 65 -------- .../yulichang/wrapper/interfaces/Query.java | 8 +- .../test/join/m/CustomWrapperTest.java | 6 +- .../{IfPresentTest.java => IfExistsTest.java} | 72 ++++----- .../yulichang/test/kt/m/CustomWrapperTest.kt | 6 +- 25 files changed, 582 insertions(+), 582 deletions(-) create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfExistsConsumer.java delete mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java rename mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/{IfPresentEnum.java => IfExistsEnum.java} (89%) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfExists.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfExists.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java rename mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/enums/{IfPresentSqlKeyWordEnum.java => IfExistsSqlKeyWordEnum.java} (87%) create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfExists.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java create mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfExists.java delete mode 100644 mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java rename mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/{IfPresentTest.java => IfExistsTest.java} (53%) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index 66bf5c0..37a17c1 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -3,7 +3,7 @@ package com.github.yulichang.autoconfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; import com.baomidou.mybatisplus.core.injector.ISqlInjector; import com.github.yulichang.autoconfigure.conditional.JoinSqlInjectorCondition; -import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfPresentConsumer; +import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinIfExistsConsumer; import com.github.yulichang.autoconfigure.consumer.MybatisPlusJoinPropertiesConsumer; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; @@ -11,7 +11,7 @@ import com.github.yulichang.extension.mapping.config.MappingConfig; import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.interceptor.MPJInterceptor; import com.github.yulichang.toolkit.SpringContentUtils; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; @@ -63,7 +63,7 @@ public class MybatisPlusJoinAutoConfiguration { public MybatisPlusJoinAutoConfiguration(MybatisPlusJoinProperties properties, ObjectProvider propertiesConsumers, - ObjectProvider ifPresentConsumers) { + ObjectProvider IfExistsConsumers) { this.properties = Optional.ofNullable(propertiesConsumers.getIfAvailable()).map(c -> c.config(properties)).orElse(properties); ConfigProperties.banner = this.properties.getBanner(); ConfigProperties.subTableLogic = this.properties.getSubTableLogic(); @@ -72,9 +72,9 @@ public class MybatisPlusJoinAutoConfiguration { ConfigProperties.joinPrefix = this.properties.getJoinPrefix(); ConfigProperties.logicDelType = this.properties.getLogicDelType(); ConfigProperties.mappingMaxCount = this.properties.getMappingMaxCount(); - ConfigProperties.ifPresent = Optional.ofNullable(ifPresentConsumers.getIfAvailable()) - .map(m -> (BiPredicate) m) - .orElse((val, key) -> this.properties.getIfPresent().test(val)); + ConfigProperties.ifExists = Optional.ofNullable(IfExistsConsumers.getIfAvailable()) + .map(m -> (BiPredicate) m) + .orElse((val, key) -> this.properties.getIfExists().test(val)); info("mybatis plus join properties config complete"); } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java index 5948c63..4713894 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java @@ -1,6 +1,6 @@ package com.github.yulichang.autoconfigure; -import com.github.yulichang.config.enums.IfPresentEnum; +import com.github.yulichang.config.enums.IfExistsEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; import lombok.Data; import lombok.experimental.Accessors; @@ -58,7 +58,7 @@ public class MybatisPlusJoinProperties { private String subQueryAlias = "st"; /** - * Wrapper ifPresent 判断策略 + * Wrapper IfExists 判断策略 *

* NOT_NULL 非null *

@@ -66,5 +66,5 @@ public class MybatisPlusJoinProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - private IfPresentEnum ifPresent = IfPresentEnum.NOT_EMPTY; + private IfExistsEnum IfExists = IfExistsEnum.NOT_EMPTY; } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfExistsConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfExistsConsumer.java new file mode 100644 index 0000000..aa200d5 --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfExistsConsumer.java @@ -0,0 +1,14 @@ +package com.github.yulichang.autoconfigure.consumer; + +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * 自定义IfExists策略 + * + * @author yulichang + * @since 1.4.9 + */ +public interface MybatisPlusJoinIfExistsConsumer extends BiPredicate { +} diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java deleted file mode 100644 index d5c4fe2..0000000 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/consumer/MybatisPlusJoinIfPresentConsumer.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.yulichang.autoconfigure.consumer; - -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * 自定义IfPresent策略 - * - * @author yulichang - * @since 1.4.9 - */ -public interface MybatisPlusJoinIfPresentConsumer extends BiPredicate { -} diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index b5e4f71..5dd7d84 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -57,10 +57,10 @@ "description": "子查询表别名." }, { - "name": "mybatis-plus-join.if-present", - "defaultValue": "com.github.yulichang.config.enums.IfPresentEnum.NOT_EMPTY", - "type": "com.github.yulichang.config.enums.IfPresentEnum", - "description": "IfPresent方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfPresentConsumer." + "name": "mybatis-plus-join.if-exist", + "defaultValue": "com.github.yulichang.config.enums.IfExistsEnum.NOT_EMPTY", + "type": "com.github.yulichang.config.enums.IfExistsEnum", + "description": "IfExists方法判断策略,如需自定义请用@Bean形式MybatisPlusJoinIfExistsConsumer." } ] } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index d2e07ba..3aa43a6 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -2,9 +2,9 @@ package com.github.yulichang.config; import com.github.yulichang.adapter.AdapterHelper; import com.github.yulichang.adapter.base.ITableInfoAdapter; -import com.github.yulichang.config.enums.IfPresentEnum; +import com.github.yulichang.config.enums.IfExistsEnum; import com.github.yulichang.config.enums.LogicDelTypeEnum; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import java.util.function.BiPredicate; @@ -51,7 +51,7 @@ public class ConfigProperties { */ public static String subQueryAlias = "st"; /** - * Wrapper ifPresent 判断策略 + * Wrapper IfExists 判断策略 *

* NOT_NULL 非null *

@@ -59,5 +59,5 @@ public class ConfigProperties { *

* NOT_BLANK 非空白字符串 例: "" -> false, " " -> false, "\r" -> false, "abc" -> true ... */ - public static BiPredicate ifPresent = (val, key) -> IfPresentEnum.NOT_EMPTY.test(val); + public static BiPredicate ifExists = (val, key) -> IfExistsEnum.NOT_EMPTY.test(val); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfExistsEnum.java similarity index 89% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfExistsEnum.java index 913aa74..c5e3a97 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfPresentEnum.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/enums/IfExistsEnum.java @@ -11,7 +11,7 @@ import java.util.function.Predicate; * @author yulichang * @since 1.4.9 */ -public enum IfPresentEnum implements Predicate { +public enum IfExistsEnum implements Predicate { /** * 非null @@ -28,7 +28,7 @@ public enum IfPresentEnum implements Predicate { private final Predicate predicate; - IfPresentEnum(Predicate predicate) { + IfExistsEnum(Predicate predicate) { this.predicate = predicate; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java index ed11efd..b3b6c45 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/KtAbstractWrapper.java @@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.kt.interfaces.CompareIfPresent; +import com.github.yulichang.kt.interfaces.CompareIfExists; import com.github.yulichang.kt.interfaces.Func; import com.github.yulichang.kt.interfaces.OnCompare; import com.github.yulichang.toolkit.KtUtils; @@ -20,9 +20,9 @@ import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; -import com.github.yulichang.wrapper.interfaces.CompareStrIfPresent; +import com.github.yulichang.wrapper.interfaces.CompareStrIfExists; import com.github.yulichang.wrapper.interfaces.FuncStr; import com.github.yulichang.wrapper.interfaces.Join; import kotlin.reflect.KProperty; @@ -47,8 +47,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unused", "unchecked", "DuplicatedCode"}) public abstract class KtAbstractWrapper> extends Wrapper - implements CompareIfPresent, Nested, Join, Func, OnCompare, - CompareStrIfPresent, FuncStr { + implements CompareIfExists, Nested, Join, Func, OnCompare, + CompareStrIfExists, FuncStr { /** * 占位符 @@ -125,10 +125,10 @@ public abstract class KtAbstractWrapper ifPresent = ConfigProperties.ifPresent; + protected BiPredicate ifExists = ConfigProperties.ifExists; @Override public T getEntity() { @@ -181,13 +181,13 @@ public abstract class KtAbstractWrapper ifPresent) { - this.ifPresent = ifPresent; + public Children setIfExists(BiPredicate IfExists) { + this.ifExists = IfExists; return typedThis; } - public Children setIfPresent(Predicate ifPresent) { - this.ifPresent = (o, k) -> ifPresent.test(o); + public Children setIfExists(Predicate IfExists) { + this.ifExists = (o, k) -> IfExists.test(o); return typedThis; } @@ -659,7 +659,7 @@ public abstract class KtAbstractWrapper extends Compare { + + BiPredicate getIfExists(); + + default Children eqIfExists(KProperty column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), null, column, val); + } + + default Children eqIfExists(String alias, KProperty column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), alias, column, val); + } + + default Children neIfExists(KProperty column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), null, column, val); + } + + default Children neIfExists(String alias, KProperty column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), alias, column, val); + } + + default Children gtIfExists(KProperty column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), null, column, val); + } + + default Children gtIfExists(String alias, KProperty column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), alias, column, val); + } + + + default Children geIfExists(KProperty column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), null, column, val); + } + + default Children geIfExists(String alias, KProperty column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), alias, column, val); + } + + default Children ltIfExists(KProperty column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), null, column, val); + } + + default Children ltIfExists(String alias, KProperty column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), alias, column, val); + } + + default Children leIfExists(KProperty column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), null, column, val); + } + + default Children leIfExists(String alias, KProperty column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), alias, column, val); + } + + default Children likeIfExists(KProperty column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), null, column, val); + } + + default Children likeIfExists(String alisa, KProperty column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), alisa, column, val); + } + + default Children notLikeIfExists(KProperty column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), null, column, val); + } + + default Children notLikeIfExists(String alias, KProperty column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), alias, column, val); + } + + default Children likeLeftIfExists(KProperty column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), null, column, val); + } + + default Children likeLeftIfExists(String alias, KProperty column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), alias, column, val); + } + + default Children notLikeLeftIfExists(KProperty column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfExists(String alias, KProperty column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + + default Children likeRightIfExists(KProperty column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), null, column, val); + } + + default Children likeRightIfExists(String alias, KProperty column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); + } + + default Children notLikeRightIfExists(KProperty column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfExists(String alias, KProperty column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java deleted file mode 100644 index ab1a0a6..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/interfaces/CompareIfPresent.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.github.yulichang.kt.interfaces; - -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; -import kotlin.reflect.KProperty; - -import java.util.function.BiPredicate; - -/** - * ifPresent - * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareIfPresent extends Compare { - - BiPredicate getIfPresent(); - - default Children eqIfPresent(KProperty column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), null, column, val); - } - - default Children eqIfPresent(String alias, KProperty column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), alias, column, val); - } - - default Children neIfPresent(KProperty column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), null, column, val); - } - - default Children neIfPresent(String alias, KProperty column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), alias, column, val); - } - - default Children gtIfPresent(KProperty column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), null, column, val); - } - - default Children gtIfPresent(String alias, KProperty column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), alias, column, val); - } - - - default Children geIfPresent(KProperty column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), null, column, val); - } - - default Children geIfPresent(String alias, KProperty column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), alias, column, val); - } - - default Children ltIfPresent(KProperty column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), null, column, val); - } - - default Children ltIfPresent(String alias, KProperty column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), alias, column, val); - } - - default Children leIfPresent(KProperty column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), null, column, val); - } - - default Children leIfPresent(String alias, KProperty column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), alias, column, val); - } - - default Children likeIfPresent(KProperty column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), null, column, val); - } - - default Children likeIfPresent(String alisa, KProperty column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), alisa, column, val); - } - - default Children notLikeIfPresent(KProperty column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), null, column, val); - } - - default Children notLikeIfPresent(String alias, KProperty column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), alias, column, val); - } - - default Children likeLeftIfPresent(KProperty column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), null, column, val); - } - - default Children likeLeftIfPresent(String alias, KProperty column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); - } - - default Children notLikeLeftIfPresent(KProperty column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); - } - - default Children notLikeLeftIfPresent(String alias, KProperty column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); - } - - default Children likeRightIfPresent(KProperty column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); - } - - default Children likeRightIfPresent(String alias, KProperty column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); - } - - default Children notLikeRightIfPresent(KProperty column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); - } - - default Children notLikeRightIfPresent(String alias, KProperty column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java index 97f880d..d03e725 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java @@ -9,12 +9,12 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import com.github.yulichang.query.interfaces.CompareIfPresent; +import com.github.yulichang.query.interfaces.CompareIfExists; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.Asserts; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.ThrowOptional; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import lombok.Getter; import java.io.UnsupportedEncodingException; @@ -36,7 +36,7 @@ import java.util.stream.Collectors; @SuppressWarnings("unused") public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper> implements Query, T, SFunction>, StringJoin, T>, - CompareIfPresent, SFunction> { + CompareIfExists, SFunction> { /** * 查询字段 @@ -78,7 +78,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper tableNameFunc; @Getter - private BiPredicate ifPresent = ConfigProperties.ifPresent; + private BiPredicate ifExists = ConfigProperties.ifExists; /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -94,7 +94,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, List selectColumns, List ignoreColumns, boolean selectDistinct, - BiPredicate ifPresent) { + BiPredicate IfExists) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -108,7 +108,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractLambdaWrapper stringQuery() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns, - selectDistinct, ifPresent); + selectDistinct, ifExists); } @Override @@ -337,13 +337,13 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper setIfPresent(BiPredicate ifPresent) { - this.ifPresent = ifPresent; + public MPJLambdaQueryWrapper setIfExists(BiPredicate IfExists) { + this.ifExists = IfExists; return typedThis; } - public MPJLambdaQueryWrapper setIfPresent(Predicate ifPresent) { - this.ifPresent = (o, k) -> ifPresent.test(o); + public MPJLambdaQueryWrapper setIfExists(Predicate IfExists) { + this.ifExists = (o, k) -> IfExists.test(o); return typedThis; } @@ -355,7 +355,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper instance() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - null, null, selectDistinct, ifPresent); + null, null, selectDistinct, ifExists); } @Override @@ -391,7 +391,7 @@ public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper extends AbstractWrapper> implements Query, T, String>, StringJoin, T>, Chain, - CompareIfPresent, String> { + CompareIfExists, String> { /** * 查询字段 @@ -91,7 +91,7 @@ public class MPJQueryWrapper extends AbstractWrapper ifPresent = ConfigProperties.ifPresent; + private BiPredicate ifExists = ConfigProperties.ifExists; public MPJQueryWrapper() { @@ -124,7 +124,7 @@ public class MPJQueryWrapper extends AbstractWrapper selectColumns, List ignoreColumns, boolean selectDistinct, - BiPredicate ifPresent) { + BiPredicate IfExists) { super.setEntity(entity); setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -138,7 +138,7 @@ public class MPJQueryWrapper extends AbstractWrapper extends AbstractWrapper setIfPresent(BiPredicate ifPresent) { - this.ifPresent = ifPresent; + public MPJQueryWrapper setIfExists(BiPredicate IfExists) { + this.ifExists = IfExists; return this; } - public MPJQueryWrapper setIfPresent(Predicate ifPresent) { - this.ifPresent = (o, k) -> ifPresent.test(o); + public MPJQueryWrapper setIfExists(Predicate IfExists) { + this.ifExists = (o, k) -> IfExists.test(o); return this; } @@ -354,7 +354,7 @@ public class MPJQueryWrapper extends AbstractWrapper lambda() { return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs, - expression, lastSql, sqlComment, getSqlFirstField(), selectColumns, ignoreColumns, selectDistinct, ifPresent); + expression, lastSql, sqlComment, getSqlFirstField(), selectColumns, ignoreColumns, selectDistinct, ifExists); } @Override @@ -391,7 +391,7 @@ public class MPJQueryWrapper extends AbstractWrapper instance() { return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(), null, null, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - null, null, selectDistinct, ifPresent); + null, null, selectDistinct, ifExists); } @@ -402,7 +402,7 @@ public class MPJQueryWrapper extends AbstractWrapper比较值

+ * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareIfExists extends Compare { + + BiPredicate getIfExists(); + + /** + * 等于 = + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children eqIfExists(R column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), column, val); + } + + /** + * 不等于 <> + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children neIfExists(R column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), column, val); + } + + /** + * 大于 > + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children gtIfExists(R column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), column, val); + } + + /** + * 大于等于 >= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children geIfExists(R column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), column, val); + } + + /** + * 小于 < + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children ltIfExists(R column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), column, val); + } + + /** + * 小于等于 <= + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children leIfExists(R column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), column, val); + } + + /** + * LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeIfExists(R column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), column, val); + } + + /** + * NOT LIKE '%值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeIfExists(R column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), column, val); + } + + /** + * NOT LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeLeftIfExists(R column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); + } + + /** + * NOT LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children notLikeRightIfExists(R column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); + } + + /** + * LIKE '%值' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeLeftIfExists(R column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), column, val); + } + + /** + * LIKE '值%' + * + * @param column 字段 + * @param val 值 + * @return children + */ + default Children likeRightIfExists(R column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java deleted file mode 100644 index 06b9066..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/interfaces/CompareIfPresent.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.github.yulichang.query.interfaces; - -import com.baomidou.mybatisplus.core.conditions.interfaces.Compare; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * 查询条件封装 - *

比较值

- * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareIfPresent extends Compare { - - BiPredicate getIfPresent(); - - /** - * 等于 = - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children eqIfPresent(R column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), column, val); - } - - /** - * 不等于 <> - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children neIfPresent(R column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), column, val); - } - - /** - * 大于 > - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children gtIfPresent(R column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), column, val); - } - - /** - * 大于等于 >= - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children geIfPresent(R column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), column, val); - } - - /** - * 小于 < - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children ltIfPresent(R column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), column, val); - } - - /** - * 小于等于 <= - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children leIfPresent(R column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), column, val); - } - - /** - * LIKE '%值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeIfPresent(R column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), column, val); - } - - /** - * NOT LIKE '%值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeIfPresent(R column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), column, val); - } - - /** - * NOT LIKE '%值' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeLeftIfPresent(R column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); - } - - /** - * NOT LIKE '值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children notLikeRightIfPresent(R column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); - } - - /** - * LIKE '%值' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeLeftIfPresent(R column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), column, val); - } - - /** - * LIKE '值%' - * - * @param column 字段 - * @param val 值 - * @return children - */ - default Children likeRightIfPresent(R column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java index 785c690..e0f34de 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java @@ -18,7 +18,7 @@ import com.github.yulichang.toolkit.MPJSqlInjectionUtils; import com.github.yulichang.toolkit.Ref; import com.github.yulichang.toolkit.TableList; import com.github.yulichang.toolkit.sql.SqlScriptUtils; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; import com.github.yulichang.wrapper.interfaces.*; import lombok.Getter; @@ -42,8 +42,8 @@ import static java.util.stream.Collectors.joining; */ @SuppressWarnings({"unchecked", "unused", "DuplicatedCode"}) public abstract class JoinAbstractWrapper> extends Wrapper - implements CompareIfPresent, Nested, Join, Func, OnCompare, - CompareStrIfPresent, FuncStr { + implements CompareIfExists, Nested, Join, Func, OnCompare, + CompareStrIfExists, FuncStr { /** * 占位符 @@ -120,10 +120,10 @@ public abstract class JoinAbstractWrapper ifPresent = ConfigProperties.ifPresent; + protected BiPredicate ifExists = ConfigProperties.ifExists; @Override public T getEntity() { @@ -176,20 +176,20 @@ public abstract class JoinAbstractWrapper ifPresent) { - this.ifPresent = ifPresent; + public Children setIfExists(BiPredicate IfExists) { + this.ifExists = IfExists; return typedThis; } /** - * 设置 ifPresent - * .ifPresent(val -> val != null && StringUtils.isNotBlank(val)) + * 设置 IfExists + * .IfExists(val -> val != null && StringUtils.isNotBlank(val)) * - * @param ifPresent 判断 + * @param IfExists 判断 * @return Children */ - public Children setIfPresent(Predicate ifPresent) { - this.ifPresent = (obj, key) -> ifPresent.test(obj); + public Children setIfExists(Predicate IfExists) { + this.ifExists = (obj, key) -> IfExists.test(obj); return typedThis; } @@ -773,7 +773,7 @@ public abstract class JoinAbstractWrapper extends JoinAbstractLambdaWrapper paramNameValuePairs, MergeSegments mergeSegments, SharedString paramAlias, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, TableList tableList, Integer index, String keyWord, Class joinClass, String tableName, - BiPredicate ifPresent) { + BiPredicate IfExists) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; @@ -142,7 +142,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper extends JoinAbstractLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, new MergeSegments(), new SharedString(this.paramAlias .getStringValue()), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - new TableList(), null, null, null, null, ifPresent) { + new TableList(), null, null, null, null, ifExists) { }; wrapper.tableList.setAlias(st); wrapper.tableList.setRootClass(clazz); @@ -409,7 +409,7 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper instance(Integer index, String keyWord, Class joinClass, String tableName) { return new MPJLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, new MergeSegments(), this.paramAlias, SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - this.tableList, index, keyWord, joinClass, tableName, ifPresent); + this.tableList, index, keyWord, joinClass, tableName, ifExists); } @Override @@ -422,6 +422,6 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper extends Compare { + + BiPredicate getIfExists(); + + default Children eqIfExists(SFunction column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), null, column, val); + } + + default Children eqIfExists(String alias, SFunction column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), alias, column, val); + } + + default Children neIfExists(SFunction column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), null, column, val); + } + + default Children neIfExists(String alias, SFunction column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), alias, column, val); + } + + default Children gtIfExists(SFunction column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), null, column, val); + } + + default Children gtIfExists(String alias, SFunction column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), alias, column, val); + } + + default Children geIfExists(SFunction column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), null, column, val); + } + + default Children geIfExists(String alias, SFunction column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), alias, column, val); + } + + default Children ltIfExists(SFunction column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), null, column, val); + } + + default Children ltIfExists(String alias, SFunction column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), alias, column, val); + } + + default Children leIfExists(SFunction column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), null, column, val); + } + + default Children leIfExists(String alias, SFunction column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), alias, column, val); + } + + default Children likeIfExists(SFunction column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), null, column, val); + } + + default Children likeIfExists(String alias, SFunction column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), alias, column, val); + } + + default Children notLikeIfExists(SFunction column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), null, column, val); + } + + default Children notLikeIfExists(String alias, SFunction column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), alias, column, val); + } + + default Children likeLeftIfExists(SFunction column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), null, column, val); + } + + default Children likeLeftIfExists(String alias, SFunction column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), alias, column, val); + } + + default Children notLikeLeftIfExists(SFunction column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); + } + + default Children notLikeLeftIfExists(String alias, SFunction column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); + } + + default Children likeRightIfExists(SFunction column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), null, column, val); + } + + default Children likeRightIfExists(String alias, SFunction column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); + } + + default Children notLikeRightIfExists(SFunction column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); + } + + default Children notLikeRightIfExists(String alias, SFunction column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java deleted file mode 100644 index 28c493f..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareIfPresent.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.github.yulichang.wrapper.interfaces; - -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} - * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareIfPresent extends Compare { - - BiPredicate getIfPresent(); - - default Children eqIfPresent(SFunction column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), null, column, val); - } - - default Children eqIfPresent(String alias, SFunction column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), alias, column, val); - } - - default Children neIfPresent(SFunction column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), null, column, val); - } - - default Children neIfPresent(String alias, SFunction column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), alias, column, val); - } - - default Children gtIfPresent(SFunction column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), null, column, val); - } - - default Children gtIfPresent(String alias, SFunction column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), alias, column, val); - } - - default Children geIfPresent(SFunction column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), null, column, val); - } - - default Children geIfPresent(String alias, SFunction column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), alias, column, val); - } - - default Children ltIfPresent(SFunction column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), null, column, val); - } - - default Children ltIfPresent(String alias, SFunction column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), alias, column, val); - } - - default Children leIfPresent(SFunction column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), null, column, val); - } - - default Children leIfPresent(String alias, SFunction column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), alias, column, val); - } - - default Children likeIfPresent(SFunction column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), null, column, val); - } - - default Children likeIfPresent(String alias, SFunction column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), alias, column, val); - } - - default Children notLikeIfPresent(SFunction column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), null, column, val); - } - - default Children notLikeIfPresent(String alias, SFunction column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), alias, column, val); - } - - default Children likeLeftIfPresent(SFunction column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), null, column, val); - } - - default Children likeLeftIfPresent(String alias, SFunction column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), alias, column, val); - } - - default Children notLikeLeftIfPresent(SFunction column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), null, column, val); - } - - default Children notLikeLeftIfPresent(String alias, SFunction column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), alias, column, val); - } - - default Children likeRightIfPresent(SFunction column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), null, column, val); - } - - default Children likeRightIfPresent(String alias, SFunction column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), alias, column, val); - } - - default Children notLikeRightIfPresent(SFunction column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), null, column, val); - } - - default Children notLikeRightIfPresent(String alias, SFunction column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), alias, column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfExists.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfExists.java new file mode 100644 index 0000000..3a2b0b0 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfExists.java @@ -0,0 +1,65 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; + +import java.util.function.BiPredicate; + +/** + * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + * + * @author yulichang + * @since 1.4.9 + */ +@SuppressWarnings("unused") +public interface CompareStrIfExists extends CompareStr { + + BiPredicate getIfExists(); + + default Children eqIfExists(R column, Object val) { + return eq(getIfExists().test(val, IfExistsSqlKeyWordEnum.EQ), column, val); + } + + default Children neIfExists(R column, Object val) { + return ne(getIfExists().test(val, IfExistsSqlKeyWordEnum.NE), column, val); + } + + default Children gtIfExists(R column, Object val) { + return gt(getIfExists().test(val, IfExistsSqlKeyWordEnum.GT), column, val); + } + + default Children geIfExists(R column, Object val) { + return ge(getIfExists().test(val, IfExistsSqlKeyWordEnum.GE), column, val); + } + + default Children ltIfExists(R column, Object val) { + return lt(getIfExists().test(val, IfExistsSqlKeyWordEnum.LT), column, val); + } + + default Children leIfExists(R column, Object val) { + return le(getIfExists().test(val, IfExistsSqlKeyWordEnum.LE), column, val); + } + + default Children likeIfExists(R column, Object val) { + return like(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE), column, val); + } + + default Children notLikeIfExists(R column, Object val) { + return notLike(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE), column, val); + } + + default Children likeLeftIfExists(R column, Object val) { + return likeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_LEFT), column, val); + } + + default Children likeRightIfExists(R column, Object val) { + return likeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.LIKE_RIGHT), column, val); + } + + default Children notLikeLeftIfExists(R column, Object val) { + return notLikeLeft(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); + } + + default Children notLikeRightIfExists(R column, Object val) { + return notLikeRight(getIfExists().test(val, IfExistsSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); + } +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java deleted file mode 100644 index 04b77fd..0000000 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/CompareStrIfPresent.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.github.yulichang.wrapper.interfaces; - -import com.github.yulichang.wrapper.enums.IfPresentSqlKeyWordEnum; - -import java.util.function.BiPredicate; - -/** - * {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} - * - * @author yulichang - * @since 1.4.9 - */ -@SuppressWarnings("unused") -public interface CompareStrIfPresent extends CompareStr { - - BiPredicate getIfPresent(); - - default Children eqIfPresent(R column, Object val) { - return eq(getIfPresent().test(val, IfPresentSqlKeyWordEnum.EQ), column, val); - } - - default Children neIfPresent(R column, Object val) { - return ne(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NE), column, val); - } - - default Children gtIfPresent(R column, Object val) { - return gt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GT), column, val); - } - - default Children geIfPresent(R column, Object val) { - return ge(getIfPresent().test(val, IfPresentSqlKeyWordEnum.GE), column, val); - } - - default Children ltIfPresent(R column, Object val) { - return lt(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LT), column, val); - } - - default Children leIfPresent(R column, Object val) { - return le(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LE), column, val); - } - - default Children likeIfPresent(R column, Object val) { - return like(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE), column, val); - } - - default Children notLikeIfPresent(R column, Object val) { - return notLike(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE), column, val); - } - - default Children likeLeftIfPresent(R column, Object val) { - return likeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_LEFT), column, val); - } - - default Children likeRightIfPresent(R column, Object val) { - return likeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.LIKE_RIGHT), column, val); - } - - default Children notLikeLeftIfPresent(R column, Object val) { - return notLikeLeft(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_LEFT), column, val); - } - - default Children notLikeRightIfPresent(R column, Object val) { - return notLikeRight(getIfPresent().test(val, IfPresentSqlKeyWordEnum.NOT_LIKE_RIGHT), column, val); - } -} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index 5aae207..7c5381e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -30,7 +30,6 @@ import java.util.stream.Collectors; @SuppressWarnings({"unused", "DuplicatedCode"}) public interface Query extends Serializable { - List