链式调用

This commit is contained in:
yulichang 2023-03-15 19:56:48 +08:00
parent 79de988db6
commit 8a209a7595
7 changed files with 242 additions and 29 deletions

View File

@ -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<T> extends AbstractWrapper<T, String, MPJQueryWrapper<T>>
implements Query<MPJQueryWrapper<T>, T, String>, StringJoin<MPJQueryWrapper<T>, T> {
public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapper<T>> implements
Query<MPJQueryWrapper<T>, T, String>, StringJoin<MPJQueryWrapper<T>, T>, Chain<T> {
/**
* 查询字段
@ -260,7 +261,8 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
* 如果主表需要动态表名,主表实体必须添加 @DynamicTableName 注解
* 关联表则不需要 加不加注解都会生效
* <p>
* @see com.github.yulichang.annotation.DynamicTableName
*
* @see com.github.yulichang.annotation.DynamicTableName
*/
public MPJQueryWrapper<T> setTableName(Function<String, String> func) {
this.tableNameFunc = func;

View File

@ -11,31 +11,31 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
public class JoinWrappers {
/**
* JoinWrappers.<UserDO>queryJoin()
* JoinWrappers.<UserDO>query()
*/
public static <T> MPJQueryWrapper<T> queryJoin() {
public static <T> MPJQueryWrapper<T> query() {
return new MPJQueryWrapper<>();
}
/**
* JoinWrappers.<UserDO>queryJoin()
* JoinWrappers.<UserDO>query(User.class)
*/
public static <T> MPJQueryWrapper<T> queryJoin(Class<T> clazz) {
public static <T> MPJQueryWrapper<T> query(Class<T> clazz) {
return new MPJQueryWrapper<>(clazz);
}
/**
* JoinWrappers.<UserDO>lambdaJoin()
* JoinWrappers.<UserDO>lambda()
*/
public static <T> MPJLambdaWrapper<T> lambdaJoin() {
public static <T> MPJLambdaWrapper<T> lambda() {
return new MPJLambdaWrapper<>();
}
/**
* JoinWrappers.<UserDO>lambdaJoin()
* JoinWrappers.<UserDO>lambda(User.class)
*/
public static <T> MPJLambdaWrapper<T> lambdaJoin(Class<T> clazz) {
public static <T> MPJLambdaWrapper<T> lambda(Class<T> clazz) {
return new MPJLambdaWrapper<>(clazz);
}
}

View File

@ -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.<UserDO>queryJoin()
* 请使用 JoinWrappers
*
* @see JoinWrappers
*/
@Deprecated
public static <T> MPJQueryWrapper<T> queryJoin() {
return new MPJQueryWrapper<>();
}
public static <T> MPJQueryWrapper<T> queryJoin(Class<T> entityClass) {
return new MPJQueryWrapper<>(entityClass);
}
/**
* MPJWrappers.<UserDO>lambdaJoin()
* 请使用 JoinWrappers
*
* @see JoinWrappers
*/
@Deprecated
public static <T> MPJLambdaWrapper<T> lambdaJoin() {
return new MPJLambdaWrapper<>();
}
public static <T> MPJLambdaWrapper<T> lambdaJoin(Class<T> entityClass) {
return new MPJLambdaWrapper<>(entityClass);
}
}

View File

@ -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, T> R exec(Class<T> entityClass, Function<BaseMapper<T>, 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<T>) mapper);
}
public static <R, T> R execJoin(Class<T> entityClass, Function<MPJBaseMapper<T>, 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<T>) mapper);
}
}

View File

@ -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<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWrapper<T>>
implements Query<MPJLambdaWrapper<T>>, QueryJoin<MPJLambdaWrapper<T>, T>, QueryLabel<MPJLambdaWrapper<T>> {
public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWrapper<T>> implements
Query<MPJLambdaWrapper<T>>, QueryJoin<MPJLambdaWrapper<T>, T>, QueryLabel<MPJLambdaWrapper<T>>, Chain<T> {
/**
* 查询表

View File

@ -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.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*
* @author yulichang
* @since 1.4.4
*/
@SuppressWarnings({"unchecked", "unused"})
public interface Chain<T> {
Class<T> getEntityClass();
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default T one() {
return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectOne((Wrapper<T>) this));
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default <R> R one(Class<R> resultType) {
return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinOne(resultType, (MPJBaseJoin<T>) this));
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default T first() {
List<T> list = list();
return CollectionUtils.isEmpty(list) ? null : list.get(0);
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default <R> R first(Class<R> resultType) {
List<R> list = list(resultType);
return CollectionUtils.isEmpty(list) ? null : list.get(0);
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default List<T> list() {
return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectList((Wrapper<T>) this));
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default <R> List<R> list(Class<R> resultType) {
return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinList(resultType, (MPJBaseJoin<T>) this));
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default <P extends IPage<T>> P page(P page) {
return SqlHelper.exec(getEntityClass(), mapper -> mapper.selectPage(page, (Wrapper<T>) this));
}
/**
* 链式调用
* 构造方法不须传 class entity 否则会报错
* new MPJLambdaWrapper(User.class)
* new MPJQueryWrapper(User.class)
* MPJWrappers.\<User\>lambdaJoin(User.class)
* MPJWrappers.\<User\>queryJoin(User.class)
*/
default <R, P extends IPage<R>> P page(P page, Class<R> resultType) {
return SqlHelper.execJoin(getEntityClass(), mapper -> mapper.selectJoinPage(page, resultType, (MPJBaseJoin<T>) this));
}
}

View File

@ -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<UserDTO> page = new Page<>(1, 10);
page.setSearchCount(false);
IPage<UserDTO> 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<UserDTO> page = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class,
JoinWrappers.<UserDO>lambdaJoin()
JoinWrappers.<UserDO>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.<UserDO>lambdaJoin()
UserDTO one = userMapper.selectJoinOne(UserDTO.class, JoinWrappers.<UserDO>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<Map<String, Object>> list = userMapper.selectJoinMaps(JoinWrappers.<UserDO>lambdaJoin()
List<Map<String, Object>> list = userMapper.selectJoinMaps(JoinWrappers.<UserDO>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<UserDO> 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<UserDTO> 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);
}
}