优化代码

This commit is contained in:
yulichang 2024-10-07 17:10:41 +08:00
parent 8495c7c153
commit 6a5983aad4
14 changed files with 981 additions and 916 deletions

View File

@ -1,5 +1,8 @@
package com.github.yulichang.adapter.base.tookit; package com.github.yulichang.adapter.base.tookit;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
/** /**
* 版本工具类 * 版本工具类
* *
@ -8,8 +11,24 @@ package com.github.yulichang.adapter.base.tookit;
*/ */
public class VersionUtils { public class VersionUtils {
public static String version = MybatisPlusVersion.getVersion();
@SuppressWarnings("unused")
public static void setMybatisPlusVersion(String version) {
VersionUtils.version = version;
}
public static String getVersion() {
if (version != null) {
return version;
} else {
throw ExceptionUtils.mpe("mybatis-plus version is blank, " +
"please add VersionUtils.setMybatisPlusVersion(?) code before running application");
}
}
public static int compare(String v1, String v2) { public static int compare(String v1, String v2) {
String[] v1s = v1.split("\\."); String[] v1s = v1.split("-")[0].split("\\.");
String[] v2s = v2.split("\\."); String[] v2s = v2.split("\\.");
String[] vs = v1s.length > v2s.length ? v2s : v1s; String[] vs = v1s.length > v2s.length ? v2s : v1s;

View File

@ -1,6 +1,5 @@
package com.github.yulichang.adapter.v33x; 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.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringPool;
@ -28,7 +27,7 @@ import java.util.function.Supplier;
*/ */
public class Adapter33x implements IAdapter { public class Adapter33x implements IAdapter {
private static final boolean is330 = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.3.0") == 0; private static final boolean is330 = VersionUtils.compare(VersionUtils.getVersion(), "3.3.0") == 0;
@Override @Override
public boolean mpjHasLogic(TableInfo tableInfo) { public boolean mpjHasLogic(TableInfo tableInfo) {

View File

@ -1,6 +1,5 @@
package com.github.yulichang.adapter.v3431; package com.github.yulichang.adapter.v3431;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringPool;
@ -29,7 +28,7 @@ import java.util.stream.Collectors;
@AllArgsConstructor @AllArgsConstructor
public class Adapter3431 implements IAdapter { public class Adapter3431 implements IAdapter {
private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") < 0; private static final boolean v = VersionUtils.compare(VersionUtils.getVersion(), "3.4.3") < 0;
@Override @Override
public String mpjMapping(TableFieldInfo tableFieldInfo) { public String mpjMapping(TableFieldInfo tableFieldInfo) {

View File

@ -1,6 +1,5 @@
package com.github.yulichang.adapter; package com.github.yulichang.adapter;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.github.yulichang.adapter.base.IAdapter; import com.github.yulichang.adapter.base.IAdapter;
import com.github.yulichang.adapter.base.tookit.VersionUtils; import com.github.yulichang.adapter.base.tookit.VersionUtils;
@ -23,7 +22,7 @@ public class AdapterHelper {
static { static {
String lastAdapter = "3.5.8"; String lastAdapter = "3.5.8";
String version = Optional.ofNullable(MybatisPlusVersion.getVersion()).orElse(lastAdapter); String version = Optional.ofNullable(VersionUtils.getVersion()).orElse(lastAdapter);
if (VersionUtils.compare(version, "3.5.6") >= 0) { if (VersionUtils.compare(version, "3.5.6") >= 0) {
adapter = new Adapter(); adapter = new Adapter();

View File

@ -0,0 +1,137 @@
package com.github.yulichang.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.toolkit.Constant;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* join相关方法
*
* @author yulichang
*/
public interface JoinMapper<T> {
/**
* 根据 Wrapper 条件连表删除
*
* @param wrapper joinWrapper
*/
int deleteJoin(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 whereEntity 条件更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
int updateJoin(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 whereEntity 条件更新记录 (null字段也会更新 !!!)
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
int updateJoinAndNull(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 Wrapper 条件查询总记录数
*
* @param wrapper joinWrapper
*/
Long selectJoinCount(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回一条记录
*
* @param wrapper joinWrapper
* @return T
*/
default T selectJoinOne(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinOne(null, wrapper);
}
/**
* 连表查询返回一条记录
*
* @param wrapper joinWrapper
* @param clazz resultType
*/
<DTO> DTO selectJoinOne(@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map
*
* @param wrapper joinWrapper
*/
default Map<String, Object> selectJoinMap(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked
return selectJoinOne(Map.class, wrapper);
}
/**
* 连表查询返回记录集合
*
* @param wrapper joinWrapper
* @return List&lt;T&gt;
*/
default List<T> selectJoinList(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinList(null, wrapper);
}
/**
* 连表查询返回记录集合
*
* @param wrapper joinWrapper
* @param clazz resultType
*/
<DTO> List<DTO> selectJoinList(@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map集合
*
* @param wrapper joinWrapper
*/
default List<Map<String, Object>> selectJoinMaps(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked
return (List<Map<String, Object>>) ((Object) selectJoinList(Map.class, wrapper));
}
/**
* 连表查询返回记录集合并分页
*
* @param wrapper joinWrapper
*/
default <P extends IPage<T>> P selectJoinPage(P page, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinPage(page, null, wrapper);
}
/**
* 连表查询返回记录集合并分页
*
* @param wrapper joinWrapper
* @param clazz resultType
* @param <DTO> 分页返回对象
*/
<DTO, P extends IPage<DTO>> P selectJoinPage(P page,
@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map集合并分页
*
* @param wrapper joinWrapper
*/
default <P extends IPage<Map<String, Object>>> P selectJoinMapsPage(P page,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked,rawtypes
return (P) selectJoinPage((IPage) page, Map.class, wrapper);
}
}

View File

@ -0,0 +1,93 @@
package com.github.yulichang.base;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.github.yulichang.interfaces.MPJBaseJoin;
import java.util.List;
import java.util.Map;
@SuppressWarnings({"unchecked", "unused"})
public interface JoinService<T> {
BaseMapper<T> getBaseMapper();
/**
* 根据 Wrapper 条件连表删除
*
* @param wrapper joinWrapper
*/
default boolean deleteJoin(MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((JoinMapper<T>) getBaseMapper()).deleteJoin(wrapper));
}
/**
* 根据 whereEntity 条件更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
default boolean updateJoin(T entity, MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((JoinMapper<T>) getBaseMapper()).updateJoin(entity, wrapper));
}
/**
* 根据 whereEntity 条件更新记录 (null字段也会更新 !!!)
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
default boolean updateJoinAndNull(T entity, MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((JoinMapper<T>) getBaseMapper()).updateJoinAndNull(entity, wrapper));
}
/**
* 根据 Wrapper 条件查询总记录数
*/
default Long selectJoinCount(MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinCount(wrapper);
}
/**
* 连接查询返回一条记录
*/
default <DTO> DTO selectJoinOne(Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinOne(clazz, wrapper);
}
/**
* 连接查询返回集合
*/
default <DTO> List<DTO> selectJoinList(Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinList(clazz, wrapper);
}
/**
* 连接查询返回集合并分页
*/
default <DTO, P extends IPage<DTO>> P selectJoinListPage(P page, Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinPage(page, clazz, wrapper);
}
/**
* 连接查询返回Map
*/
default Map<String, Object> selectJoinMap(MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinMap(wrapper);
}
/**
* 连接查询返回Map集合
*/
default List<Map<String, Object>> selectJoinMaps(MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinMaps(wrapper);
}
/**
* 连接查询返回Map集合并分页
*/
default <P extends IPage<Map<String, Object>>> P selectJoinMapsPage(P page, MPJBaseJoin<T> wrapper) {
return ((JoinMapper<T>) getBaseMapper()).selectJoinMapsPage(page, wrapper);
}
}

View File

@ -1,137 +1,11 @@
package com.github.yulichang.base; package com.github.yulichang.base;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.toolkit.Constant;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/** /**
* @author yulichang * @author yulichang
* @see BaseMapper * @see BaseMapper
*/ */
public interface MPJBaseMapper<T> extends BaseMapper<T> { public interface MPJBaseMapper<T> extends BaseMapper<T>, JoinMapper<T> {
/**
* 根据 Wrapper 条件连表删除
*
* @param wrapper joinWrapper
*/
int deleteJoin(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 whereEntity 条件更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
int updateJoin(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 whereEntity 条件更新记录 (null字段也会更新 !!!)
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
int updateJoinAndNull(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 根据 Wrapper 条件查询总记录数
*
* @param wrapper joinWrapper
*/
Long selectJoinCount(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回一条记录
*
* @param wrapper joinWrapper
* @return T
*/
default T selectJoinOne(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinOne(null, wrapper);
}
/**
* 连表查询返回一条记录
*
* @param wrapper joinWrapper
* @param clazz resultType
*/
<DTO> DTO selectJoinOne(@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map
*
* @param wrapper joinWrapper
*/
default Map<String, Object> selectJoinMap(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked
return selectJoinOne(Map.class, wrapper);
}
/**
* 连表查询返回记录集合
*
* @param wrapper joinWrapper
* @return List&lt;T&gt;
*/
default List<T> selectJoinList(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinList(null, wrapper);
}
/**
* 连表查询返回记录集合
*
* @param wrapper joinWrapper
* @param clazz resultType
*/
<DTO> List<DTO> selectJoinList(@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map集合
*
* @param wrapper joinWrapper
*/
default List<Map<String, Object>> selectJoinMaps(@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked
return (List<Map<String, Object>>) ((Object) selectJoinList(Map.class, wrapper));
}
/**
* 连表查询返回记录集合并分页
*
* @param wrapper joinWrapper
*/
default <P extends IPage<T>> P selectJoinPage(P page, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
return selectJoinPage(page, null, wrapper);
}
/**
* 连表查询返回记录集合并分页
*
* @param wrapper joinWrapper
* @param clazz resultType
* @param <DTO> 分页返回对象
*/
<DTO, P extends IPage<DTO>> P selectJoinPage(P page,
@Param(Constant.CLAZZ) Class<DTO> clazz,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper);
/**
* 连表查询返回Map集合并分页
*
* @param wrapper joinWrapper
*/
default <P extends IPage<Map<String, Object>>> P selectJoinMapsPage(P page,
@Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
//noinspection unchecked,rawtypes
return (P) selectJoinPage((IPage) page, Map.class, wrapper);
}
} }

View File

@ -1,12 +1,6 @@
package com.github.yulichang.base; package com.github.yulichang.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.github.yulichang.interfaces.MPJBaseJoin;
import java.util.List;
import java.util.Map;
/** /**
* 基础service * 基础service
@ -15,84 +9,6 @@ import java.util.Map;
* @author yulichang * @author yulichang
*/ */
@SuppressWarnings({"unused"}) @SuppressWarnings({"unused"})
public interface MPJBaseService<T> extends IService<T> { public interface MPJBaseService<T> extends IService<T>, JoinService<T> {
/**
* 根据 Wrapper 条件连表删除
*
* @param wrapper joinWrapper
*/
default boolean deleteJoin(MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((MPJBaseMapper<T>) getBaseMapper()).deleteJoin(wrapper));
}
/**
* 根据 whereEntity 条件更新记录
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
default boolean updateJoin(T entity, MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((MPJBaseMapper<T>) getBaseMapper()).updateJoin(entity, wrapper));
}
/**
* 根据 whereEntity 条件更新记录 (null字段也会更新 !!!)
*
* @param entity 实体对象 (set 条件值,可以为 null)
* @param wrapper 实体对象封装操作类可以为 null,里面的 entity 用于生成 where 语句
*/
default boolean updateJoinAndNull(T entity, MPJBaseJoin<T> wrapper) {
return SqlHelper.retBool(((MPJBaseMapper<T>) getBaseMapper()).updateJoinAndNull(entity, wrapper));
}
/**
* 根据 Wrapper 条件查询总记录数
*/
default Long selectJoinCount(MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinCount(wrapper);
}
/**
* 连接查询返回一条记录
*/
default <DTO> DTO selectJoinOne(Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinOne(clazz, wrapper);
}
/**
* 连接查询返回集合
*/
default <DTO> List<DTO> selectJoinList(Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinList(clazz, wrapper);
}
/**
* 连接查询返回集合并分页
*/
default <DTO, P extends IPage<DTO>> P selectJoinListPage(P page, Class<DTO> clazz, MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinPage(page, clazz, wrapper);
}
/**
* 连接查询返回Map
*/
default Map<String, Object> selectJoinMap(MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinMap(wrapper);
}
/**
* 连接查询返回Map集合
*/
default List<Map<String, Object>> selectJoinMaps(MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinMaps(wrapper);
}
/**
* 连接查询返回Map集合并分页
*/
default <P extends IPage<Map<String, Object>>> P selectJoinMapsPage(P page, MPJBaseJoin<T> wrapper) {
return ((MPJBaseMapper<T>) getBaseMapper()).selectJoinMapsPage(page, wrapper);
}
} }

View File

@ -1,6 +1,5 @@
package com.github.yulichang.injector; package com.github.yulichang.injector;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
@ -59,7 +58,7 @@ public class MPJSqlInjector extends DefaultSqlInjector {
@Deprecated @Deprecated
@SuppressWarnings({"unused", "DeprecatedIsStillUsed"}) @SuppressWarnings({"unused", "DeprecatedIsStillUsed"})
public List<AbstractMethod> getMethodList(Class<?> mapperClass) { public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.2") >= 0) { if (VersionUtils.compare(VersionUtils.getVersion(), "3.4.3.2") >= 0) {
throw ExceptionUtils.mpe("DefaultSqlInjector 的 getMethodList(Class<?> mapperClass) 方法已在 3.4.3.2+ 改为" + throw ExceptionUtils.mpe("DefaultSqlInjector 的 getMethodList(Class<?> mapperClass) 方法已在 3.4.3.2+ 改为" +
"getMethodList(Class<?> mapperClass, TableInfo tableInfo)\n"); "getMethodList(Class<?> mapperClass, TableInfo tableInfo)\n");
} }
@ -128,7 +127,7 @@ public class MPJSqlInjector extends DefaultSqlInjector {
private List<AbstractMethod> getJoinMethod() { private List<AbstractMethod> getJoinMethod() {
List<AbstractMethod> list = new ArrayList<>(); List<AbstractMethod> list = new ArrayList<>();
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.5.0") >= 0) { if (VersionUtils.compare(VersionUtils.getVersion(), "3.5.0") >= 0) {
list.add(new DeleteJoin(SqlMethod.DELETE_JOIN.getMethod())); list.add(new DeleteJoin(SqlMethod.DELETE_JOIN.getMethod()));
list.add(new UpdateJoin(SqlMethod.UPDATE_JOIN.getMethod())); list.add(new UpdateJoin(SqlMethod.UPDATE_JOIN.getMethod()));
list.add(new UpdateJoinAndNull(SqlMethod.UPDATE_JOIN_AND_NULL.getMethod())); list.add(new UpdateJoinAndNull(SqlMethod.UPDATE_JOIN_AND_NULL.getMethod()));

View File

@ -1,6 +1,5 @@
package com.github.yulichang.interceptor; package com.github.yulichang.interceptor;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@ -46,7 +45,7 @@ import java.util.concurrent.ConcurrentHashMap;
@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class MPJInterceptor implements Interceptor { public class MPJInterceptor implements Interceptor {
private static final boolean v = VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3.1") > 0; private static final boolean v = VersionUtils.compare(VersionUtils.getVersion(), "3.4.3.1") > 0;
private static final List<ResultMapping> EMPTY_RESULT_MAPPING = new ArrayList<>(0); private static final List<ResultMapping> EMPTY_RESULT_MAPPING = new ArrayList<>(0);

View File

@ -1,6 +1,5 @@
package com.github.yulichang.query; package com.github.yulichang.query;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.SharedString;
import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.Query;
@ -102,7 +101,7 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
try { try {
super.setEntityClass(clazz); super.setEntityClass(clazz);
} catch (NoSuchMethodError error) { } catch (NoSuchMethodError error) {
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.3.0") > 0) { if (VersionUtils.compare(VersionUtils.getVersion(), "3.3.0") > 0) {
throw error; throw error;
} }
} }

View File

@ -1,7 +1,7 @@
package com.github.yulichang.toolkit; package com.github.yulichang.toolkit;
import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.github.yulichang.base.MPJBaseMapper; import com.github.yulichang.base.JoinMapper;
import java.util.function.Function; import java.util.function.Function;
@ -13,11 +13,11 @@ import java.util.function.Function;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class SqlHelper { public final class SqlHelper {
public static <R, T> R exec(Class<T> entityClass, Function<MPJBaseMapper<T>, R> function) { public static <R, T> R exec(Class<T> entityClass, Function<JoinMapper<T>, R> function) {
Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法"); Assert.notNull(entityClass, "请使用 new MPJLambdaWrapper(主表.class) 或 JoinWrappers.lambda(主表.class) 构造方法");
Object mapper = SpringContentUtils.getMapper(entityClass); Object mapper = SpringContentUtils.getMapper(entityClass);
Assert.notNull(mapper, "mapper not init <%s>", entityClass.getSimpleName()); Assert.notNull(mapper, "mapper not init <%s>", entityClass.getSimpleName());
Assert.isTrue(mapper instanceof MPJBaseMapper, "mapper <%s> not extends MPJBaseMapper ", entityClass.getSimpleName()); Assert.isTrue(mapper instanceof JoinMapper, "mapper <%s> not extends MPJBaseMapper ", entityClass.getSimpleName());
return function.apply((MPJBaseMapper<T>) mapper); return function.apply((JoinMapper<T>) mapper);
} }
} }

View File

@ -1,6 +1,5 @@
package com.github.yulichang.test.join; 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.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@ -86,38 +85,39 @@ class LambdaWrapperTest {
@Test @Test
void testJoin() { void testJoin() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false\n" + AND t1.del = false
" AND (t.id <= ?)\n" + AND t2.del = false
"ORDER BY t.id DESC"); AND (t.id <= ?)
ORDER BY t.id DESC""");
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class) .selectAll(UserDO.class)
.selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr .selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr
@ -139,25 +139,26 @@ class LambdaWrapperTest {
@Test @Test
void testJoinField() { void testJoinField() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id\n" + t.update_by,
"FROM `user` t\n" + t1.id AS joina_id
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
" AND t1.del = false\n" + WHERE t.del = false
" AND (t.id <= ?)\n" + AND t1.del = false
"ORDER BY t.id DESC"); AND (t.id <= ?)
ORDER BY t.id DESC""");
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class) .selectAll(UserDO.class)
@ -176,37 +177,38 @@ class LambdaWrapperTest {
@Test @Test
void testJoin1() { void testJoin1() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false\n" + AND t1.del = false
"ORDER BY t.id DESC"); AND t2.del = false
ORDER BY t.id DESC""");
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class) .selectAll(UserDO.class)
.selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr .selectCollection(AddressDO.class, UserDTO::getAddressList, addr -> addr
@ -225,13 +227,14 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void testWrapper() { void testWrapper() {
ThreadLocalUtils.set("SELECT t.id\n" + ThreadLocalUtils.set("""
"FROM `user` t\n" + SELECT t.id
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false"); AND t1.del = false
AND t2.del = false""");
//基本数据类型 String //基本数据类型 String
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.select(UserDO::getId) .select(UserDO::getId)
@ -243,13 +246,14 @@ class LambdaWrapperTest {
System.out.println(list); System.out.println(list);
ThreadLocalUtils.set("SELECT t.create_time\n" + ThreadLocalUtils.set("""
"FROM `user` t\n" + SELECT t.create_time
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false"); AND t1.del = false
AND t2.del = false""");
//java.sql包下的类 //java.sql包下的类
MPJLambdaWrapper<UserDO> wrapper1 = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper1 = new MPJLambdaWrapper<UserDO>()
.select(UserDO::getCreateTime) .select(UserDO::getCreateTime)
@ -264,23 +268,24 @@ class LambdaWrapperTest {
@Test @Test
void testMSCache() { void testMSCache() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by\n" + t.create_by,
"FROM `user` t\n" + t.update_by
"WHERE t.id = ?\n" + FROM `user` t
" AND t.del = false\n" + WHERE t.id = ?
" AND (t.id <= ?)\n" + AND t.del = false
"ORDER BY t.id ASC, t.`name` ASC"); AND (t.id <= ?)
ORDER BY t.id ASC, t.`name` ASC""");
UserDO userDO = new UserDO(); UserDO userDO = new UserDO();
userDO.setId(1); userDO.setId(1);
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<>(userDO) MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<>(userDO)
@ -297,21 +302,22 @@ class LambdaWrapperTest {
@Test @Test
void testTableAliasR() { void testTableAliasR() {
ThreadLocalUtils.set("SELECT tt.id,\n" + ThreadLocalUtils.set("""
" tt.user_id,\n" + SELECT tt.id,
" tt.create_by,\n" + tt.user_id,
" tt.update_by,\n" + tt.create_by,
" ua.`name` AS userName,\n" + tt.update_by,
" ub.`name` AS createName,\n" + ua.`name` AS userName,
" uc.`name` AS updateName\n" + ub.`name` AS createName,
"FROM user_dto tt\n" + uc.`name` AS updateName
" LEFT JOIN `user` ua ON (ua.id = tt.user_id)\n" + FROM user_dto tt
" LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + LEFT JOIN `user` ua ON (ua.id = tt.user_id)
" LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + LEFT JOIN `user` ub ON (ub.id = tt.create_by)
"WHERE ua.del = false\n" + LEFT JOIN `user` uc ON (uc.id = tt.update_by)
" AND ub.del = false\n" + WHERE ua.del = false
" AND uc.del = false\n" + AND ub.del = false
" AND (ua.id <= ? AND ub.id >= ?)"); AND uc.del = false
AND (ua.id <= ? AND ub.id >= ?)""");
MPJLambdaWrapper<UserDto> wrapper = new MPJLambdaWrapper<UserDto>("tt") MPJLambdaWrapper<UserDto> wrapper = new MPJLambdaWrapper<UserDto>("tt")
.selectAll(UserDto.class) .selectAll(UserDto.class)
.leftJoin(UserDO.class, "ua", UserDO::getId, UserDto::getUserId, ext -> ext .leftJoin(UserDO.class, "ua", UserDO::getId, UserDto::getUserId, ext -> ext
@ -328,29 +334,30 @@ class LambdaWrapperTest {
assert StringUtils.isNotBlank(userDtos.get(0).getUpdateName()); assert StringUtils.isNotBlank(userDtos.get(0).getUpdateName());
ThreadLocalUtils.set("SELECT tt.id,\n" + ThreadLocalUtils.set("""
" tt.pid,\n" + SELECT tt.id,
" tt.`name`,\n" + tt.pid,
" tt.`json`,\n" + tt.`name`,
" tt.sex,\n" + tt.`json`,
" tt.head_img,\n" + tt.sex,
" tt.create_time,\n" + tt.head_img,
" tt.address_id,\n" + tt.create_time,
" tt.address_id2,\n" + tt.address_id,
" tt.del,\n" + tt.address_id2,
" tt.create_by,\n" + tt.del,
" tt.update_by,\n" + tt.create_by,
" ua.id,\n" + tt.update_by,
" ub.head_img\n" + ua.id,
"FROM `user` tt\n" + ub.head_img
" LEFT JOIN `user` ua ON (ua.id = tt.pid)\n" + FROM `user` tt
" LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + LEFT JOIN `user` ua ON (ua.id = tt.pid)
" LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + LEFT JOIN `user` ub ON (ub.id = tt.create_by)
"WHERE tt.del = false\n" + LEFT JOIN `user` uc ON (uc.id = tt.update_by)
" AND ua.del = false\n" + WHERE tt.del = false
" AND ub.del = false\n" + AND ua.del = false
" AND uc.del = false\n" + AND ub.del = false
" AND (ua.head_img = tt.`name` AND tt.id = ua.id)"); AND uc.del = false
AND (ua.head_img = tt.`name` AND tt.id = ua.id)""");
MPJLambdaWrapper<UserDO> w = new MPJLambdaWrapper<UserDO>("tt") MPJLambdaWrapper<UserDO> w = new MPJLambdaWrapper<UserDO>("tt")
.selectAll(UserDO.class) .selectAll(UserDO.class)
.leftJoin(UserDO.class, "ua", UserDO::getId, UserDO::getPid, ext -> ext .leftJoin(UserDO.class, "ua", UserDO::getId, UserDO::getPid, ext -> ext
@ -369,34 +376,35 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void testInner() { void testInner() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.pid AS joina_pid,\n" + t1.id AS joina_id,
" t1.`name` AS joina_name,\n" + t1.pid AS joina_pid,
" t1.`json` AS joina_json,\n" + t1.`name` AS joina_name,
" t1.sex AS joina_sex,\n" + t1.`json` AS joina_json,
" t1.head_img AS joina_head_img,\n" + t1.sex AS joina_sex,
" t1.create_time AS joina_create_time,\n" + t1.head_img AS joina_head_img,
" t1.address_id AS joina_address_id,\n" + t1.create_time AS joina_create_time,
" t1.address_id2 AS joina_address_id2,\n" + t1.address_id AS joina_address_id,
" t1.del AS joina_del,\n" + t1.address_id2 AS joina_address_id2,
" t1.create_by AS joina_create_by,\n" + t1.del AS joina_del,
" t1.update_by AS joina_update_by\n" + t1.create_by AS joina_create_by,
"FROM `user` t\n" + t1.update_by AS joina_update_by
" LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN `user` t1 ON (t1.pid = t.id)
" AND (t.id > ?)"); WHERE t.del = false
AND (t.id > ?)""");
//自连接 //自连接
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.disableSubLogicDel()//关闭副表逻辑删除 .disableSubLogicDel()//关闭副表逻辑删除
@ -407,24 +415,25 @@ class LambdaWrapperTest {
List<UserDO> list = userMapper.selectJoinList(UserDO.class, wrapper.clone()); List<UserDO> list = userMapper.selectJoinList(UserDO.class, wrapper.clone());
System.out.println(list); System.out.println(list);
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.`name` AS createName,\n" + t.update_by,
" t2.`name` AS updateName\n" + t1.`name` AS createName,
"FROM `user` t\n" + t2.`name` AS updateName
" LEFT JOIN `user` t1 ON (t1.id = t.create_by)\n" + FROM `user` t
" LEFT JOIN `user` t2 ON (t2.id = t.update_by)\n" + LEFT JOIN `user` t1 ON (t1.id = t.create_by)
"WHERE (t2.id = t.update_by AND t.id = t1.id)"); LEFT JOIN `user` t2 ON (t2.id = t.update_by)
WHERE (t2.id = t.update_by AND t.id = t1.id)""");
//关联一张表多次 //关联一张表多次
MPJLambdaWrapper<UserDO> w = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> w = new MPJLambdaWrapper<UserDO>()
.disableLogicDel() .disableLogicDel()
@ -442,48 +451,49 @@ class LambdaWrapperTest {
assert dos.get(0).getCreateName() != null && dos.get(0).getUpdateName() != null; assert dos.get(0).getCreateName() != null && dos.get(0).getUpdateName() != null;
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.`name` AS alias,\n" + t.update_by,
" t1.id AS joina_id,\n" + t1.`name` AS alias,
" t1.pid AS joina_pid,\n" + t1.id AS joina_id,
" t1.`name` AS joina_name,\n" + t1.pid AS joina_pid,
" t1.`json` AS joina_json,\n" + t1.`name` AS joina_name,
" t1.sex AS joina_sex,\n" + t1.`json` AS joina_json,
" t1.head_img AS joina_head_img,\n" + t1.sex AS joina_sex,
" t1.create_time AS joina_create_time,\n" + t1.head_img AS joina_head_img,
" t1.address_id AS joina_address_id,\n" + t1.create_time AS joina_create_time,
" t1.address_id2 AS joina_address_id2,\n" + t1.address_id AS joina_address_id,
" t1.del AS joina_del,\n" + t1.address_id2 AS joina_address_id2,
" t1.create_by AS joina_create_by,\n" + t1.del AS joina_del,
" t1.update_by AS joina_update_by,\n" + t1.create_by AS joina_create_by,
" t2.id AS joinb_id,\n" + t1.update_by AS joina_update_by,
" t2.pid AS joinb_pid,\n" + t2.id AS joinb_id,
" t2.`name` AS joinb_name,\n" + t2.pid AS joinb_pid,
" t2.`json` AS joinb_json,\n" + t2.`name` AS joinb_name,
" t2.sex AS joinb_sex,\n" + t2.`json` AS joinb_json,
" t2.head_img AS joinb_head_img,\n" + t2.sex AS joinb_sex,
" t2.create_time AS joinb_create_time,\n" + t2.head_img AS joinb_head_img,
" t2.address_id AS joinb_address_id,\n" + t2.create_time AS joinb_create_time,
" t2.address_id2 AS joinb_address_id2,\n" + t2.address_id AS joinb_address_id,
" t2.del AS joinb_del,\n" + t2.address_id2 AS joinb_address_id2,
" t2.create_by AS joinb_create_by,\n" + t2.del AS joinb_del,
" t2.update_by AS joinb_update_by\n" + t2.create_by AS joinb_create_by,
"FROM `user` t\n" + t2.update_by AS joinb_update_by
" LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + FROM `user` t
" LEFT JOIN `user` t2 ON (t2.pid = t1.id)\n" + LEFT JOIN `user` t1 ON (t1.pid = t.id)
"WHERE t.del = false\n" + LEFT JOIN `user` t2 ON (t2.pid = t1.id)
" AND (t1.id <= ? AND t.id <= ?)"); WHERE t.del = false
AND (t1.id <= ? AND t.id <= ?)""");
MPJLambdaWrapper<UserDO> wrapper1 = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper1 = new MPJLambdaWrapper<UserDO>()
.disableSubLogicDel() .disableSubLogicDel()
.selectAll(UserDO.class) .selectAll(UserDO.class)
@ -562,28 +572,29 @@ class LambdaWrapperTest {
@Test @Test
void testTableAlias() { void testTableAlias() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" aa.id,\n" + t.update_by,
" aa.user_id,\n" + aa.id,
" aa.area_id,\n" + aa.user_id,
" aa.tel,\n" + aa.area_id,
" aa.address,\n" + aa.tel,
" aa.del\n" + aa.address,
"FROM `user` t\n" + aa.del
" LEFT JOIN address aa ON (aa.user_id = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address aa ON (aa.user_id = t.id)
" AND aa.del = false"); WHERE t.del = false
AND aa.del = false""");
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
// .disableLogicDel()//关闭主表逻辑删除 // .disableLogicDel()//关闭主表逻辑删除
.selectAll(UserDO.class) .selectAll(UserDO.class)
@ -635,25 +646,26 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void test3() { void test3() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.address\n" + t.update_by,
"FROM `user` t\n" + t1.address
" LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)\n" + AND t1.del = false
"LIMIT ?", AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)
LIMIT ?""",
"SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, " + "SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( 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, t1.address FROM `user` t " + "t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by, t1.address FROM `user` t " +
"LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id) WHERE t.del = false AND t1.del = false AND " + "LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id) WHERE t.del = false AND t1.del = false AND " +
@ -795,36 +807,38 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void logicDelType() { void logicDelType() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)
" AND (t.id <= ?)\n" + WHERE t.del = false
"ORDER BY t.id DESC\n"); AND (t.id <= ?)
ORDER BY t.id DESC
""");
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.logicDelToOn() .logicDelToOn()
.selectAll(UserDO.class) .selectAll(UserDO.class)
@ -846,36 +860,38 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void joinWrapper() { void joinWrapper() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)
" AND (t.id <= ?)\n" + WHERE t.del = false
"ORDER BY t.id DESC\n"); AND (t.id <= ?)
ORDER BY t.id DESC
""");
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class) MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.logicDelToOn() .logicDelToOn()
.selectAll(UserDO.class) .selectAll(UserDO.class)
@ -960,7 +976,7 @@ class LambdaWrapperTest {
*/ */
@Test @Test
void joinOrder() { void joinOrder() {
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { if (VersionUtils.compare(VersionUtils.getVersion(), "3.4.3") >= 0) {
ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", 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 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"); "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc");
@ -971,7 +987,7 @@ class LambdaWrapperTest {
MPJLambdaWrapper<OrderDO> wrapper = JoinWrappers.lambda(OrderDO.class); MPJLambdaWrapper<OrderDO> wrapper = JoinWrappers.lambda(OrderDO.class);
List<OrderDO> list = wrapper.clone().list(); List<OrderDO> list = wrapper.clone().list();
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { if (VersionUtils.compare(VersionUtils.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", 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");
} else { } else {

View File

@ -1,6 +1,5 @@
package com.github.yulichang.test.join.apt; package com.github.yulichang.test.join.apt;
import com.baomidou.mybatisplus.core.MybatisPlusVersion;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@ -93,38 +92,39 @@ class AptWrapperTest {
@Test @Test
void testJoin() { void testJoin() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false\n" + AND t1.del = false
" AND (t.id <= ?)\n" + AND t2.del = false
"ORDER BY t.id DESC"); AND (t.id <= ?)
ORDER BY t.id DESC""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
AddressDOCol addr = ADDRESSDO; AddressDOCol addr = ADDRESSDO;
@ -152,25 +152,26 @@ class AptWrapperTest {
@Test @Test
void testJoinField() { void testJoinField() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id\n" + t.update_by,
"FROM `user` t\n" + t1.id AS joina_id
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
" AND t1.del = false\n" + WHERE t.del = false
" AND (t.id <= ?)\n" + AND t1.del = false
"ORDER BY t.id DESC"); AND (t.id <= ?)
ORDER BY t.id DESC""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
AddressDOCol addr = ADDRESSDO; AddressDOCol addr = ADDRESSDO;
@ -192,37 +193,38 @@ class AptWrapperTest {
@Test @Test
void testJoin1() { void testJoin1() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false\n" + AND t1.del = false
"ORDER BY t.id DESC"); AND t2.del = false
ORDER BY t.id DESC""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
AddressDOCol addr = ADDRESSDO; AddressDOCol addr = ADDRESSDO;
@ -246,13 +248,14 @@ class AptWrapperTest {
*/ */
@Test @Test
void testWrapper() { void testWrapper() {
ThreadLocalUtils.set("SELECT t.id\n" + ThreadLocalUtils.set("""
"FROM `user` t\n" + SELECT t.id
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false"); AND t1.del = false
AND t2.del = false""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
AddressDOCol addr = ADDRESSDO; AddressDOCol addr = ADDRESSDO;
@ -269,13 +272,14 @@ class AptWrapperTest {
System.out.println(list); System.out.println(list);
ThreadLocalUtils.set("SELECT t.create_time\n" + ThreadLocalUtils.set("""
"FROM `user` t\n" + SELECT t.create_time
" LEFT JOIN address t1 ON (t1.user_id = t.id)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND t2.del = false"); AND t1.del = false
AND t2.del = false""");
//java.sql包下的类 //java.sql包下的类
AptQueryWrapper<UserDO> wrapper1 = new AptQueryWrapper<>(u) AptQueryWrapper<UserDO> wrapper1 = new AptQueryWrapper<>(u)
.select(u.createTime) .select(u.createTime)
@ -290,23 +294,24 @@ class AptWrapperTest {
@Test @Test
void testMSCache() { void testMSCache() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by\n" + t.create_by,
"FROM `user` t\n" + t.update_by
"WHERE t.id = ?\n" + FROM `user` t
" AND t.del = false\n" + WHERE t.id = ?
" AND (t.id <= ?)\n" + AND t.del = false
"ORDER BY t.id ASC, t.`name` ASC"); AND (t.id <= ?)
ORDER BY t.id ASC, t.`name` ASC""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
AddressDOCol addr = ADDRESSDO; AddressDOCol addr = ADDRESSDO;
@ -325,21 +330,22 @@ class AptWrapperTest {
@Test @Test
void testTableAliasR() { void testTableAliasR() {
ThreadLocalUtils.set("SELECT tt.id,\n" + ThreadLocalUtils.set("""
" tt.user_id,\n" + SELECT tt.id,
" tt.create_by,\n" + tt.user_id,
" tt.update_by,\n" + tt.create_by,
" ua.`name` AS userName,\n" + tt.update_by,
" ub.`name` AS createName,\n" + ua.`name` AS userName,
" uc.`name` AS updateName\n" + ub.`name` AS createName,
"FROM user_dto tt\n" + uc.`name` AS updateName
" LEFT JOIN `user` ua ON (ua.id = tt.user_id)\n" + FROM user_dto tt
" LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + LEFT JOIN `user` ua ON (ua.id = tt.user_id)
" LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + LEFT JOIN `user` ub ON (ub.id = tt.create_by)
"WHERE ua.del = false\n" + LEFT JOIN `user` uc ON (uc.id = tt.update_by)
" AND ub.del = false\n" + WHERE ua.del = false
" AND uc.del = false\n" + AND ub.del = false
" AND (ua.id <= ? AND ub.id >= ?)"); AND uc.del = false
AND (ua.id <= ? AND ub.id >= ?)""");
UserDtoCol tt = UserDtoCol.build("tt"); UserDtoCol tt = UserDtoCol.build("tt");
UserDOCol ua = UserDOCol.build("ua"); UserDOCol ua = UserDOCol.build("ua");
@ -363,29 +369,30 @@ class AptWrapperTest {
assert StringUtils.isNotBlank(userDtos.get(0).getUpdateName()); assert StringUtils.isNotBlank(userDtos.get(0).getUpdateName());
ThreadLocalUtils.set("SELECT tt.id,\n" + ThreadLocalUtils.set("""
" tt.pid,\n" + SELECT tt.id,
" tt.`name`,\n" + tt.pid,
" tt.`json`,\n" + tt.`name`,
" tt.sex,\n" + tt.`json`,
" tt.head_img,\n" + tt.sex,
" tt.create_time,\n" + tt.head_img,
" tt.address_id,\n" + tt.create_time,
" tt.address_id2,\n" + tt.address_id,
" tt.del,\n" + tt.address_id2,
" tt.create_by,\n" + tt.del,
" tt.update_by,\n" + tt.create_by,
" ua.id,\n" + tt.update_by,
" ub.head_img\n" + ua.id,
"FROM `user` tt\n" + ub.head_img
" LEFT JOIN `user` ua ON (ua.id = tt.pid)\n" + FROM `user` tt
" LEFT JOIN `user` ub ON (ub.id = tt.create_by)\n" + LEFT JOIN `user` ua ON (ua.id = tt.pid)
" LEFT JOIN `user` uc ON (uc.id = tt.update_by)\n" + LEFT JOIN `user` ub ON (ub.id = tt.create_by)
"WHERE tt.del = false\n" + LEFT JOIN `user` uc ON (uc.id = tt.update_by)
" AND ua.del = false\n" + WHERE tt.del = false
" AND ub.del = false\n" + AND ua.del = false
" AND uc.del = false\n" + AND ub.del = false
" AND (ua.head_img = tt.`name` AND tt.id = ua.id)"); AND uc.del = false
AND (ua.head_img = tt.`name` AND tt.id = ua.id)""");
UserDOCol ut = UserDOCol.build("tt"); UserDOCol ut = UserDOCol.build("tt");
UserDOCol ua1 = UserDOCol.build("ua"); UserDOCol ua1 = UserDOCol.build("ua");
@ -411,34 +418,35 @@ class AptWrapperTest {
*/ */
@Test @Test
void testInner() { void testInner() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.pid AS joina_pid,\n" + t1.id AS joina_id,
" t1.`name` AS joina_name,\n" + t1.pid AS joina_pid,
" t1.`json` AS joina_json,\n" + t1.`name` AS joina_name,
" t1.sex AS joina_sex,\n" + t1.`json` AS joina_json,
" t1.head_img AS joina_head_img,\n" + t1.sex AS joina_sex,
" t1.create_time AS joina_create_time,\n" + t1.head_img AS joina_head_img,
" t1.address_id AS joina_address_id,\n" + t1.create_time AS joina_create_time,
" t1.address_id2 AS joina_address_id2,\n" + t1.address_id AS joina_address_id,
" t1.del AS joina_del,\n" + t1.address_id2 AS joina_address_id2,
" t1.create_by AS joina_create_by,\n" + t1.del AS joina_del,
" t1.update_by AS joina_update_by\n" + t1.create_by AS joina_create_by,
"FROM `user` t\n" + t1.update_by AS joina_update_by
" LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN `user` t1 ON (t1.pid = t.id)
" AND (t.id > ?)"); WHERE t.del = false
AND (t.id > ?)""");
UserDOCol u = USERDO; UserDOCol u = USERDO;
UserDOCol ua = UserDOCol.build(); UserDOCol ua = UserDOCol.build();
@ -453,24 +461,25 @@ class AptWrapperTest {
List<UserDO> list = userMapper.selectJoinList(UserDO.class, wrapper); List<UserDO> list = userMapper.selectJoinList(UserDO.class, wrapper);
System.out.println(list); System.out.println(list);
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.`name` AS createName,\n" + t.update_by,
" t2.`name` AS updateName\n" + t1.`name` AS createName,
"FROM `user` t\n" + t2.`name` AS updateName
" LEFT JOIN `user` t1 ON (t1.id = t.create_by)\n" + FROM `user` t
" LEFT JOIN `user` t2 ON (t2.id = t.update_by)\n" + LEFT JOIN `user` t1 ON (t1.id = t.create_by)
"WHERE (t2.id = t.update_by AND t.id = t1.id)"); LEFT JOIN `user` t2 ON (t2.id = t.update_by)
WHERE (t2.id = t.update_by AND t.id = t1.id)""");
UserDOCol uu = UserDOCol.build(); UserDOCol uu = UserDOCol.build();
UserDOCol uua = UserDOCol.build(); UserDOCol uua = UserDOCol.build();
@ -491,48 +500,49 @@ class AptWrapperTest {
assert dos.get(0).getCreateName() != null && dos.get(0).getUpdateName() != null; assert dos.get(0).getCreateName() != null && dos.get(0).getUpdateName() != null;
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.`name` AS alias,\n" + t.update_by,
" t1.id AS joina_id,\n" + t1.`name` AS alias,
" t1.pid AS joina_pid,\n" + t1.id AS joina_id,
" t1.`name` AS joina_name,\n" + t1.pid AS joina_pid,
" t1.`json` AS joina_json,\n" + t1.`name` AS joina_name,
" t1.sex AS joina_sex,\n" + t1.`json` AS joina_json,
" t1.head_img AS joina_head_img,\n" + t1.sex AS joina_sex,
" t1.create_time AS joina_create_time,\n" + t1.head_img AS joina_head_img,
" t1.address_id AS joina_address_id,\n" + t1.create_time AS joina_create_time,
" t1.address_id2 AS joina_address_id2,\n" + t1.address_id AS joina_address_id,
" t1.del AS joina_del,\n" + t1.address_id2 AS joina_address_id2,
" t1.create_by AS joina_create_by,\n" + t1.del AS joina_del,
" t1.update_by AS joina_update_by,\n" + t1.create_by AS joina_create_by,
" t2.id AS joinb_id,\n" + t1.update_by AS joina_update_by,
" t2.pid AS joinb_pid,\n" + t2.id AS joinb_id,
" t2.`name` AS joinb_name,\n" + t2.pid AS joinb_pid,
" t2.`json` AS joinb_json,\n" + t2.`name` AS joinb_name,
" t2.sex AS joinb_sex,\n" + t2.`json` AS joinb_json,
" t2.head_img AS joinb_head_img,\n" + t2.sex AS joinb_sex,
" t2.create_time AS joinb_create_time,\n" + t2.head_img AS joinb_head_img,
" t2.address_id AS joinb_address_id,\n" + t2.create_time AS joinb_create_time,
" t2.address_id2 AS joinb_address_id2,\n" + t2.address_id AS joinb_address_id,
" t2.del AS joinb_del,\n" + t2.address_id2 AS joinb_address_id2,
" t2.create_by AS joinb_create_by,\n" + t2.del AS joinb_del,
" t2.update_by AS joinb_update_by\n" + t2.create_by AS joinb_create_by,
"FROM `user` t\n" + t2.update_by AS joinb_update_by
" LEFT JOIN `user` t1 ON (t1.pid = t.id)\n" + FROM `user` t
" LEFT JOIN `user` t2 ON (t2.pid = t1.id)\n" + LEFT JOIN `user` t1 ON (t1.pid = t.id)
"WHERE t.del = false\n" + LEFT JOIN `user` t2 ON (t2.pid = t1.id)
" AND (t1.id <= ? AND t.id <= ?)"); WHERE t.del = false
AND (t1.id <= ? AND t.id <= ?)""");
UserDOCol uuu = UserDOCol.build(); UserDOCol uuu = UserDOCol.build();
UserDOCol uuua = UserDOCol.build(); UserDOCol uuua = UserDOCol.build();
@ -628,28 +638,29 @@ class AptWrapperTest {
@Test @Test
void testTableAlias() { void testTableAlias() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" aa.id,\n" + t.update_by,
" aa.user_id,\n" + aa.id,
" aa.area_id,\n" + aa.user_id,
" aa.tel,\n" + aa.area_id,
" aa.address,\n" + aa.tel,
" aa.del\n" + aa.address,
"FROM `user` t\n" + aa.del
" LEFT JOIN address aa ON (aa.user_id = t.id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address aa ON (aa.user_id = t.id)
" AND aa.del = false"); WHERE t.del = false
AND aa.del = false""");
UserDOCol u = UserDOCol.build(); UserDOCol u = UserDOCol.build();
AddressDOCol addr = AddressDOCol.build("aa"); AddressDOCol addr = AddressDOCol.build("aa");
@ -711,25 +722,26 @@ class AptWrapperTest {
*/ */
@Test @Test
void test3() { void test3() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.address\n" + t.update_by,
"FROM `user` t\n" + t1.address
" LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)\n" + FROM `user` t
"WHERE t.del = false\n" + LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id)
" AND t1.del = false\n" + WHERE t.del = false
" AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)\n" + AND t1.del = false
"LIMIT ?", AND (t.id = ? AND (t.head_img = ? OR t1.user_id = ?) AND t.id = ?)
LIMIT ?""",
"SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, " + "SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( 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, t1.address FROM `user` t " + "t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by, t1.address FROM `user` t " +
"LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id) WHERE t.del = false AND t1.del = false AND " + "LEFT JOIN address t1 ON (t.id = t1.user_id AND t.id = t1.user_id) WHERE t.del = false AND t1.del = false AND " +
@ -895,36 +907,38 @@ class AptWrapperTest {
*/ */
@Test @Test
void logicDelType() { void logicDelType() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)
" AND (t.id <= ?)\n" + WHERE t.del = false
"ORDER BY t.id DESC\n"); AND (t.id <= ?)
ORDER BY t.id DESC
""");
UserDOCol u = UserDOCol.build(); UserDOCol u = UserDOCol.build();
AddressDOCol addr = AddressDOCol.build(); AddressDOCol addr = AddressDOCol.build();
AreaDOCol ar = AreaDOCol.build(); AreaDOCol ar = AreaDOCol.build();
@ -948,36 +962,38 @@ class AptWrapperTest {
*/ */
@Test @Test
void joinWrapper() { void joinWrapper() {
ThreadLocalUtils.set("SELECT t.id,\n" + ThreadLocalUtils.set("""
" t.pid,\n" + SELECT t.id,
" t.`name`,\n" + t.pid,
" t.`json`,\n" + t.`name`,
" t.sex,\n" + t.`json`,
" t.head_img,\n" + t.sex,
" t.create_time,\n" + t.head_img,
" t.address_id,\n" + t.create_time,
" t.address_id2,\n" + t.address_id,
" t.del,\n" + t.address_id2,
" t.create_by,\n" + t.del,
" t.update_by,\n" + t.create_by,
" t1.id AS joina_id,\n" + t.update_by,
" t1.user_id,\n" + t1.id AS joina_id,
" t1.area_id,\n" + t1.user_id,
" t1.tel,\n" + t1.area_id,
" t1.address,\n" + t1.tel,
" t1.del AS joina_del,\n" + t1.address,
" t2.id AS joinb_id,\n" + t1.del AS joina_del,
" t2.province,\n" + t2.id AS joinb_id,
" t2.city,\n" + t2.province,
" t2.area,\n" + t2.city,
" t2.postcode,\n" + t2.area,
" t2.del AS joinb_del\n" + t2.postcode,
"FROM `user` t\n" + t2.del AS joinb_del
" LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)\n" + FROM `user` t
" LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)\n" + LEFT JOIN address t1 ON (t1.user_id = t.id AND t1.del = false)
"WHERE t.del = false\n" + LEFT JOIN area t2 ON (t2.id = t1.area_id AND t2.del = false)
" AND (t.id <= ?)\n" + WHERE t.del = false
"ORDER BY t.id DESC\n"); AND (t.id <= ?)
ORDER BY t.id DESC
""");
UserDOCol u = UserDOCol.build(); UserDOCol u = UserDOCol.build();
AddressDOCol addr = AddressDOCol.build(); AddressDOCol addr = AddressDOCol.build();
AreaDOCol ar = AreaDOCol.build(); AreaDOCol ar = AreaDOCol.build();
@ -1077,7 +1093,7 @@ class AptWrapperTest {
*/ */
@Test @Test
void joinOrder() { void joinOrder() {
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { if (VersionUtils.compare(VersionUtils.getVersion(), "3.4.3") >= 0) {
ThreadLocalUtils.set("SELECT id,user_id,name FROM order_t t ORDER BY t.name DESC", 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 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"); "SELECT id,user_id,name FROM order_t t ORDER BY t.name desc");
@ -1089,7 +1105,7 @@ class AptWrapperTest {
AptQueryWrapper<OrderDO> wrapper = AptWrappers.query(o); AptQueryWrapper<OrderDO> wrapper = AptWrappers.query(o);
List<OrderDO> list = wrapper.list(); List<OrderDO> list = wrapper.list();
if (VersionUtils.compare(MybatisPlusVersion.getVersion(), "3.4.3") >= 0) { if (VersionUtils.compare(VersionUtils.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", 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");
} else { } else {