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 f8c15f5..87fe8aa 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 @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.*; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.query.interfaces.StringJoin; import com.github.yulichang.toolkit.TableHelper; +import com.github.yulichang.wrapper.interfaces.Chain; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -30,8 +31,8 @@ import java.util.stream.Collectors; * @see com.github.yulichang.toolkit.JoinWrappers */ @SuppressWarnings("unused") -public class MPJQueryWrapper extends AbstractWrapper> - implements Query, T, String>, StringJoin, T> { +public class MPJQueryWrapper extends AbstractWrapper> implements + Query, T, String>, StringJoin, T>, Chain { /** * 查询字段 @@ -260,7 +261,8 @@ public class MPJQueryWrapper extends AbstractWrapper - * @see com.github.yulichang.annotation.DynamicTableName + * + * @see com.github.yulichang.annotation.DynamicTableName */ public MPJQueryWrapper setTableName(Function func) { this.tableNameFunc = func; 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 d87aa46..3ca5df2 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 @@ -11,31 +11,31 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; public class JoinWrappers { /** - * JoinWrappers.queryJoin() + * JoinWrappers.query() */ - public static MPJQueryWrapper queryJoin() { + public static MPJQueryWrapper query() { return new MPJQueryWrapper<>(); } /** - * JoinWrappers.queryJoin() + * JoinWrappers.query(User.class) */ - public static MPJQueryWrapper queryJoin(Class clazz) { + public static MPJQueryWrapper query(Class clazz) { return new MPJQueryWrapper<>(clazz); } /** - * JoinWrappers.lambdaJoin() + * JoinWrappers.lambda() */ - public static MPJLambdaWrapper lambdaJoin() { + public static MPJLambdaWrapper lambda() { return new MPJLambdaWrapper<>(); } /** - * JoinWrappers.lambdaJoin() + * JoinWrappers.lambda(User.class) */ - public static MPJLambdaWrapper lambdaJoin(Class clazz) { + public static MPJLambdaWrapper lambda(Class clazz) { return new MPJLambdaWrapper<>(clazz); } } 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 86eae8d..89e05b5 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 @@ -5,35 +5,32 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; /** * Wrapper 条件构造 - * 改名 JoinWrappers * * @author yulichang * @see JoinWrappers - * @deprecated */ -@Deprecated -@SuppressWarnings("DeprecatedIsStillUsed") +@SuppressWarnings("unused") public class MPJWrappers { /** * MPJWrappers.queryJoin() - * 请使用 JoinWrappers - * - * @see JoinWrappers */ - @Deprecated public static MPJQueryWrapper queryJoin() { return new MPJQueryWrapper<>(); } + public static MPJQueryWrapper queryJoin(Class entityClass) { + return new MPJQueryWrapper<>(entityClass); + } + /** * MPJWrappers.lambdaJoin() - * 请使用 JoinWrappers - * - * @see JoinWrappers */ - @Deprecated public static MPJLambdaWrapper lambdaJoin() { return new MPJLambdaWrapper<>(); } + + public static MPJLambdaWrapper lambdaJoin(Class entityClass) { + return new MPJLambdaWrapper<>(entityClass); + } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SqlHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SqlHelper.java new file mode 100644 index 0000000..91e7f1b --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/SqlHelper.java @@ -0,0 +1,36 @@ +package com.github.yulichang.toolkit; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.mapper.MPJTableMapperHelper; + +import java.util.function.Function; + +/** + * @author yulichang + * @see com.baomidou.mybatisplus.extension.toolkit.SqlHelper + * @since 1.4.4 + */ +@SuppressWarnings("unchecked") +public class SqlHelper { + + public static R exec(Class entityClass, Function, R> function) { + Assert.notNull(entityClass,"请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); + Class mapperClass = MPJTableMapperHelper.getMapper(entityClass); + Assert.notNull(mapperClass, "mapper not find by class <%s>", entityClass.getSimpleName()); + Object mapper = SpringContentUtils.getBean(mapperClass); + Assert.notNull(mapper, "mapper not init <%s>", entityClass.getSimpleName()); + return function.apply((BaseMapper) mapper); + } + + public static R execJoin(Class entityClass, Function, R> function) { + Assert.notNull(entityClass,"请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); + Class mapperClass = MPJTableMapperHelper.getMapper(entityClass); + Assert.notNull(mapperClass, "mapper not find by class <%s>", entityClass.getSimpleName()); + Object mapper = SpringContentUtils.getBean(mapperClass); + Assert.notNull(mapper, "mapper not init <%s>", entityClass.getSimpleName()); + Assert.isTrue(mapper instanceof MPJBaseMapper, "mapper not extends MPJBaseMapper <%s>", entityClass.getSimpleName()); + return function.apply((MPJBaseMapper) mapper); + } +} 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 692cb10..a494479 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 @@ -10,6 +10,7 @@ import com.github.yulichang.config.enums.LogicDelTypeEnum; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.*; import com.github.yulichang.toolkit.support.ColumnCache; +import com.github.yulichang.wrapper.interfaces.Chain; import com.github.yulichang.wrapper.interfaces.Query; import com.github.yulichang.wrapper.interfaces.QueryJoin; import com.github.yulichang.wrapper.interfaces.QueryLabel; @@ -33,8 +34,8 @@ import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; * @author yulichang */ @SuppressWarnings({"unused"}) -public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> - implements Query>, QueryJoin, T>, QueryLabel> { +public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper> implements + Query>, QueryJoin, T>, QueryLabel>, Chain { /** * 查询表 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 new file mode 100644 index 0000000..f60477b --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Chain.java @@ -0,0 +1,124 @@ +package com.github.yulichang.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.github.yulichang.interfaces.MPJBaseJoin; +import com.github.yulichang.toolkit.SqlHelper; + +import java.util.List; + +/** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + * + * @author yulichang + * @since 1.4.4 + */ +@SuppressWarnings({"unchecked", "unused"}) +public interface Chain { + + Class getEntityClass(); + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default T one() { + return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectOne((Wrapper) this)); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default R one(Class resultType) { + return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinOne(resultType, (MPJBaseJoin) this)); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default T first() { + List list = list(); + return CollectionUtils.isEmpty(list) ? null : list.get(0); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default R first(Class resultType) { + List list = list(resultType); + return CollectionUtils.isEmpty(list) ? null : list.get(0); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default List list() { + return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectList((Wrapper) this)); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default List list(Class resultType) { + return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinList(resultType, (MPJBaseJoin) this)); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(User.class) + */ + default

> P page(P page) { + return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectPage(page, (Wrapper) this)); + } + + /** + * 链式调用 + * 构造方法不须传 class 或 entity 否则会报错 + * new MPJLambdaWrapper(User.class) + * new MPJQueryWrapper(User.class) + * MPJWrappers.\lambdaJoin(User.class) + * MPJWrappers.\queryJoin(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-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 199d8f2..5d64e28 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 @@ -11,6 +11,7 @@ import com.github.yulichang.test.join.mapper.UserDTOMapper; import com.github.yulichang.test.join.mapper.UserMapper; import com.github.yulichang.test.util.ThreadLocalUtils; import com.github.yulichang.toolkit.JoinWrappers; +import com.github.yulichang.toolkit.MPJWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -558,7 +559,7 @@ class LambdaWrapperTest { Page page = new Page<>(1, 10); page.setSearchCount(false); IPage iPage = userMapper.selectJoinPage(page, UserDTO.class, - JoinWrappers.lambdaJoin(UserDO.class) + JoinWrappers.lambda(UserDO.class) .selectAll(UserDO.class) .select(AddressDO::getAddress) .select(AreaDO::getProvince) @@ -593,7 +594,7 @@ class LambdaWrapperTest { " AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)\n" + "LIMIT ?"); IPage page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, - JoinWrappers.lambdaJoin() + JoinWrappers.lambda() .selectAll(UserDO.class) .select(AddressDO::getAddress) .leftJoin(AddressDO.class, on -> on @@ -612,7 +613,7 @@ class LambdaWrapperTest { */ @Test void test4() { - UserDTO one = userMapper.selectJoinOne(UserDTO.class, JoinWrappers.lambdaJoin() + UserDTO one = userMapper.selectJoinOne(UserDTO.class, JoinWrappers.lambda() .selectSum(UserDO::getId) .selectMax(UserDO::getId, UserDTO::getHeadImg) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); @@ -653,7 +654,7 @@ class LambdaWrapperTest { */ @Test void test7() { - List> list = userMapper.selectJoinMaps(JoinWrappers.lambdaJoin() + List> list = userMapper.selectJoinMaps(JoinWrappers.lambda() .selectAll(UserDO.class) .select(AddressDO::getAddress) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId)); @@ -794,4 +795,56 @@ class LambdaWrapperTest { assert list.get(0).getAddressList() != null && list.get(0).getAddressList().get(0).getId() != null; list.forEach(System.out::println); } + + /** + * wrappers 测试 + */ + @Test + void 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"); + MPJLambdaWrapper wrapper = MPJWrappers.lambdaJoin(UserDO.class) + .logicDelToOn() + .selectAll(UserDO.class) + .selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr + .association(AreaDO.class, AddressDTO::getArea)) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .leftJoin(AreaDO.class, AreaDO::getId, AddressDO::getAreaId) + .le(UserDO::getId, 10000) + .orderByDesc(UserDO::getId); + + List list = wrapper.list(UserDTO.class); + + System.out.println(list); + assert list.get(0).getAddressList() != null && list.get(0).getAddressList().get(0).getId() != null; + list.forEach(System.out::println); + } }