mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
链式调用
This commit is contained in:
parent
79de988db6
commit
8a209a7595
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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> {
|
||||
|
||||
/**
|
||||
* 查询表
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user