From 99890d94ddc4b1078b4b33dec4254853e451dbe5 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 1 Feb 2021 01:23:30 +0800 Subject: [PATCH] update --- README.md | 2 +- .../github/mybatisplus/base/MyBaseMapper.java | 37 +- .../mybatisplus/base/MyBaseService.java | 59 +- .../mybatisplus/base/MyBaseServiceImpl.java | 13 +- .../github/mybatisplus/func/MySFunction.java | 15 - .../mybatisplus/func/MyWrapperFunc.java | 12 - .../mybatisplus/method/SelectJoinList.java | 2 +- .../mybatisplus/method/SelectJoinMap.java | 3 +- .../mybatisplus/method/SelectJoinMaps.java | 2 +- .../method/SelectJoinMapsPage.java | 2 +- .../mybatisplus/method/SelectJoinOne.java | 2 +- .../mybatisplus/method/SelectJoinPage.java | 2 +- .../github/mybatisplus/method/SqlMethod.java | 12 +- .../mybatisplus/query/MyAbstractLambda.java | 2 +- .../mybatisplus/query/MyAbstractWrapper.java | 30 +- .../mybatisplus/query/MyLambdaQuery.java | 22 +- .../com/github/mybatisplus/query/MyQuery.java | 10 + .../mybatisplus/query/interfaces/MyJoin.java | 16 +- .../github/mybatisplus/toolkit/Constant.java | 2 - .../mybatisplus/toolkit/MyLambdaUtils.java | 12 +- .../wrapper/MyAbstractLambdaWrapper.java | 106 ++- .../wrapper/MyAbstractWrapper.java | 350 ++++++++- .../wrapper/MyJoinLambdaQueryWrapper.java | 354 --------- .../wrapper/MyLambdaQueryWrapper.java | 575 ++++----------- .../github/mybatisplus/wrapper/MyWrapper.java | 170 +++++ .../mybatisplus/wrapper/SelectFunc.java | 27 - .../wrapper/interfaces/MyCompare.java | 689 +++++++----------- .../wrapper/interfaces/MyFunc.java | 397 ++++++---- .../wrapper/interfaces/MyJoin.java | 111 --- .../wrapper/interfaces/MyLambdaJoin.java | 35 + .../wrapper/interfaces/MyMPJoin.java | 130 ---- .../wrapper/interfaces/MyNested.java | 87 --- .../wrapper/interfaces/MySFunctionQuery.java | 63 ++ 33 files changed, 1490 insertions(+), 1861 deletions(-) delete mode 100644 src/main/java/com/github/mybatisplus/func/MySFunction.java delete mode 100644 src/main/java/com/github/mybatisplus/func/MyWrapperFunc.java delete mode 100644 src/main/java/com/github/mybatisplus/wrapper/MyJoinLambdaQueryWrapper.java create mode 100644 src/main/java/com/github/mybatisplus/wrapper/MyWrapper.java delete mode 100644 src/main/java/com/github/mybatisplus/wrapper/SelectFunc.java delete mode 100644 src/main/java/com/github/mybatisplus/wrapper/interfaces/MyJoin.java create mode 100644 src/main/java/com/github/mybatisplus/wrapper/interfaces/MyLambdaJoin.java delete mode 100644 src/main/java/com/github/mybatisplus/wrapper/interfaces/MyMPJoin.java delete mode 100644 src/main/java/com/github/mybatisplus/wrapper/interfaces/MyNested.java create mode 100644 src/main/java/com/github/mybatisplus/wrapper/interfaces/MySFunctionQuery.java diff --git a/README.md b/README.md index 30b580c..d1b9a8d 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ ORDER BY addr.id DESC ## MyLambdaQueryWrapper用法 -### MyLambdaQueryWrapper更符合面向对象(OOP),没有难以理解的常量(魔术值),全部基于lambda,但好像不那么好理解 +### MyLambdaQueryWrapper更符合面向对象(OOP),没有难以理解的常量(魔术值),全部基于lambda,但灵活性不如上面的 #### 简单的3表查询 diff --git a/src/main/java/com/github/mybatisplus/base/MyBaseMapper.java b/src/main/java/com/github/mybatisplus/base/MyBaseMapper.java index 7253159..c31d958 100644 --- a/src/main/java/com/github/mybatisplus/base/MyBaseMapper.java +++ b/src/main/java/com/github/mybatisplus/base/MyBaseMapper.java @@ -1,10 +1,10 @@ package com.github.mybatisplus.base; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.github.mybatisplus.toolkit.Constant; +import com.github.mybatisplus.wrapper.MyWrapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,48 +19,51 @@ public interface MyBaseMapper extends BaseMapper { /** * 连表查询返回一条记录 * - * @param queryWrapper joinWrapper - * @param clazz resultType + * @param myWrapper joinWrapper + * @param clazz resultType */ - DTO selectJoinOne(@Param(Constant.CLAZZ) Class clazz, @Param(Constants.WRAPPER) Wrapper queryWrapper); + DTO selectJoinOne(@Param(Constant.CLAZZ) Class clazz, + @Param(Constants.WRAPPER) MyWrapper myWrapper); /** * 连表查询返回Map * - * @param queryWrapper joinWrapper + * @param myWrapper joinWrapper */ - Map selectJoinMap(@Param(Constants.WRAPPER) Wrapper queryWrapper); + Map selectJoinMap(@Param(Constants.WRAPPER) MyWrapper myWrapper); /** * 连表查询返回记录集合 * - * @param queryWrapper joinWrapper - * @param clazz resultType + * @param myWrapper joinWrapper + * @param clazz resultType */ - List selectJoinList(@Param(Constant.CLAZZ) Class clazz, @Param(Constants.WRAPPER) Wrapper queryWrapper); + List selectJoinList(@Param(Constant.CLAZZ) Class clazz, + @Param(Constants.WRAPPER) MyWrapper myWrapper); /** * 连表查询返回Map集合 * - * @param queryWrapper joinWrapper + * @param myWrapper joinWrapper */ - List> selectJoinMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper); + List> selectJoinMaps(@Param(Constants.WRAPPER) MyWrapper myWrapper); /** * 连表查询返回记录集合并分页 * - * @param queryWrapper joinWrapper - * @param clazz resultType - * @param 分页返回对象 + * @param myWrapper joinWrapper + * @param clazz resultType + * @param 分页返回对象 */ > IPage selectJoinPage(P page, @Param(Constant.CLAZZ) Class clazz, - @Param(Constants.WRAPPER) Wrapper queryWrapper); + @Param(Constants.WRAPPER) MyWrapper myWrapper); /** * 连表查询返回Map集合并分页 * - * @param queryWrapper joinWrapper + * @param myWrapper joinWrapper */ -

> IPage> selectJoinMapsPage(P page, @Param(Constants.WRAPPER) Wrapper queryWrapper); +

> IPage> selectJoinMapsPage(P page, + @Param(Constants.WRAPPER) MyWrapper myWrapper); } diff --git a/src/main/java/com/github/mybatisplus/base/MyBaseService.java b/src/main/java/com/github/mybatisplus/base/MyBaseService.java index 01bc94e..b669234 100644 --- a/src/main/java/com/github/mybatisplus/base/MyBaseService.java +++ b/src/main/java/com/github/mybatisplus/base/MyBaseService.java @@ -2,8 +2,7 @@ package com.github.mybatisplus.base; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import com.github.mybatisplus.func.MyWrapperFunc; -import com.github.mybatisplus.wrapper.MyLambdaQueryWrapper; +import com.github.mybatisplus.wrapper.MyWrapper; import java.util.List; import java.util.Map; @@ -14,78 +13,34 @@ import java.util.Map; */ public interface MyBaseService extends IService { - /** - * ignore - */ - default DTO selectJoinOne(Class clazz, MyWrapperFunc wrapperFunc) { - return selectJoinOne(clazz, wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } - /** * 连接查询返回一条记录 */ - DTO selectJoinOne(Class clazz, MyLambdaQueryWrapper wrapper); - - /** - * ignore - */ - default List selectJoinList(Class clazz, MyWrapperFunc wrapperFunc) { - return selectJoinList(clazz, wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } + DTO selectJoinOne(Class clazz, MyWrapper wrapper); /** * 连接查询返回集合 */ - List selectJoinList(Class clazz, MyLambdaQueryWrapper wrapper); - - - /** - * ignore - */ - default > IPage selectJoinListPage(P page, Class clazz, MyWrapperFunc wrapperFunc) { - return selectJoinListPage(page, clazz, wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } + List selectJoinList(Class clazz, MyWrapper wrapper); /** * 连接查询返回集合并分页 */ - > IPage selectJoinListPage(P page, Class clazz, MyLambdaQueryWrapper wrapper); - - - /** - * ignore - */ - default Map selectJoinMap(MyWrapperFunc wrapperFunc) { - return selectJoinMap(wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } + > IPage selectJoinListPage(P page, Class clazz, MyWrapper wrapper); /** * 连接查询返回Map */ - Map selectJoinMap(MyLambdaQueryWrapper wrapper); - - /** - * ignore - */ - default List> selectJoinMaps(MyWrapperFunc wrapperFunc) { - return selectJoinMaps(wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } + Map selectJoinMap(MyWrapper wrapper); /** * 连接查询返回Map集合 */ - List> selectJoinMaps(MyLambdaQueryWrapper wrapper); + List> selectJoinMaps(MyWrapper wrapper); - /** - * ignore - */ - default IPage> selectJoinMapsPage(IPage> page, MyWrapperFunc wrapperFunc) { - return selectJoinMapsPage(page, wrapperFunc.apply(new MyLambdaQueryWrapper<>())); - } /** * 连接查询返回Map集合并分页 */ - IPage> selectJoinMapsPage(IPage> page, MyLambdaQueryWrapper wrapper); - + IPage> selectJoinMapsPage(IPage> page, MyWrapper wrapper); } diff --git a/src/main/java/com/github/mybatisplus/base/MyBaseServiceImpl.java b/src/main/java/com/github/mybatisplus/base/MyBaseServiceImpl.java index 433d5c6..c279194 100644 --- a/src/main/java/com/github/mybatisplus/base/MyBaseServiceImpl.java +++ b/src/main/java/com/github/mybatisplus/base/MyBaseServiceImpl.java @@ -3,6 +3,7 @@ package com.github.mybatisplus.base; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.mybatisplus.wrapper.MyLambdaQueryWrapper; +import com.github.mybatisplus.wrapper.MyWrapper; import java.util.List; import java.util.Map; @@ -15,33 +16,33 @@ public class MyBaseServiceImpl, T> extends ServiceImpl @Override - public DTO selectJoinOne(Class clazz, MyLambdaQueryWrapper wrapper) { + public DTO selectJoinOne(Class clazz, MyWrapper wrapper) { return baseMapper.selectJoinOne(clazz, wrapper); } @Override - public List selectJoinList(Class clazz, MyLambdaQueryWrapper wrapper) { + public List selectJoinList(Class clazz, MyWrapper wrapper) { return baseMapper.selectJoinList(clazz, wrapper); } @Override - public > IPage selectJoinListPage(P page, Class clazz, MyLambdaQueryWrapper wrapper) { + public > IPage selectJoinListPage(P page, Class clazz, MyWrapper wrapper) { return baseMapper.selectJoinPage(page, clazz, wrapper); } @Override - public Map selectJoinMap(MyLambdaQueryWrapper wrapper) { + public Map selectJoinMap(MyWrapper wrapper) { return baseMapper.selectJoinMap(wrapper); } @Override - public List> selectJoinMaps(MyLambdaQueryWrapper wrapper) { + public List> selectJoinMaps(MyWrapper wrapper) { return baseMapper.selectJoinMaps(wrapper); } @Override - public IPage> selectJoinMapsPage(IPage> page, MyLambdaQueryWrapper wrapper) { + public IPage> selectJoinMapsPage(IPage> page, MyWrapper wrapper) { return baseMapper.selectJoinMapsPage(page, wrapper); } diff --git a/src/main/java/com/github/mybatisplus/func/MySFunction.java b/src/main/java/com/github/mybatisplus/func/MySFunction.java deleted file mode 100644 index ed9ef6d..0000000 --- a/src/main/java/com/github/mybatisplus/func/MySFunction.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.mybatisplus.func; - - -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; - -/** - * 支持别名的 SFunction - * - * @author yulichang - * @see SFunction - */ -@FunctionalInterface -public interface MySFunction extends SFunction { - -} diff --git a/src/main/java/com/github/mybatisplus/func/MyWrapperFunc.java b/src/main/java/com/github/mybatisplus/func/MyWrapperFunc.java deleted file mode 100644 index 7af0649..0000000 --- a/src/main/java/com/github/mybatisplus/func/MyWrapperFunc.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.mybatisplus.func; - -import com.github.mybatisplus.wrapper.MyLambdaQueryWrapper; - -/** - * @author yulichang - */ -@FunctionalInterface -public interface MyWrapperFunc { - - MyLambdaQueryWrapper apply(MyLambdaQueryWrapper wrapper); -} diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinList.java b/src/main/java/com/github/mybatisplus/method/SelectJoinList.java index 6470e4f..5bdb41b 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinList.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinList.java @@ -16,7 +16,7 @@ public class SelectJoinList extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_LIST; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinMap.java b/src/main/java/com/github/mybatisplus/method/SelectJoinMap.java index 91c8f7b..e7bcd26 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinMap.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinMap.java @@ -1,7 +1,6 @@ package com.github.mybatisplus.method; import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.github.mybatisplus.toolkit.Constant; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; @@ -16,7 +15,7 @@ public class SelectJoinMap extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAP; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinMaps.java b/src/main/java/com/github/mybatisplus/method/SelectJoinMaps.java index 6b93310..6a440f1 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinMaps.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinMaps.java @@ -16,7 +16,7 @@ public class SelectJoinMaps extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinMapsPage.java b/src/main/java/com/github/mybatisplus/method/SelectJoinMapsPage.java index afbb6c0..dda4a49 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinMapsPage.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinMapsPage.java @@ -16,7 +16,7 @@ public class SelectJoinMapsPage extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_MAPS_PAGE; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinOne.java b/src/main/java/com/github/mybatisplus/method/SelectJoinOne.java index aa61eed..5ef352f 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinOne.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinOne.java @@ -16,7 +16,7 @@ public class SelectJoinOne extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_ONE; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SelectJoinPage.java b/src/main/java/com/github/mybatisplus/method/SelectJoinPage.java index 3cbd4bf..1c6cf6c 100644 --- a/src/main/java/com/github/mybatisplus/method/SelectJoinPage.java +++ b/src/main/java/com/github/mybatisplus/method/SelectJoinPage.java @@ -16,7 +16,7 @@ public class SelectJoinPage extends MyAbstractMethod { public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { SqlMethod sqlMethod = SqlMethod.SELECT_JOIN_PAGE; String sql = String.format(sqlMethod.getSql(), sqlSelectColumns(tableInfo, true), - tableInfo.getTableName(), Constant.TABLE_ALIAS, sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + tableInfo.getTableName(), sqlWhereEntityWrapper(true, tableInfo), sqlComment()); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatementForOther(mapperClass, sqlMethod.getMethod(), sqlSource, Map.class); } diff --git a/src/main/java/com/github/mybatisplus/method/SqlMethod.java b/src/main/java/com/github/mybatisplus/method/SqlMethod.java index 6230af7..fb2209c 100644 --- a/src/main/java/com/github/mybatisplus/method/SqlMethod.java +++ b/src/main/java/com/github/mybatisplus/method/SqlMethod.java @@ -15,22 +15,22 @@ public enum SqlMethod { * 连表查询 */ SELECT_JOIN_ONE("selectJoinOne", "返回一条记录", - ""), + ""), SELECT_JOIN_LIST("selectJoinList", "返回List集合", - ""), + ""), SELECT_JOIN_MAP("selectJoinMap", "返回一个Map", - ""), + ""), SELECT_JOIN_MAPS("selectJoinMaps", "返回Map集合", - ""), + ""), SELECT_JOIN_PAGE("selectJoinPage", "连表查询并分页", - ""), + ""), SELECT_JOIN_MAPS_PAGE("selectJoinMapsPage", "返回Map集合并分页", - ""); + ""); private final String method; private final String desc; diff --git a/src/main/java/com/github/mybatisplus/query/MyAbstractLambda.java b/src/main/java/com/github/mybatisplus/query/MyAbstractLambda.java index debe0b2..a9ccf50 100644 --- a/src/main/java/com/github/mybatisplus/query/MyAbstractLambda.java +++ b/src/main/java/com/github/mybatisplus/query/MyAbstractLambda.java @@ -32,7 +32,7 @@ public abstract class MyAbstractLambda... columns) { - return Arrays.stream(columns).map(i -> Constant.TABLE_ALIAS + StringPool.DOT + columnToString(i, onlyColumn)).collect(joining(StringPool.COMMA)); + return Arrays.stream(columns).map(i -> columnToString(i, onlyColumn)).collect(joining(StringPool.COMMA)); } @Override diff --git a/src/main/java/com/github/mybatisplus/query/MyAbstractWrapper.java b/src/main/java/com/github/mybatisplus/query/MyAbstractWrapper.java index a035425..e01e329 100644 --- a/src/main/java/com/github/mybatisplus/query/MyAbstractWrapper.java +++ b/src/main/java/com/github/mybatisplus/query/MyAbstractWrapper.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; import com.github.mybatisplus.query.interfaces.MyJoin; import com.github.mybatisplus.toolkit.Constant; +import com.github.mybatisplus.wrapper.MyWrapper; import java.util.Arrays; import java.util.Collection; @@ -33,8 +34,8 @@ import static java.util.stream.Collectors.joining; * copy {@link com.baomidou.mybatisplus.core.conditions.AbstractWrapper} */ @SuppressWarnings({"serial", "unchecked"}) -public abstract class MyAbstractWrapper> extends Wrapper - implements Compare, Nested, Join, Func, MyJoin { +public abstract class MyAbstractWrapper> extends MyWrapper + implements Compare, Nested, Join, Func { /** * 占位符 @@ -94,31 +95,6 @@ public abstract class MyAbstractWrapper Children allEq(boolean condition, Map params, boolean null2IsNull) { if (condition && CollectionUtils.isNotEmpty(params)) { diff --git a/src/main/java/com/github/mybatisplus/query/MyLambdaQuery.java b/src/main/java/com/github/mybatisplus/query/MyLambdaQuery.java index 5df0872..fab6237 100644 --- a/src/main/java/com/github/mybatisplus/query/MyLambdaQuery.java +++ b/src/main/java/com/github/mybatisplus/query/MyLambdaQuery.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.mybatisplus.query.interfaces.MyJoin; import com.github.mybatisplus.toolkit.Constant; import java.util.ArrayList; @@ -28,13 +29,18 @@ import java.util.stream.Collectors; */ @SuppressWarnings("serial") public class MyLambdaQuery extends MyAbstractLambda> - implements Query, T, SFunction> { + implements Query, T, SFunction>, MyJoin> { /** * 查询字段 */ private SharedString sqlSelect = new SharedString(); + /** + * 主表别名 + */ + private SharedString alias = new SharedString(Constant.TABLE_ALIAS); + /** * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) @@ -170,6 +176,11 @@ public class MyLambdaQuery extends MyAbstractLambda> return from.getStringValue(); } + + public String getAlias() { + return alias.getStringValue(); + } + /** * 用于生成嵌套 sql *

故 sqlSelect from不向下传递

@@ -185,4 +196,13 @@ public class MyLambdaQuery extends MyAbstractLambda> super.clear(); sqlSelect.toNull(); } + + @Override + public MyLambdaQuery join(String keyWord, boolean condition, String joinSql) { + if (condition) { + from.setStringValue(from.getStringValue() + keyWord + joinSql); + } + return typedThis; + } + } diff --git a/src/main/java/com/github/mybatisplus/query/MyQuery.java b/src/main/java/com/github/mybatisplus/query/MyQuery.java index 971cf6f..93ecf2a 100644 --- a/src/main/java/com/github/mybatisplus/query/MyQuery.java +++ b/src/main/java/com/github/mybatisplus/query/MyQuery.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.github.mybatisplus.toolkit.Constant; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -24,6 +25,11 @@ public class MyQuery extends MyAbstractWrapper> */ private SharedString sqlSelect = new SharedString(); + /** + * 主表别名 + */ + private SharedString alias = new SharedString(Constant.TABLE_ALIAS); + public MyQuery() { this(null); } @@ -84,6 +90,10 @@ public class MyQuery extends MyAbstractWrapper> return from.getStringValue(); } + public String getAlias() { + return alias.getStringValue(); + } + /** * 返回一个支持 lambda 函数写法的 wrapper */ diff --git a/src/main/java/com/github/mybatisplus/query/interfaces/MyJoin.java b/src/main/java/com/github/mybatisplus/query/interfaces/MyJoin.java index 9877e52..559693b 100644 --- a/src/main/java/com/github/mybatisplus/query/interfaces/MyJoin.java +++ b/src/main/java/com/github/mybatisplus/query/interfaces/MyJoin.java @@ -1,22 +1,32 @@ package com.github.mybatisplus.query.interfaces; +import com.github.mybatisplus.toolkit.Constant; + public interface MyJoin { default Children leftJoin(String joinSql) { return leftJoin(true, joinSql); } - Children leftJoin(boolean condition, String joinSql); + default Children leftJoin(boolean condition, String joinSql) { + return join(Constant.LEFT_JOIN, condition, joinSql); + } default Children rightJoin(String joinSql) { return rightJoin(true, joinSql); } - Children rightJoin(boolean condition, String joinSql); + default Children rightJoin(boolean condition, String joinSql){ + return join(Constant.RIGHT_JOIN, condition, joinSql); + } default Children innerJoin(String joinSql) { return innerJoin(true, joinSql); } - Children innerJoin(boolean condition, String joinSql); + default Children innerJoin(boolean condition, String joinSql){ + return join(Constant.INNER_JOIN, condition, joinSql); + } + + Children join(String keyWord, boolean condition, String joinSql); } diff --git a/src/main/java/com/github/mybatisplus/toolkit/Constant.java b/src/main/java/com/github/mybatisplus/toolkit/Constant.java index 9ab1202..880ab2a 100644 --- a/src/main/java/com/github/mybatisplus/toolkit/Constant.java +++ b/src/main/java/com/github/mybatisplus/toolkit/Constant.java @@ -11,8 +11,6 @@ public interface Constant { */ String TABLE_ALIAS = "t"; - String AS = " AS "; - String ON = " ON "; String EQUALS = " = "; diff --git a/src/main/java/com/github/mybatisplus/toolkit/MyLambdaUtils.java b/src/main/java/com/github/mybatisplus/toolkit/MyLambdaUtils.java index f963ee9..6259462 100644 --- a/src/main/java/com/github/mybatisplus/toolkit/MyLambdaUtils.java +++ b/src/main/java/com/github/mybatisplus/toolkit/MyLambdaUtils.java @@ -3,7 +3,6 @@ package com.github.mybatisplus.toolkit; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.mybatisplus.func.MySFunction; import org.apache.ibatis.reflection.property.PropertyNamer; /** @@ -11,17 +10,20 @@ import org.apache.ibatis.reflection.property.PropertyNamer; * @see LambdaUtils * @see PropertyNamer */ -public class MyLambdaUtils { +@SuppressWarnings("all") +public final class MyLambdaUtils { + public static String getName(SFunction fn) { return PropertyNamer.methodToProperty(LambdaUtils.resolve(fn).getImplMethodName()); } - public static String getColumn(MySFunction fn) { + public static String getColumn(SFunction fn) { return StringUtils.camelToUnderline(getName(fn)); } - public static Class getEntityClass(MySFunction fn) { - return (Class) LambdaUtils.resolve(fn).getImplClass(); + public static Class getEntityClass(SFunction fn) { + return (Class) LambdaUtils.resolve(fn).getInstantiatedType(); } + } diff --git a/src/main/java/com/github/mybatisplus/wrapper/MyAbstractLambdaWrapper.java b/src/main/java/com/github/mybatisplus/wrapper/MyAbstractLambdaWrapper.java index 144a115..cfc0543 100644 --- a/src/main/java/com/github/mybatisplus/wrapper/MyAbstractLambdaWrapper.java +++ b/src/main/java/com/github/mybatisplus/wrapper/MyAbstractLambdaWrapper.java @@ -1,39 +1,80 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.github.mybatisplus.wrapper; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; +import com.github.mybatisplus.toolkit.MyLambdaUtils; import org.apache.ibatis.reflection.property.PropertyNamer; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import static java.util.stream.Collectors.joining; /** - * copy {@link com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper} + * Lambda 语法使用 Wrapper + *

统一处理解析 lambda 获取 column

+ * + * @author hubin miemie HCL + * @since 2017-05-26 */ @SuppressWarnings("serial") public abstract class MyAbstractLambdaWrapper> - extends MyAbstractWrapper, Children> { + extends MyAbstractWrapper { private Map columnMap = null; + private boolean initColumnMap = false; + /** + * 参与连接的表 + */ + protected Map, SubClass> subTable = new HashMap<>(); + + @SuppressWarnings("unchecked") + protected String columnsToString(SFunction... columns) { + return columnsToString(true, columns); + } @Override - protected String columnToString(SFunction column) { - return columnToString(column, true); + protected String columnToString(X column) { + return columnToString((SFunction) column, true); } - protected String columnToString(SFunction column, boolean onlyColumn) { - return getColumn(LambdaUtils.resolve(column), onlyColumn); + @SuppressWarnings("unchecked") + protected String columnsToString(boolean onlyColumn, SFunction... columns) { + return Arrays.stream(columns).map(i -> columnToString(i, onlyColumn)).collect(joining(StringPool.COMMA)); } - protected String column2String(SFunction column, boolean onlyColumn) { - return getColumn(LambdaUtils.resolve(column), onlyColumn); + @Override + protected String columnsToString(X... columns) { + return Arrays.stream(columns).map(i -> columnToString((SFunction) i, true)).collect(joining(StringPool.COMMA)); + } + + protected String columnToString(SFunction column, boolean onlyColumn) { + TableInfo info = TableInfoHelper.getTableInfo(MyLambdaUtils.getEntityClass(column)); + Assert.notNull(info, "can not find table for lambda"); + return info.getTableName() + StringPool.DOT + getColumn(LambdaUtils.resolve(column), onlyColumn); } @@ -58,7 +99,14 @@ public abstract class MyAbstractLambdaWrapper lambdaClass) { - columnMap = LambdaUtils.getColumnMap(lambdaClass); + if (!initColumnMap) { + final Class entityClass = getEntityClass(); + if (entityClass != null) { + lambdaClass = entityClass; + } + columnMap = LambdaUtils.getColumnMap(lambdaClass); + initColumnMap = true; + } Assert.notNull(columnMap, "can not find lambda cache for this entity [%s]", lambdaClass.getName()); } @@ -68,4 +116,44 @@ public abstract class MyAbstractLambdaWrapper { + + private String tableAlias; + + private SFunction left; + + private SFunction right; + + + public SubClass(String tableAlias, SFunction left, SFunction right) { + this.tableAlias = tableAlias; + this.left = left; + this.right = right; + } + + public String getTableAlias() { + return tableAlias; + } + + public void setTableAlias(String tableAlias) { + this.tableAlias = tableAlias; + } + + public SFunction getLeft() { + return left; + } + + public void setLeft(SFunction left) { + this.left = left; + } + + public SFunction getRight() { + return right; + } + + public void setRight(SFunction right) { + this.right = right; + } + } } diff --git a/src/main/java/com/github/mybatisplus/wrapper/MyAbstractWrapper.java b/src/main/java/com/github/mybatisplus/wrapper/MyAbstractWrapper.java index 3cddbaa..72f7a93 100644 --- a/src/main/java/com/github/mybatisplus/wrapper/MyAbstractWrapper.java +++ b/src/main/java/com/github/mybatisplus/wrapper/MyAbstractWrapper.java @@ -1,24 +1,56 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.github.mybatisplus.wrapper; +import com.baomidou.mybatisplus.core.conditions.ISqlSegment; import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.interfaces.Join; +import com.baomidou.mybatisplus.core.conditions.interfaces.Nested; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.enums.SqlKeyword; +import com.baomidou.mybatisplus.core.enums.SqlLike; import com.baomidou.mybatisplus.core.toolkit.*; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.mybatisplus.wrapper.interfaces.MyCompare; +import com.github.mybatisplus.wrapper.interfaces.MyFunc; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; +import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; import static java.util.stream.Collectors.joining; /** - * copy {@link com.baomidou.mybatisplus.core.conditions.AbstractWrapper} + * 查询条件封装 + * + * @author hubin miemie HCL + * @since 2017-05-26 */ @SuppressWarnings({"serial", "unchecked"}) -public abstract class MyAbstractWrapper> extends Wrapper { - +public abstract class MyAbstractWrapper> extends MyWrapper + implements MyCompare, Nested, Join, MyFunc { /** * 占位符 @@ -73,6 +105,280 @@ public abstract class MyAbstractWrapper Children allEq(boolean condition, Map, V> params, boolean null2IsNull) { + if (condition && CollectionUtils.isNotEmpty(params)) { + params.forEach((k, v) -> { + if (StringUtils.checkValNotNull(v)) { + eq(k, v); + } else { + if (null2IsNull) { + isNull(k); + } + } + }); + } + return typedThis; + } + + @Override + public Children allEq(boolean condition, BiPredicate, V> filter, Map, V> params, boolean null2IsNull) { + if (condition && CollectionUtils.isNotEmpty(params)) { + params.forEach((k, v) -> { + if (filter.test(k, v)) { + if (StringUtils.checkValNotNull(v)) { + eq(k, v); + } else { + if (null2IsNull) { + isNull(k); + } + } + } + }); + } + return typedThis; + } + + @Override + public Children eq(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, EQ, val); + } + + @Override + public Children ne(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, NE, val); + } + + @Override + public Children gt(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, GT, val); + } + + @Override + public Children ge(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, GE, val); + } + + @Override + public Children lt(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, LT, val); + } + + @Override + public Children le(boolean condition, SFunction column, Object val) { + return addCondition(condition, column, LE, val); + } + + @Override + public Children like(boolean condition, SFunction column, Object val) { + return likeValue(condition, LIKE, column, val, SqlLike.DEFAULT); + } + + @Override + public Children notLike(boolean condition, SFunction column, Object val) { + return likeValue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT); + } + + @Override + public Children likeLeft(boolean condition, SFunction column, Object val) { + return likeValue(condition, LIKE, column, val, SqlLike.LEFT); + } + + @Override + public Children likeRight(boolean condition, SFunction column, Object val) { + return likeValue(condition, LIKE, column, val, SqlLike.RIGHT); + } + + @Override + public Children between(boolean condition, SFunction column, Object val1, Object val2) { + return doIt(condition, () -> columnToString(column), BETWEEN, () -> formatSql("{0}", val1), AND, + () -> formatSql("{0}", val2)); + } + + @Override + public Children notBetween(boolean condition, SFunction column, Object val1, Object val2) { + return doIt(condition, () -> columnToString(column), NOT_BETWEEN, () -> formatSql("{0}", val1), AND, + () -> formatSql("{0}", val2)); + } + + @Override + public Children and(boolean condition, Consumer consumer) { + return and(condition).addNestedCondition(condition, consumer); + } + + @Override + public Children or(boolean condition, Consumer consumer) { + return or(condition).addNestedCondition(condition, consumer); + } + + @Override + public Children nested(boolean condition, Consumer consumer) { + return addNestedCondition(condition, consumer); + } + + @Override + public Children not(boolean condition, Consumer consumer) { + return not(condition).addNestedCondition(condition, consumer); + } + + @Override + public Children or(boolean condition) { + return doIt(condition, OR); + } + + @Override + public Children apply(boolean condition, String applySql, Object... value) { + return doIt(condition, APPLY, () -> formatSql(applySql, value)); + } + + @Override + public Children last(boolean condition, String lastSql) { + if (condition) { + this.lastSql.setStringValue(StringPool.SPACE + lastSql); + } + return typedThis; + } + + @Override + public Children comment(boolean condition, String comment) { + if (condition) { + this.sqlComment.setStringValue(comment); + } + return typedThis; + } + + @Override + public Children first(boolean condition, String firstSql) { + if (condition) { + this.sqlFirst.setStringValue(firstSql); + } + return typedThis; + } + + @Override + public Children exists(boolean condition, String existsSql) { + return doIt(condition, EXISTS, () -> String.format("(%s)", existsSql)); + } + + @Override + public Children notExists(boolean condition, String existsSql) { + return not(condition).exists(condition, existsSql); + } + + @Override + public Children isNull(boolean condition, SFunction column) { + return doIt(condition, () -> columnToString(column), IS_NULL); + } + + @Override + public Children isNotNull(boolean condition, SFunction column) { + return doIt(condition, () -> columnToString(column), IS_NOT_NULL); + } + + @Override + public Children in(boolean condition, SFunction column, Collection coll) { + return doIt(condition, () -> columnToString(column), IN, inExpression(coll)); + } + + @Override + public Children notIn(boolean condition, SFunction column, Collection coll) { + return doIt(condition, () -> columnToString(column), NOT_IN, inExpression(coll)); + } + + @Override + public Children inSql(boolean condition, SFunction column, String inValue) { + return doIt(condition, () -> columnToString(column), IN, () -> String.format("(%s)", inValue)); + } + + @Override + public Children notInSql(boolean condition, SFunction column, String inValue) { + return doIt(condition, () -> columnToString(column), NOT_IN, () -> String.format("(%s)", inValue)); + } + + @Override + public Children groupBy(boolean condition, SFunction... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + return doIt(condition, GROUP_BY, + () -> columns.length == 1 ? columnToString(columns[0]) : columnsToString(columns)); + } + + @Override + public Children orderBy(boolean condition, boolean isAsc, SFunction... columns) { + if (ArrayUtils.isEmpty(columns)) { + return typedThis; + } + SqlKeyword mode = isAsc ? ASC : DESC; + for (SFunction column : columns) { + doIt(condition, ORDER_BY, () -> columnToString(column), mode); + } + return typedThis; + } + + @Override + public Children having(boolean condition, String sqlHaving, Object... params) { + return doIt(condition, HAVING, () -> formatSqlIfNeed(condition, sqlHaving, params)); + } + + @Override + public Children func(boolean condition, Consumer consumer) { + if (condition) { + consumer.accept(typedThis); + } + return typedThis; + } + + /** + * 内部自用 + *

NOT 关键词

+ */ + protected Children not(boolean condition) { + return doIt(condition, NOT); + } + + /** + * 内部自用 + *

拼接 AND

+ */ + protected Children and(boolean condition) { + return doIt(condition, AND); + } + + /** + * 内部自用 + *

拼接 LIKE 以及 值

+ */ + protected Children likeValue(boolean condition, SqlKeyword keyword, SFunction column, Object val, SqlLike sqlLike) { + return doIt(condition, () -> columnToString(column), keyword, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike))); + } + + /** + * 普通查询条件 + * + * @param condition 是否执行 + * @param column 属性 + * @param sqlKeyword SQL 关键词 + * @param val 条件值 + */ + protected Children addCondition(boolean condition, SFunction column, SqlKeyword sqlKeyword, Object val) { + return doIt(condition, () -> columnToString(column), sqlKeyword, () -> formatSql("{0}", val)); + } + + /** + * 多重嵌套查询条件 + * + * @param condition 查询条件值 + */ + protected Children addNestedCondition(boolean condition, Consumer consumer) { + if (condition) { + final Children instance = instance(); + consumer.accept(instance); + return doIt(true, APPLY, instance); + } + return typedThis; + } + /** * 子类返回一个自己的新对象 */ @@ -122,6 +428,16 @@ public abstract class MyAbstractWrapper value) { + return () -> value.stream().map(i -> formatSql("{0}", i)) + .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET)); + } + /** * 必要的初始化 */ @@ -145,6 +461,20 @@ public abstract class MyAbstractWrapper getParamNameValuePairs() { + return paramNameValuePairs; + } /** * 获取 columnName */ - protected String columnToString(R column) { + protected String columnToString(X column) { return (String) column; } + /** + * 多字段转换为逗号 "," 分割字符串 + * + * @param columns 多字段 + */ + protected String columnsToString(X... columns) { + return Arrays.stream(columns).map(this::columnToString).collect(joining(StringPool.COMMA)); + } + @Override @SuppressWarnings("all") public Children clone() { diff --git a/src/main/java/com/github/mybatisplus/wrapper/MyJoinLambdaQueryWrapper.java b/src/main/java/com/github/mybatisplus/wrapper/MyJoinLambdaQueryWrapper.java deleted file mode 100644 index 8915b2b..0000000 --- a/src/main/java/com/github/mybatisplus/wrapper/MyJoinLambdaQueryWrapper.java +++ /dev/null @@ -1,354 +0,0 @@ -package com.github.mybatisplus.wrapper; - -import com.baomidou.mybatisplus.core.conditions.SharedString; -import com.baomidou.mybatisplus.core.conditions.query.Query; -import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; -import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; -import com.baomidou.mybatisplus.core.toolkit.Assert; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.mybatisplus.func.MySFunction; -import com.github.mybatisplus.toolkit.MyLambdaUtils; -import com.github.mybatisplus.wrapper.interfaces.MyJoin; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * 链接查询子Query - * - * @author yulichang - * @see com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper - * @since 2021/01/19 - */ -@SuppressWarnings("all") -public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper> - implements Query, T, SFunction>, MyJoin, T> { - - protected SharedString sqlSelect = new SharedString(); - /** - * select字段 - */ - protected List selectColumnList = new ArrayList<>(); - /** - * 表名 - */ - protected SharedString from = new SharedString(); - /** - * 子表列表 - */ - protected List classList = new ArrayList<>(); - /** - * 表序号 - */ - protected int rUid = 1; - - - - public MyJoinLambdaQueryWrapper() { - setEntity(null); - super.initNeed(); - } - - public MyJoinLambdaQueryWrapper(int rUid) { - this.rUid = rUid; - setEntity(null); - super.initNeed(); - } - - public MyJoinLambdaQueryWrapper(T entity, Class entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, - Map paramNameValuePairs, MergeSegments mergeSegments, - SharedString lastSql, SharedString sqlComment) { - setEntity(entity); - setEntityClass(entityClass); - this.paramNameSeq = paramNameSeq; - this.paramNameValuePairs = paramNameValuePairs; - this.expression = mergeSegments; - this.sqlSelect = sqlSelect; - this.lastSql = lastSql; - this.sqlComment = sqlComment; - } - - @Override - protected MyJoinLambdaQueryWrapper instance() { - return new MyJoinLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString()); - } - - @Override - public void clear() { - super.clear(); - this.sqlSelect.toNull(); - this.selectColumnList.clear(); - this.from.toNull(); - this.classList.clear(); - this.rUid = 1; - } - - @SafeVarargs - @Override - public final MyJoinLambdaQueryWrapper select(SFunction... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - for (SFunction str : columns) { - selectColumnList.add(new SelectColumn(rUid, columnToString(str), null, null)); - } - } - return typedThis; - } - - /** - * 查询所有字段 (后置处理) - */ - public MyJoinLambdaQueryWrapper selectAll(Class clazz) { - setEntityClass(clazz); - TableInfo info = TableInfoHelper.getTableInfo(getEntityClass()); - Assert.notNull(info, "can not find table to entity %s", clazz); - info.getFieldList().forEach(s -> - selectColumnList.add(new SelectColumn(this.rUid, s.getColumn(), null, null))); - if (StringUtils.isNotBlank(info.getKeyColumn())) { - selectColumnList.add(new SelectColumn(this.rUid, info.getKeyColumn(), null, null)); - } - return typedThis; - } - - /** - * 字段去重(同时使用select和as的情况下去除select中重复查询的列,优先使用as列作为查询字段) - * 注意: - * 只对selectDistinct前面的 select selectAll as(asCount ...)有效 - * 只对当前的表去重,对连接查询的其他表不生效,如需要在对应的表下使用此方法 - */ - public MyJoinLambdaQueryWrapper selectDistinct() { - List collect = selectColumnList.stream().filter(i -> i.getUid() == rUid).collect(Collectors.toList()); - List distinctList = new ArrayList<>(); - - List collect1 = collect.stream().distinct().collect(Collectors.toList()); - if (collect.size() != collect1.size()) { - collect.forEach(i -> { - if (!collect1.contains(i)) { - distinctList.add(i); - } - }); - } - for (SelectColumn x : collect1) { - if (x.getAs() != null) { - for (SelectColumn y : collect1) { - if (x.getUid() == y.getUid() && x.getColumn().equals(y.getColumn()) && y.getAs() == null) { - distinctList.add(y); - } - } - } - } - - selectColumnList.removeIf(distinctList::contains); - return this; - } - - @Override - public MyJoinLambdaQueryWrapper select(Predicate predicate) { - return select(getEntityClass(), predicate); - } - - - @Override - public MyJoinLambdaQueryWrapper select(Class entityClass, Predicate predicate) { - setEntityClass(entityClass); - TableInfo info = TableInfoHelper.getTableInfo(getEntityClass()); - Assert.notNull(info, "can not find table to entity %s", entityClass); - info.getFieldList().stream().filter(predicate).forEach(s -> - selectColumnList.add(new SelectColumn(this.rUid, s.getColumn(), null, null))); - return typedThis; - } - - @Override - public MyJoinLambdaQueryWrapper join(boolean condition, - String alias, - String keyWord, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - if (condition) { - setEntityClass(MyLambdaUtils.getEntityClass(leftCondition)); - int childrenId = rUid + 1; - Class clazz = MyLambdaUtils.getEntityClass(rightCondition); - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "can not find table to entity %s", clazz); - classList.add(new SubTable(alias, keyWord, rUid, MyLambdaUtils.getColumn(leftCondition), childrenId, MyLambdaUtils.getColumn(rightCondition), info.getTableName())); - MyJoinLambdaQueryWrapper apply = (MyJoinLambdaQueryWrapper) rightWrapper.apply(new MyJoinLambdaQueryWrapper<>(childrenId)); - classList.addAll(apply.classList); - this.selectColumnList.addAll(apply.selectColumnList); - } - return this; - } - - /** - * 连表条件 - */ - public static class SubTable { - - private String alias; - - private String keyWord; - - private int leftUid; - - private String leftColumn; - - private int rightUid; - - private String rightColumn; - - private String rightTableName; - - public SubTable(String alias, String keyWord, int leftUid, String leftColumn, int rightUid, String rightColumn, String rightTableName) { - this.alias = alias; - this.keyWord = keyWord; - this.leftUid = leftUid; - this.leftColumn = leftColumn; - this.rightUid = rightUid; - this.rightColumn = rightColumn; - this.rightTableName = rightTableName; - } - - public String getAlias() { - return alias; - } - - public void setAlias(String alias) { - this.alias = alias; - } - - public String getKeyWord() { - return keyWord; - } - - public void setKeyWord(String keyWord) { - this.keyWord = keyWord; - } - - public int getLeftUid() { - return leftUid; - } - - public void setLeftUid(int leftUid) { - this.leftUid = leftUid; - } - - public String getLeftColumn() { - return leftColumn; - } - - public void setLeftColumn(String leftColumn) { - this.leftColumn = leftColumn; - } - - public int getRightUid() { - return rightUid; - } - - public void setRightUid(int rightUid) { - this.rightUid = rightUid; - } - - public String getRightColumn() { - return rightColumn; - } - - public void setRightColumn(String rightColumn) { - this.rightColumn = rightColumn; - } - - public String getRightTableName() { - return rightTableName; - } - - public void setRightTableName(String rightTableName) { - this.rightTableName = rightTableName; - } - } - - /** - * select查询字段 - */ - public static class SelectColumn { - - private int uid; - - private String column; - - private String as; - - private SelectFunc function; - - public SelectColumn() { - } - - public SelectColumn(int uid, String column, String as, SelectFunc function) { - this.uid = uid; - this.column = column; - this.as = as; - this.function = function; - } - - public int getUid() { - return uid; - } - - public void setUid(int uid) { - this.uid = uid; - } - - public String getColumn() { - return column; - } - - public void setColumn(String column) { - this.column = column; - } - - public String getAs() { - return as; - } - - public void setAs(String as) { - this.as = as; - } - - public SelectFunc getFunction() { - return function; - } - - public void setFunction(SelectFunc function) { - this.function = function; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof SelectColumn)) { - return false; - } - SelectColumn v = (SelectColumn) o; - return v.getUid() == this.uid - && eq(v.getColumn(), this.column) - && eq(v.getAs(), this.as) - && eq(v.getFunction(), this.function); - } - - private boolean eq(Object o1, Object o2) { - if (o1 == null && o2 == null) { - return true; - } - if (o1 == null || o2 == null) { - return false; - } - return o1.equals(o2); - } - } -} diff --git a/src/main/java/com/github/mybatisplus/wrapper/MyLambdaQueryWrapper.java b/src/main/java/com/github/mybatisplus/wrapper/MyLambdaQueryWrapper.java index cb7574c..2ad6f9f 100644 --- a/src/main/java/com/github/mybatisplus/wrapper/MyLambdaQueryWrapper.java +++ b/src/main/java/com/github/mybatisplus/wrapper/MyLambdaQueryWrapper.java @@ -1,506 +1,233 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.github.mybatisplus.wrapper; -import com.baomidou.mybatisplus.core.conditions.ISqlSegment; import com.baomidou.mybatisplus.core.conditions.SharedString; -import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; -import com.baomidou.mybatisplus.core.enums.SqlKeyword; -import com.baomidou.mybatisplus.core.enums.SqlLike; -import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; -import com.baomidou.mybatisplus.core.toolkit.*; -import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; -import com.github.mybatisplus.func.MySFunction; +import com.github.mybatisplus.wrapper.interfaces.MyLambdaJoin; +import com.github.mybatisplus.wrapper.interfaces.MySFunctionQuery; import com.github.mybatisplus.toolkit.Constant; import com.github.mybatisplus.toolkit.MyLambdaUtils; -import com.github.mybatisplus.wrapper.interfaces.*; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; - -import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; -import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; -import static java.util.stream.Collectors.joining; +import java.util.stream.Collectors; /** - * 连接查询Query - * 只允许主表有条件查询,内部的表只允许select和继续连表的功能, - * 所以将条件查询接口在此实现 结构臃肿,有待进一步优化 + * Lambda 语法使用 Wrapper * - * @author yulichang - * @see com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper - * @see com.baomidou.mybatisplus.core.conditions.interfaces.Compare - * @see com.baomidou.mybatisplus.core.conditions.interfaces.Join - * @see com.baomidou.mybatisplus.core.conditions.interfaces.Nested - * @see com.baomidou.mybatisplus.core.conditions.interfaces.Func - * @since 2021/01/19 + * @author hubin miemie HCL + * @since 2017-05-26 */ -@SuppressWarnings("all") +@SuppressWarnings("serial") public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper> - implements - Query, T, SFunction>, - MyJoin, T>, - MyCompare>, - MyNested, MyLambdaQueryWrapper>, - MyFunc>, - MyMPJoin> { + implements MySFunctionQuery>, MyLambdaJoin> { + /** + * 查询字段 + */ + private SharedString sqlSelect = new SharedString(); - private MyJoinLambdaQueryWrapper wrapper = new MyJoinLambdaQueryWrapper<>(); + /** + * 查询表 + */ + private SharedString from = new SharedString(); /** - * 表别名初始序号 + * 主表别名 */ - public static final int TABLE_ALIAS_INDEX = 0; + private SharedString alias = new SharedString(); + private List selectColumns = new ArrayList<>(); + + + /** + * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) + */ public MyLambdaQueryWrapper() { - this(null); + this((T) null); } + /** + * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) + */ public MyLambdaQueryWrapper(T entity) { - wrapper.rUid = TABLE_ALIAS_INDEX; - wrapper.setEntity(entity); + super.setEntity(entity); super.initNeed(); } + /** + * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity) + */ + public MyLambdaQueryWrapper(Class entityClass) { + super.setEntityClass(entityClass); + super.initNeed(); + } + + /** + * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(...) + */ MyLambdaQueryWrapper(T entity, Class entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, - SharedString lastSql, SharedString sqlComment, SharedString sqlFirst, - int rUid, List selectColumns, List classList) { + SharedString lastSql, SharedString sqlComment, SharedString sqlFirst) { super.setEntity(entity); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; this.paramNameValuePairs = paramNameValuePairs; this.expression = mergeSegments; - this.wrapper.sqlSelect = sqlSelect; + this.sqlSelect = sqlSelect; this.lastSql = lastSql; this.sqlComment = sqlComment; this.sqlFirst = sqlFirst; - - wrapper.rUid = rUid; - wrapper.selectColumnList = selectColumns; - wrapper.classList = classList; - } - - @Override - protected MyLambdaQueryWrapper instance() { - return new MyLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, - new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), - wrapper.rUid, wrapper.selectColumnList, wrapper.classList); - } - - - @Override - public MyLambdaQueryWrapper join(boolean condition, - String alias, - String keyWord, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - if (condition) { - setEntityClass(MyLambdaUtils.getEntityClass(leftCondition)); - Class clazz = MyLambdaUtils.getEntityClass(rightCondition); - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "can not find table to entity %s", clazz); - wrapper.classList.add(new MyJoinLambdaQueryWrapper.SubTable(alias, - keyWord, - wrapper.rUid, - MyLambdaUtils.getColumn(leftCondition), - wrapper.classList.size() + 1, - MyLambdaUtils.getColumn(rightCondition), - info.getTableName())); - MyJoinLambdaQueryWrapper apply = rightWrapper.apply(new MyJoinLambdaQueryWrapper<>(wrapper.classList.size())); - wrapper.classList.addAll(apply.classList); - wrapper.selectColumnList.addAll(apply.selectColumnList); - } - return this; } + /** + * SELECT 部分 SQL 设置 + * + * @param columns 查询字段 + */ @SafeVarargs - @Override - public final MyLambdaQueryWrapper select(SFunction... columns) { - wrapper.select(columns); - return this; + public final MyLambdaQueryWrapper select(SFunction... columns) { + if (ArrayUtils.isNotEmpty(columns)) { + for (SFunction s : columns) { + Class clazz = MyLambdaUtils.getEntityClass(s); + TableInfo info = TableInfoHelper.getTableInfo(clazz); + selectColumns.add(new SelectColumn(clazz, info.getTableName(), MyLambdaUtils.getColumn(s))); + } + } + return typedThis; } @Override - public MyLambdaQueryWrapper select(Predicate predicate) { - wrapper.select(predicate); - return this; + public MyLambdaQueryWrapper select(Class entityClass, Predicate predicate) { + TableInfo info = TableInfoHelper.getTableInfo(entityClass); + Assert.notNull(info, "table can not be find"); + info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach( + i -> selectColumns.add(new SelectColumn(entityClass, info.getTableName(), i.getColumn()))); + return typedThis; } - @Override - public MyLambdaQueryWrapper select(Class entityClass, Predicate predicate) { - wrapper.select(entityClass, predicate); - return this; - } - - - public MyLambdaQueryWrapper selectAll(Class clazz) { - wrapper.selectAll(clazz); - return this; - } - - public MyLambdaQueryWrapper selectDistinct() { - wrapper.selectDistinct(); - return this; - } @Override public String getSqlSelect() { - if (StringUtils.isBlank(wrapper.sqlSelect.getStringValue()) && CollectionUtils.isNotEmpty(wrapper.selectColumnList)) { - List collect = new ArrayList<>(); - wrapper.selectColumnList.forEach(c -> { - String s = Constant.TABLE_ALIAS + (c.getUid() == TABLE_ALIAS_INDEX ? "" : c.getUid()) + StringPool.DOT + c.getColumn(); - if (c.getFunction() != null) { - s = String.format(c.getFunction().getSql(), s); - } - if (Objects.isNull(c.getAs())) { - collect.add(s); - } else { - collect.add(s + Constant.AS + c.getAs()); - } - }); - wrapper.sqlSelect.setStringValue(String.join(StringPool.COMMA, collect)); + if (StringUtils.isBlank(sqlSelect.getStringValue())) { + String s = selectColumns.stream().map(i -> i.getTableName() + StringPool.DOT + i.getColumnName()).collect(Collectors.joining(StringPool.COMMA)); + sqlSelect.setStringValue(s); } - return wrapper.sqlSelect.getStringValue(); + return sqlSelect.getStringValue(); + } + + + public String getFrom() { + return from.getStringValue(); + } + + public String getAlias() { + return alias.getStringValue(); + } + + /** + * 用于生成嵌套 sql + *

故 sqlSelect 不向下传递

+ */ + @Override + protected MyLambdaQueryWrapper instance() { + return new MyLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs, + new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString()); } @Override public void clear() { super.clear(); + sqlSelect.toNull(); } - public String getFrom() { - if (StringUtils.isNotBlank(wrapper.from.getStringValue())) { - return wrapper.from.getStringValue(); + @Override + public MyLambdaQueryWrapper join(String keyWord, boolean condition, Class clazz, SFunction left, SFunction right) { + if (condition) { + TableInfo leftInfo = TableInfoHelper.getTableInfo(clazz); + TableInfo rightInfo = TableInfoHelper.getTableInfo(MyLambdaUtils.getEntityClass(right)); + + String s = keyWord + leftInfo.getTableName() + Constant.ON + leftInfo.getTableName() + StringPool.DOT + + MyLambdaUtils.getColumn(left) + Constant.EQUALS + rightInfo.getTableName() + StringPool.DOT + + MyLambdaUtils.getColumn(right); + + if (StringUtils.isBlank(from.getStringValue())) { + from.setStringValue(s); + } else { + from.setStringValue(from.getStringValue() + s); + } } - StringBuilder sb = new StringBuilder(); - wrapper.classList.forEach(right -> - sb.append(right.getKeyWord()).append(right.getRightTableName()) - .append(StringPool.SPACE) - .append(Constant.TABLE_ALIAS) - .append(right.getRightUid() == TABLE_ALIAS_INDEX ? StringPool.EMPTY : right.getRightUid()) - .append(Constant.ON) - .append(Constant.TABLE_ALIAS) - .append(right.getLeftUid() == TABLE_ALIAS_INDEX ? StringPool.EMPTY : right.getLeftUid()) - .append(StringPool.DOT) - .append(right.getLeftColumn()) - .append(Constant.EQUALS) - .append(Constant.TABLE_ALIAS) - .append(right.getRightUid() == TABLE_ALIAS_INDEX ? StringPool.EMPTY : right.getRightUid()) - .append(StringPool.DOT) - .append(right.getRightColumn()) - .append(StringPool.SPACE) - ); - wrapper.from.setStringValue(sb.toString()); - return wrapper.from.getStringValue(); + return typedThis; } /** - * 获取表前缀 + * select字段 */ - private String getClassTablePrefix(Class clazz) { - if (getEntityClass() == clazz) { - return Constant.TABLE_ALIAS; - } else { - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "can not find table to entity %s", clazz); - String tableName = info.getTableName(); - for (MyJoinLambdaQueryWrapper.SubTable sub : wrapper.classList) { - if (sub.getRightTableName().equals(tableName)) { - return Constant.TABLE_ALIAS + sub.getRightUid(); - } - } + public static class SelectColumn { + + private Class clazz; + + private String tableName; + + private String columnName; + + + public SelectColumn(Class clazz, String tableName, String columnName) { + this.clazz = clazz; + this.tableName = tableName; + this.columnName = columnName; } - throw new MybatisPlusException("table not find"); - } - /** - * 获取column - */ - private String getColumn(MySFunction column, String alias) { - if (alias != null) { - if (alias.equals(Constant.TABLE_ALIAS)) { - return Constant.TABLE_ALIAS + StringPool.DOT + column2String(column, true); - } - for (MyJoinLambdaQueryWrapper.SubTable sub : wrapper.classList) { - if (alias.equals(sub.getAlias())) { - return Constant.TABLE_ALIAS + sub.getRightUid() + StringPool.DOT + column2String(column, true); - } - } + + public Class getClazz() { + return clazz; } - return getClassTablePrefix(MyLambdaUtils.getEntityClass(column)) + StringPool.DOT + column2String(column, true); - } - private String getColumn(String alias, MySFunction... column) { - return Arrays.stream(column).map(i -> getColumn(i, alias)).collect(joining(StringPool.COMMA)); - } - - @Override - public MyLambdaQueryWrapper eq(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), EQ, - () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper eq(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), EQ, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper ne(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), NE, () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper ne(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), NE, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper gt(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), GT, () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper gt(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), GT, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper ge(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), GE, () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper ge(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), GE, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper lt(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), LT, () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper lt(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), LT, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper le(boolean condition, String alias, MySFunction column, Object val) { - return doIt(condition, () -> getColumn(column, alias), LE, () -> formatSql("{0}", val)); - } - - @Override - public MyLambdaQueryWrapper le(boolean condition, String alias, MySFunction column, String as, MySFunction val) { - return doIt(condition, () -> getColumn(column, alias), LE, () -> getColumn(val, as)); - } - - @Override - public MyLambdaQueryWrapper between(boolean condition, String alias, MySFunction column, Object val1, Object val2) { - return doIt(condition, () -> getColumn(column, alias), BETWEEN, () -> formatSql("{0}", val1), AND, - () -> formatSql("{0}", val2)); - } - - @Override - public MyLambdaQueryWrapper notBetween(boolean condition, String alias, MySFunction column, Object val1, Object val2) { - return doIt(condition, () -> getColumn(column, alias), NOT_BETWEEN, () -> formatSql("{0}", val1), AND, - () -> formatSql("{0}", val2)); - } - - @Override - public MyLambdaQueryWrapper like(boolean condition, String alias, MySFunction column, Object val) { - return likeValue(condition, LIKE, getColumn(column, alias), val, SqlLike.DEFAULT); - } - - @Override - public MyLambdaQueryWrapper notLike(boolean condition, String alias, MySFunction column, Object val) { - return likeValue(condition, NOT_LIKE, getColumn(column, alias), val, SqlLike.DEFAULT); - } - - @Override - public MyLambdaQueryWrapper likeLeft(boolean condition, String alias, MySFunction column, Object val) { - return likeValue(condition, LIKE, getColumn(column, alias), val, SqlLike.LEFT); - } - - @Override - public MyLambdaQueryWrapper likeRight(boolean condition, String alias, MySFunction column, Object val) { - return likeValue(condition, LIKE, getColumn(column, alias), val, SqlLike.RIGHT); - } - - @Override - public MyLambdaQueryWrapper and(boolean condition, Consumer> consumer) { - return and(condition).addNestedCondition(condition, consumer); - } - - @Override - public MyLambdaQueryWrapper or(boolean condition, Consumer> consumer) { - return or(condition).addNestedCondition(condition, consumer); - } - - @Override - public MyLambdaQueryWrapper nested(boolean condition, Consumer> consumer) { - return addNestedCondition(condition, consumer); - } - - @Override - public MyLambdaQueryWrapper not(boolean condition, Consumer> consumer) { - return not(condition).addNestedCondition(condition, consumer); - } - - - private MyLambdaQueryWrapper and(boolean condition) { - return doIt(condition, AND); - } - - @Override - public MyLambdaQueryWrapper or(boolean condition) { - return doIt(condition, OR); - } - - @Override - public MyLambdaQueryWrapper apply(boolean condition, String applySql, Object... value) { - return doIt(condition, APPLY, () -> formatSql(applySql, value)); - } - - @Override - public MyLambdaQueryWrapper last(boolean condition, String lastSql) { - if (condition) { - this.lastSql.setStringValue(StringPool.SPACE + lastSql); + public void setClazz(Class clazz) { + this.clazz = clazz; } - return typedThis; - } - @Override - public MyLambdaQueryWrapper comment(boolean condition, String comment) { - if (condition) { - this.sqlComment.setStringValue(comment); + public String getTableName() { + return tableName; } - return typedThis; - } - @Override - public MyLambdaQueryWrapper first(boolean condition, String firstSql) { - if (condition) { - this.sqlFirst.setStringValue(firstSql); + public void setTableName(String tableName) { + this.tableName = tableName; } - return typedThis; - } - @Override - public MyLambdaQueryWrapper exists(boolean condition, String existsSql) { - return doIt(condition, EXISTS, () -> String.format("(%s)", existsSql)); - } - - @Override - public MyLambdaQueryWrapper notExists(boolean condition, String existsSql) { - return not(condition).exists(condition, existsSql); - } - - private MyLambdaQueryWrapper not(boolean condition) { - return doIt(condition, NOT); - } - - private MyLambdaQueryWrapper doIt(boolean condition, ISqlSegment... sqlSegments) { - if (condition) { - expression.add(sqlSegments); + public String getColumnName() { + return columnName; } - return this; - } - private MyLambdaQueryWrapper likeValue(boolean condition, SqlKeyword keyword, String column, Object val, SqlLike sqlLike) { - return doIt(condition, () -> column, keyword, () -> formatSql("{0}", SqlUtils.concatLike(val, sqlLike))); - } - - protected MyLambdaQueryWrapper addCondition(boolean condition, String column, SqlKeyword sqlKeyword, Object val) { - return doIt(condition, () -> column, sqlKeyword, () -> formatSql("{0}", val)); - } - - private MyLambdaQueryWrapper addNestedCondition(boolean condition, Consumer> consumer) { - if (condition) { - final MyLambdaQueryWrapper instance = instance(); - consumer.accept(instance); - return doIt(true, APPLY, instance); + public void setColumnName(String columnName) { + this.columnName = columnName; } - return this; - } - - private ISqlSegment inExpression(Collection value) { - return () -> value.stream().map(i -> formatSql("{0}", i)) - .collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET)); - } - - @Override - public MyLambdaQueryWrapper isNull(boolean condition, String alias, MySFunction column) { - return doIt(condition, () -> getColumn(column, alias), IS_NULL); - } - - @Override - public MyLambdaQueryWrapper isNotNull(boolean condition, String alias, MySFunction column) { - return doIt(condition, () -> getColumn(column, alias), IS_NOT_NULL); - } - - @Override - public MyLambdaQueryWrapper in(boolean condition, String alias, MySFunction column, Collection coll) { - return doIt(condition, () -> getColumn(column, alias), IN, inExpression(coll)); - } - - @Override - public MyLambdaQueryWrapper notIn(boolean condition, String alias, MySFunction column, Collection coll) { - return doIt(condition, () -> getColumn(column, alias), NOT_IN, inExpression(coll)); - } - - @Override - public MyLambdaQueryWrapper inSql(boolean condition, String alias, MySFunction column, String inValue) { - return doIt(condition, () -> getColumn(column, alias), IN, () -> String.format("(%s)", inValue)); - } - - @Override - public MyLambdaQueryWrapper notInSql(boolean condition, String alias, MySFunction column, String inValue) { - return doIt(condition, () -> getColumn(column, alias), NOT_IN, () -> String.format("(%s)", inValue)); - } - - @Override - public MyLambdaQueryWrapper groupBy(boolean condition, String alias, MySFunction... columns) { - if (ArrayUtils.isEmpty(columns)) { - return this; - } - return doIt(condition, GROUP_BY, - () -> columns.length == 1 ? getColumn(columns[0], alias) : getColumn(alias, columns)); - } - - @Override - public MyLambdaQueryWrapper orderBy(boolean condition, String alias, boolean isAsc, MySFunction... columns) { - if (ArrayUtils.isEmpty(columns)) { - return this; - } - SqlKeyword mode = isAsc ? ASC : DESC; - for (MySFunction column : columns) { - doIt(condition, ORDER_BY, () -> getColumn(column, alias), mode); - } - return this; - } - - @Override - public MyLambdaQueryWrapper having(boolean condition, String alias, String sqlHaving, Object... params) { - return doIt(condition, HAVING, () -> formatSqlIfNeed(condition, sqlHaving, params)); - } - - @Override - public MyLambdaQueryWrapper func(boolean condition, String alias, Consumer> consumer) { - if (condition) { - consumer.accept(this); - } - return this; } } diff --git a/src/main/java/com/github/mybatisplus/wrapper/MyWrapper.java b/src/main/java/com/github/mybatisplus/wrapper/MyWrapper.java new file mode 100644 index 0000000..e1ada0d --- /dev/null +++ b/src/main/java/com/github/mybatisplus/wrapper/MyWrapper.java @@ -0,0 +1,170 @@ +package com.github.mybatisplus.wrapper; + +import com.baomidou.mybatisplus.core.conditions.ISqlSegment; +import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.*; + +import java.util.Objects; + +/** + * copy {@link com.baomidou.mybatisplus.core.conditions.Wrapper} + *

+ * join wrapper的顶级wrapper + * 与mp的Wrapper没做任何改动 + *

+ * 因为单表wrapper与多表wrapper体系不一样,暂时先分开,后续可以统一wrapper + */ +@SuppressWarnings("all") +public abstract class MyWrapper implements ISqlSegment { + + /** + * 实体对象(子类实现) + * + * @return 泛型 T + */ + public abstract T getEntity(); + + public String getSqlSelect() { + return null; + } + + public String getSqlSet() { + return null; + } + + public String getSqlComment() { + return null; + } + + public String getSqlFirst() { + return null; + } + + /** + * 获取 MergeSegments + */ + public abstract MergeSegments getExpression(); + + /** + * 获取自定义SQL 简化自定义XML复杂情况 + *

+ * 使用方法: `select xxx from table` + ${ew.customSqlSegment} + *

+ * 注意事项: + * 1. 逻辑删除需要自己拼接条件 (之前自定义也同样) + * 2. 不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦) + * 3. 用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!) + * 4. ew是wrapper定义别名,不能使用其他的替换 + */ + public String getCustomSqlSegment() { + MergeSegments expression = getExpression(); + if (Objects.nonNull(expression)) { + NormalSegmentList normal = expression.getNormal(); + String sqlSegment = getSqlSegment(); + if (StringUtils.isNotBlank(sqlSegment)) { + if (normal.isEmpty()) { + return sqlSegment; + } else { + return Constants.WHERE + StringPool.SPACE + sqlSegment; + } + } + } + return StringPool.EMPTY; + } + + /** + * 查询条件为空(包含entity) + */ + public boolean isEmptyOfWhere() { + return isEmptyOfNormal() && isEmptyOfEntity(); + } + + /** + * 查询条件不为空(包含entity) + */ + public boolean nonEmptyOfWhere() { + return !isEmptyOfWhere(); + } + + /** + * 查询条件为空(不包含entity) + */ + public boolean isEmptyOfNormal() { + return CollectionUtils.isEmpty(getExpression().getNormal()); + } + + /** + * 查询条件为空(不包含entity) + */ + public boolean nonEmptyOfNormal() { + return !isEmptyOfNormal(); + } + + /** + * 深层实体判断属性 + * + * @return true 不为空 + */ + public boolean nonEmptyOfEntity() { + T entity = getEntity(); + if (entity == null) { + return false; + } + TableInfo tableInfo = TableInfoHelper.getTableInfo(entity.getClass()); + if (tableInfo == null) { + return false; + } + if (tableInfo.getFieldList().stream().anyMatch(e -> fieldStrategyMatch(entity, e))) { + return true; + } + return StringUtils.isNotBlank(tableInfo.getKeyProperty()) ? Objects.nonNull(ReflectionKit.getFieldValue(entity, tableInfo.getKeyProperty())) : false; + } + + /** + * 根据实体FieldStrategy属性来决定判断逻辑 + */ + private boolean fieldStrategyMatch(T entity, TableFieldInfo e) { + switch (e.getWhereStrategy()) { + case NOT_NULL: + return Objects.nonNull(ReflectionKit.getFieldValue(entity, e.getProperty())); + case IGNORED: + return true; + case NOT_EMPTY: + return StringUtils.checkValNotNull(ReflectionKit.getFieldValue(entity, e.getProperty())); + case NEVER: + return false; + default: + return Objects.nonNull(ReflectionKit.getFieldValue(entity, e.getProperty())); + } + } + + /** + * 深层实体判断属性 + * + * @return true 为空 + */ + public boolean isEmptyOfEntity() { + return !nonEmptyOfEntity(); + } + + /** + * 获取格式化后的执行sql + * + * @return sql + * @since 3.3.1 + */ + public String getTargetSql() { + return getSqlSegment().replaceAll("#\\{.+?}", "?"); + } + + /** + * 条件清空 + * + * @since 3.3.1 + */ + abstract public void clear(); +} diff --git a/src/main/java/com/github/mybatisplus/wrapper/SelectFunc.java b/src/main/java/com/github/mybatisplus/wrapper/SelectFunc.java deleted file mode 100644 index 57bf471..0000000 --- a/src/main/java/com/github/mybatisplus/wrapper/SelectFunc.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.mybatisplus.wrapper; - -public enum SelectFunc { - - SUM("SUM( %s )", "求和"), - COUNT("COUNT( %s )", "数量"), - AVG("AVG( %s )", "平均值"), - MAX("MAX( %s )", "最大值"), - MIN("MIN( %s )", "最小值"), - DATE_FORMAT("DATE_FORMAT( %s ,'%Y-%m-%d %H:%i:%s')", "日期格式化"); - - private final String sql; - private final String desc; - - SelectFunc(String sql, String desc) { - this.sql = sql; - this.desc = desc; - } - - public String getSql() { - return sql; - } - - public String getDesc() { - return desc; - } -} diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyCompare.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyCompare.java index 4563688..81b8a89 100644 --- a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyCompare.java +++ b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyCompare.java @@ -1,422 +1,287 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.github.mybatisplus.wrapper.interfaces; -import com.github.mybatisplus.func.MySFunction; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import java.io.Serializable; +import java.util.Map; +import java.util.function.BiPredicate; /** - * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Compare} + * 查询条件封装 + *

比较值

+ * + * @author hubin miemie HCL + * @since 2017-05-26 */ public interface MyCompare extends Serializable { - /* 遗弃allEq */ - - /* ***************************************** eq start ********************************************* */ - - Children eq(boolean condition, String alias, MySFunction column, Object val); - - default Children eq(boolean condition, MySFunction column, Object val) { - return eq(condition, null, column, val); - } - - default Children eq(String alias, MySFunction column, Object val) { - return eq(true, alias, column, val); - } - - default Children eq(MySFunction column, Object val) { - return eq(true, null, column, val); - } - - Children eq(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - default Children eq(MySFunction column, MySFunction val) { - return eq(true, null, column, null, val); - } - - default Children eq(Boolean condition, MySFunction column, MySFunction val) { - return eq(condition, null, column, null, val); - } - - default Children eq(String alias, MySFunction column, MySFunction val) { - return eq(true, alias, column, null, val); - } - - default Children eq(MySFunction column, String as, MySFunction val) { - return eq(true, null, column, as, val); - } - - default Children eq(Boolean condition, String alias, MySFunction column, MySFunction val) { - return eq(condition, alias, column, null, val); - } - - default Children eq(Boolean condition, MySFunction column, String as, MySFunction val) { - return eq(condition, null, column, as, val); - } - - default Children eq(String alias, MySFunction column, String as, MySFunction val) { - return eq(true, alias, column, as, val); - } - - /* ***************************************** eq end ********************************************* */ - - - /* ***************************************** ne start ********************************************* */ - - default Children ne(MySFunction column, Object val) { - return ne(true, null, column, val); - } - - default Children ne(boolean condition, MySFunction column, Object val) { - return ne(condition, null, column, val); - } - - default Children ne(String alias, MySFunction column, Object val) { - return ne(true, alias, column, val); - } - - Children ne(boolean condition, String alias, MySFunction column, Object val); - - default Children ne(MySFunction column, MySFunction val) { - return ne(true, null, column, null, val); - } - - default Children ne(boolean condition, MySFunction column, MySFunction val) { - return ne(condition, null, column, null, val); - } - - default Children ne(String alias, MySFunction column, MySFunction val) { - return ne(true, alias, column, null, val); - } - - default Children ne(MySFunction column, String as, MySFunction val) { - return ne(true, null, column, as, val); - } - - default Children ne(boolean condition, String alias, MySFunction column, MySFunction val) { - return ne(condition, alias, column, null, val); - } - - default Children ne(String alias, MySFunction column, String as, MySFunction val) { - return ne(true, alias, column, as, val); - } - - default Children ne(boolean condition, MySFunction column, String as, MySFunction val) { - return ne(condition, null, column, as, val); - } - - Children ne(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - /* ***************************************** ne end ********************************************* */ - - - /* ***************************************** gt start ********************************************* */ - - default Children gt(MySFunction column, Object val) { - return gt(true, null, column, val); - } - - default Children gt(boolean condition, MySFunction column, Object val) { - return gt(condition, null, column, val); - } - - default Children gt(String alias, MySFunction column, Object val) { - return gt(true, alias, column, val); - } - - Children gt(boolean condition, String alias, MySFunction column, Object val); - - default Children gt(MySFunction column, MySFunction val) { - return gt(true, null, column, null, val); - } - - default Children gt(boolean condition, MySFunction column, MySFunction val) { - return gt(condition, null, column, null, val); - } - - default Children gt(String alias, MySFunction column, MySFunction val) { - return gt(true, alias, column, null, val); - } - - default Children gt(MySFunction column, String as, MySFunction val) { - return gt(true, null, column, as, val); - } - - default Children gt(boolean condition, String alias, MySFunction column, MySFunction val) { - return gt(condition, alias, column, null, val); - } - - default Children gt(String alias, MySFunction column, String as, MySFunction val) { - return gt(true, alias, column, as, val); - } - - default Children gt(boolean condition, MySFunction column, String as, MySFunction val) { - return gt(condition, null, column, as, val); - } - - Children gt(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - - /* ***************************************** gt end ********************************************* */ - - - /* ***************************************** ge start ********************************************* */ - - default Children ge(MySFunction column, Object val) { - return ge(true, null, column, val); - } - - default Children ge(boolean condition, MySFunction column, Object val) { - return ge(condition, null, column, val); - } - - default Children ge(String alias, MySFunction column, Object val) { - return ge(true, alias, column, val); - } - - Children ge(boolean condition, String alias, MySFunction column, Object val); - - default Children ge(MySFunction column, MySFunction val) { - return ge(true, null, column, null, val); - } - - default Children ge(boolean condition, MySFunction column, MySFunction val) { - return ge(condition, null, column, null, val); - } - - default Children ge(String alias, MySFunction column, MySFunction val) { - return ge(true, alias, column, null, val); - } - - default Children ge(MySFunction column, String as, MySFunction val) { - return ge(true, null, column, as, val); - } - - default Children ge(boolean condition, String alias, MySFunction column, MySFunction val) { - return ge(condition, alias, column, null, val); - } - - default Children ge(String alias, MySFunction column, String as, MySFunction val) { - return ge(true, alias, column, as, val); - } - - default Children ge(boolean condition, MySFunction column, String as, MySFunction val) { - return ge(condition, null, column, as, val); - } - - Children ge(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - /* ***************************************** ge end ********************************************* */ - - - /* ***************************************** lt start ********************************************* */ - - default Children lt(MySFunction column, Object val) { - return lt(true, null, column, val); - } - - default Children lt(boolean condition, MySFunction column, Object val) { - return lt(condition, null, column, val); - } - - default Children lt(String alias, MySFunction column, Object val) { - return lt(true, alias, column, val); - } - - Children lt(boolean condition, String alias, MySFunction column, Object val); - - default Children lt(MySFunction column, MySFunction val) { - return lt(true, null, column, null, val); - } - - default Children lt(boolean condition, MySFunction column, MySFunction val) { - return lt(condition, null, column, null, val); - } - - default Children lt(String alias, MySFunction column, MySFunction val) { - return lt(true, alias, column, null, val); - } - - default Children lt(MySFunction column, String as, MySFunction val) { - return lt(true, null, column, as, val); - } - - default Children lt(boolean condition, String alias, MySFunction column, MySFunction val) { - return lt(condition, alias, column, null, val); - } - - default Children lt(String alias, MySFunction column, String as, MySFunction val) { - return lt(true, alias, column, as, val); - } - - default Children lt(boolean condition, MySFunction column, String as, MySFunction val) { - return lt(condition, null, column, as, val); - } - - Children lt(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - /* ***************************************** lt end ********************************************* */ - - - /* ***************************************** lt start ********************************************* */ - - default Children le(MySFunction column, Object val) { - return le(true, null, column, val); - } - - default Children le(boolean condition, MySFunction column, Object val) { - return le(condition, null, column, val); - } - - default Children le(String alias, MySFunction column, Object val) { - return le(true, alias, column, val); - } - - Children le(boolean condition, String alias, MySFunction column, Object val); - - default Children le(MySFunction column, MySFunction val) { - return le(true, null, column, null, val); - } - - default Children le(boolean condition, MySFunction column, MySFunction val) { - return le(condition, null, column, null, val); - } - - default Children le(String alias, MySFunction column, MySFunction val) { - return le(true, alias, column, null, val); - } - - default Children le(MySFunction column, String as, MySFunction val) { - return le(true, null, column, as, val); - } - - default Children le(boolean condition, String alias, MySFunction column, MySFunction val) { - return le(condition, alias, column, null, val); - } - - default Children le(String alias, MySFunction column, String as, MySFunction val) { - return le(true, alias, column, as, val); - } - - default Children le(boolean condition, MySFunction column, String as, MySFunction val) { - return le(condition, null, column, as, val); - } - - Children le(boolean condition, String alias, MySFunction column, String as, MySFunction val); - - /* ***************************************** le end ********************************************* */ - - /* ***************************************** between start ********************************************* */ - - default Children between(MySFunction column, Object val1, Object val2) { - return between(true, null, column, val1, val2); - } - - default Children between(boolean condition, MySFunction column, Object val1, Object val2) { - return between(condition, null, column, val1, val2); - } - - default Children between(String alias, MySFunction column, Object val1, Object val2) { - return between(true, alias, column, val1, val2); - } - - Children between(boolean condition, String alias, MySFunction column, Object val1, Object val2); - - /* ***************************************** between end ********************************************* */ - - - /* ***************************************** notBetween start ********************************************* */ - - default Children notBetween(MySFunction column, Object val1, Object val2) { - return notBetween(true, null, column, val1, val2); - } - - default Children notBetween(boolean condition, MySFunction column, Object val1, Object val2) { - return notBetween(condition, null, column, val1, val2); - } - - default Children notBetween(String alias, MySFunction column, Object val1, Object val2) { - return notBetween(true, alias, column, val1, val2); - } - - Children notBetween(boolean condition, String alias, MySFunction column, Object val1, Object val2); - - /* ***************************************** notBetween end ********************************************* */ - - - /* ***************************************** like start ********************************************* */ - - default Children like(MySFunction column, Object val) { - return like(true, null, column, val); - } - - default Children like(boolean condition, MySFunction column, Object val) { - return like(condition, null, column, val); - } - - default Children like(String alias, MySFunction column, Object val) { - return like(true, alias, column, val); - } - - Children like(boolean condition, String alias, MySFunction column, Object val); - - /* ***************************************** like end ********************************************* */ - - - /* ***************************************** notLike start ********************************************* */ - - default Children notLike(MySFunction column, Object val) { - return notLike(true, null, column, val); - } - - default Children notLike(boolean condition, MySFunction column, Object val) { - return notLike(condition, null, column, val); - } - - default Children notLike(String alias, MySFunction column, Object val) { - return notLike(true, alias, column, val); - } - - Children notLike(boolean condition, String alias, MySFunction column, Object val); - - /* ***************************************** notLike end ********************************************* */ - - - /* ***************************************** likeLeft start ********************************************* */ - - default Children likeLeft(MySFunction column, Object val) { - return likeLeft(true, null, column, val); - } - - default Children likeLeft(boolean condition, MySFunction column, Object val) { - return likeLeft(condition, null, column, val); - } - - default Children likeLeft(String alias, MySFunction column, Object val) { - return likeLeft(true, alias, column, val); - } - - Children likeLeft(boolean condition, String alias, MySFunction column, Object val); - - /* ***************************************** likeLeft end ********************************************* */ - - - - /* ***************************************** likeRight start ********************************************* */ - - default Children likeRight(MySFunction column, Object val) { - return likeRight(true, null, column, val); - } - - default Children likeRight(boolean condition, MySFunction column, Object val) { - return likeRight(condition, null, column, val); - } - - default Children likeRight(String alias, MySFunction column, Object val) { - return likeRight(true, alias, column, val); - } - - Children likeRight(boolean condition, String alias, MySFunction column, Object val); - - /* ***************************************** likeRight end ********************************************* */ - + /** + * ignore + */ + default Children allEq(Map, V> params) { + return allEq(params, true); + } + + /** + * ignore + */ + default Children allEq(Map, V> params, boolean null2IsNull) { + return allEq(true, params, null2IsNull); + } + + /** + * map 所有非空属性等于 = + * + * @param condition 执行条件 + * @param params map 类型的参数, key 是字段名, value 是字段值 + * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段\ + * @return children + */ + Children allEq(boolean condition, Map, V> params, boolean null2IsNull); + + /** + * ignore + */ + default Children allEq(BiPredicate, V> filter, Map, V> params) { + return allEq(filter, params, true); + } + + /** + * ignore + */ + default Children allEq(BiPredicate, V> filter, Map, V> params, boolean null2IsNull) { + return allEq(true, filter, params, null2IsNull); + } + + /** + * 字段过滤接口,传入多参数时允许对参数进行过滤 + * + * @param condition 执行条件 + * @param filter 返回 true 来允许字段传入比对条件中 + * @param params map 类型的参数, key 是字段名, value 是字段值 + * @param null2IsNull 是否参数为 null 自动执行 isNull 方法, false 则忽略这个字段 + * @return children + */ + Children allEq(boolean condition, BiPredicate, V> filter, Map, V> params, boolean null2IsNull); + + /** + * ignore + */ + default Children eq(SFunction column, Object val) { + return eq(true, column, val); + } + + /** + * 等于 = + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children eq(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children ne(SFunction column, Object val) { + return ne(true, column, val); + } + + /** + * 不等于 <> + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ne(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children gt(SFunction column, Object val) { + return gt(true, column, val); + } + + /** + * 大于 > + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children gt(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children ge(SFunction column, Object val) { + return ge(true, column, val); + } + + /** + * 大于等于 >= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children ge(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children lt(SFunction column, Object val) { + return lt(true, column, val); + } + + /** + * 小于 < + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children lt(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children le(SFunction column, Object val) { + return le(true, column, val); + } + + /** + * 小于等于 <= + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children le(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children between(SFunction column, Object val1, Object val2) { + return between(true, column, val1, val2); + } + + /** + * BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children between(boolean condition, SFunction column, Object val1, Object val2); + + /** + * ignore + */ + default Children notBetween(SFunction column, Object val1, Object val2) { + return notBetween(true, column, val1, val2); + } + + /** + * NOT BETWEEN 值1 AND 值2 + * + * @param condition 执行条件 + * @param column 字段 + * @param val1 值1 + * @param val2 值2 + * @return children + */ + Children notBetween(boolean condition, SFunction column, Object val1, Object val2); + + /** + * ignore + */ + default Children like(SFunction column, Object val) { + return like(true, column, val); + } + + /** + * LIKE '%值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children like(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children notLike(SFunction column, Object val) { + return notLike(true, column, val); + } + + /** + * NOT LIKE '%值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children notLike(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children likeLeft(SFunction column, Object val) { + return likeLeft(true, column, val); + } + + /** + * LIKE '%值' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children likeLeft(boolean condition, SFunction column, Object val); + + /** + * ignore + */ + default Children likeRight(SFunction column, Object val) { + return likeRight(true, column, val); + } + + /** + * LIKE '值%' + * + * @param condition 执行条件 + * @param column 字段 + * @param val 值 + * @return children + */ + Children likeRight(boolean condition, SFunction column, Object val); } diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyFunc.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyFunc.java index eed187c..ed72cfe 100644 --- a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyFunc.java +++ b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyFunc.java @@ -1,6 +1,21 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.github.mybatisplus.wrapper.interfaces; -import com.github.mybatisplus.func.MySFunction; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import java.io.Serializable; import java.util.Arrays; @@ -11,203 +26,289 @@ import java.util.function.Consumer; import static java.util.stream.Collectors.toList; /** - * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func} + * 查询条件封装 + * + * @author hubin miemie HCL + * @since 2017-05-26 */ @SuppressWarnings("unchecked") public interface MyFunc extends Serializable { - default Children isNull(MySFunction column) { - return isNull(true, null, column); + /** + * ignore + */ + default Children isNull(SFunction column) { + return isNull(true, column); } - default Children isNull(boolean condition, MySFunction column) { - return isNull(condition, null, column); - } + /** + * 字段 IS NULL + *

例: isNull("name")

+ * + * @param condition 执行条件 + * @param column 字段 + * @return children + */ + Children isNull(boolean condition, SFunction column); - default Children isNull(String alias, MySFunction column) { - return isNull(true, alias, column); - } - - Children isNull(boolean condition, String alias, MySFunction column); - - - default Children isNotNull(MySFunction column) { + /** + * ignore + */ + default Children isNotNull(SFunction column) { return isNotNull(true, column); } - default Children isNotNull(boolean condition, MySFunction column) { - return isNotNull(condition, null, column); + /** + * 字段 IS NOT NULL + *

例: isNotNull("name")

+ * + * @param condition 执行条件 + * @param column 字段 + * @return children + */ + Children isNotNull(boolean condition, SFunction column); + + /** + * ignore + */ + default Children in(SFunction column, Collection coll) { + return in(true, column, coll); } - default Children isNotNull(String alias, MySFunction column) { - return isNotNull(true, alias, column); + /** + * 字段 IN (value.get(0), value.get(1), ...) + *

例: in("id", Arrays.asList(1, 2, 3, 4, 5))

+ * + *
  • 如果集合为 empty 则不会进行 sql 拼接
  • + * + * @param condition 执行条件 + * @param column 字段 + * @param coll 数据集合 + * @return children + */ + Children in(boolean condition, SFunction column, Collection coll); + + /** + * ignore + */ + default Children in(SFunction column, Object... values) { + return in(true, column, values); } - Children isNotNull(boolean condition, String alias, MySFunction column); - - default Children in(MySFunction column, Collection coll) { - return in(true, null, column, coll); - } - - default Children in(boolean condition, MySFunction column, Collection coll) { - return in(condition, null, column, coll); - } - - default Children in(String alias, MySFunction column, Collection coll) { - return in(true, alias, column, coll); - } - - Children in(boolean condition, String alias, MySFunction column, Collection coll); - - default Children in(MySFunction column, Object... values) { - return in(true, null, column, values); - } - - default Children in(boolean condition, MySFunction column, Object... values) { - return in(condition, null, column, values); - } - - default Children in(String alias, MySFunction column, Object... values) { - return in(true, alias, column, values); - } - - default Children in(boolean condition, String alias, MySFunction column, Object... values) { - return in(condition, alias, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{})) + /** + * 字段 IN (v0, v1, ...) + *

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

    + * + *
  • 如果动态数组为 empty 则不会进行 sql 拼接
  • + * + * @param condition 执行条件 + * @param column 字段 + * @param values 数据数组 + * @return children + */ + default Children in(boolean condition, SFunction column, Object... values) { + return in(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{})) .collect(toList())); } - default Children notIn(MySFunction column, Collection coll) { - return notIn(true, null, column, coll); + /** + * ignore + */ + default Children notIn(SFunction column, Collection coll) { + return notIn(true, column, coll); } - default Children notIn(boolean condition, MySFunction column, Collection coll) { - return notIn(condition, null, column, coll); + /** + * 字段 NOT IN (value.get(0), value.get(1), ...) + *

    例: notIn("id", Arrays.asList(1, 2, 3, 4, 5))

    + * + * @param condition 执行条件 + * @param column 字段 + * @param coll 数据集合 + * @return children + */ + Children notIn(boolean condition, SFunction column, Collection coll); + + /** + * ignore + */ + default Children notIn(SFunction column, Object... value) { + return notIn(true, column, value); } - default Children notIn(String alias, MySFunction column, Collection coll) { - return notIn(true, alias, column, coll); - } - - Children notIn(boolean condition, String alias, MySFunction column, Collection coll); - - default Children notIn(MySFunction column, Object... value) { - return notIn(true, null, column, value); - } - - default Children notIn(boolean condition, MySFunction column, Object... value) { - return notIn(condition, null, column, value); - } - - default Children notIn(String alias, MySFunction column, Object... value) { - return notIn(true, alias, column, value); - } - - default Children notIn(boolean condition, String alias, MySFunction column, Object... values) { - return notIn(condition, alias, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{})) + /** + * 字段 NOT IN (v0, v1, ...) + *

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

    + * + * @param condition 执行条件 + * @param column 字段 + * @param values 数据数组 + * @return children + */ + default Children notIn(boolean condition, SFunction column, Object... values) { + return notIn(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{})) .collect(toList())); } - default Children inSql(MySFunction column, String inValue) { - return inSql(true, null, column, inValue); + /** + * ignore + */ + default Children inSql(SFunction column, String inValue) { + return inSql(true, column, inValue); } - default Children inSql(boolean condition, MySFunction column, String inValue) { - return inSql(condition, null, column, inValue); + /** + * 字段 IN ( sql语句 ) + *

    !! sql 注入方式的 in 方法 !!

    + *

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

    + *

    例2: inSql("id", "select id from table where id < 3")

    + * + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 + * @return children + */ + Children inSql(boolean condition, SFunction column, String inValue); + + /** + * ignore + */ + default Children notInSql(SFunction column, String inValue) { + return notInSql(true, column, inValue); } - default Children inSql(String alias, MySFunction column, String inValue) { - return inSql(true, alias, column, inValue); + /** + * 字段 NOT IN ( sql语句 ) + *

    !! sql 注入方式的 not in 方法 !!

    + *

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

    + *

    例2: notInSql("id", "select id from table where id < 3")

    + * + * @param condition 执行条件 + * @param column 字段 + * @param inValue sql语句 ---> 1,2,3,4,5,6 或者 select id from table where id < 3 + * @return children + */ + Children notInSql(boolean condition, SFunction column, String inValue); + + /** + * ignore + */ + default Children groupBy(SFunction column) { + return groupBy(true, column); } - Children inSql(boolean condition, String alias, MySFunction column, String inValue); - - default Children notInSql(MySFunction column, String inValue) { - return notInSql(true, null, column, inValue); + /** + * ignore + */ + default Children groupBy(SFunction... columns) { + return groupBy(true, columns); } - default Children notInSql(boolean condition, MySFunction column, String inValue) { - return notInSql(condition, null, column, inValue); + /** + * 分组:GROUP BY 字段, ... + *

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

    + * + * @param condition 执行条件 + * @param columns 字段数组 + * @return children + */ + Children groupBy(boolean condition, SFunction... columns); + + /** + * ignore + */ + default Children orderByAsc(SFunction column) { + return orderByAsc(true, column); } - default Children notInSql(String alias, MySFunction column, String inValue) { - return notInSql(true, alias, column, inValue); + /** + * ignore + */ + default Children orderByAsc(SFunction... columns) { + return orderByAsc(true, columns); } - Children notInSql(boolean condition, String alias, MySFunction column, String inValue); - - default Children groupBy(MySFunction... columns) { - return groupBy(true, null, columns); + /** + * 排序:ORDER BY 字段, ... ASC + *

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

    + * + * @param condition 执行条件 + * @param columns 字段数组 + * @return children + */ + default Children orderByAsc(boolean condition, SFunction... columns) { + return orderBy(condition, true, columns); } - default Children groupBy(boolean condition, MySFunction... columns) { - return groupBy(condition, null, columns); + /** + * ignore + */ + default Children orderByDesc(SFunction column) { + return orderByDesc(true, column); } - default Children groupBy(String alias, MySFunction... columns) { - return groupBy(true, alias, columns); + /** + * ignore + */ + default Children orderByDesc(SFunction... columns) { + return orderByDesc(true, columns); } - Children groupBy(boolean condition, String alias, MySFunction... columns); - - default Children orderByAsc(MySFunction... columns) { - return orderByAsc(true, null, columns); + /** + * 排序:ORDER BY 字段, ... DESC + *

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

    + * + * @param condition 执行条件 + * @param columns 字段数组 + * @return children + */ + default Children orderByDesc(boolean condition, SFunction... columns) { + return orderBy(condition, false, columns); } - default Children orderByAsc(boolean condition, MySFunction... columns) { - return orderByAsc(condition, null, columns); - } - - default Children orderByAsc(String alias, MySFunction... columns) { - return orderByAsc(true, alias, columns); - } - - default Children orderByAsc(boolean condition, String alias, MySFunction... columns) { - return orderBy(condition, alias, true, columns); - } - - default Children orderByDesc(MySFunction... columns) { - return orderByDesc(true, null, columns); - } - - default Children orderByDesc(boolean condition, MySFunction... columns) { - return orderByDesc(condition, null, columns); - } - - default Children orderByDesc(String alias, MySFunction... columns) { - return orderByDesc(true, alias, columns); - } - - default Children orderByDesc(boolean condition, String alias, MySFunction... columns) { - return orderBy(condition, alias, false, columns); - } - - Children orderBy(boolean condition, String alias, boolean isAsc, MySFunction... columns); + /** + * 排序:ORDER BY 字段, ... + *

    例: orderBy(true, "id", "name")

    + * + * @param condition 执行条件 + * @param isAsc 是否是 ASC 排序 + * @param columns 字段数组 + * @return children + */ + Children orderBy(boolean condition, boolean isAsc, SFunction... columns); + /** + * ignore + */ default Children having(String sqlHaving, Object... params) { - return having(true, null, sqlHaving, params); + return having(true, sqlHaving, params); } - default Children having(boolean condition, String sqlHaving, Object... params) { - return having(condition, null, sqlHaving, params); - } - - default Children having(String alias, String sqlHaving, Object... params) { - return having(true, alias, sqlHaving, params); - } - - Children having(boolean condition, String alias, String sqlHaving, Object... params); + /** + * HAVING ( sql语句 ) + *

    例1: having("sum(age) > 10")

    + *

    例2: having("sum(age) > {0}", 10)

    + * + * @param condition 执行条件 + * @param sqlHaving sql 语句 + * @param params 参数数组 + * @return children + */ + Children having(boolean condition, String sqlHaving, Object... params); + /** + * ignore + */ default Children func(Consumer consumer) { - return func(true, null, consumer); + return func(true, consumer); } - default Children func(boolean condition, Consumer consumer) { - return func(condition, null, consumer); - } - - default Children func(String alias, Consumer consumer) { - return func(true, alias, consumer); - } - - Children func(boolean condition, String alias, Consumer consumer); + /** + * 消费函数 + * + * @param consumer 消费函数 + * @return children + * @since 3.3.1 + */ + Children func(boolean condition, Consumer consumer); } diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyJoin.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyJoin.java deleted file mode 100644 index 1e94fb3..0000000 --- a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyJoin.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.github.mybatisplus.wrapper.interfaces; - -import com.github.mybatisplus.func.MySFunction; -import com.github.mybatisplus.toolkit.Constant; -import com.github.mybatisplus.wrapper.MyJoinLambdaQueryWrapper; - -import java.util.function.Function; - -/** - * @author yulichang - */ -public interface MyJoin { - - - default Children leftJoin(boolean condition, - String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return join(condition, alias, Constant.LEFT_JOIN, leftCondition, rightCondition, rightWrapper); - } - - - default Children leftJoin(MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return leftJoin(true, null, leftCondition, rightCondition, rightWrapper); - } - - default Children leftJoin(String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return leftJoin(true, alias, leftCondition, rightCondition, rightWrapper); - } - - default Children leftJoin(boolean condition, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return leftJoin(condition, null, leftCondition, rightCondition, rightWrapper); - } - - - default Children rightJoin(boolean condition, - String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return join(condition, alias, Constant.RIGHT_JOIN, leftCondition, rightCondition, rightWrapper); - } - - - default Children rightJoin(MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return rightJoin(true, null, leftCondition, rightCondition, rightWrapper); - } - - default Children rightJoin(String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return rightJoin(true, alias, leftCondition, rightCondition, rightWrapper); - } - - default Children rightJoin(boolean condition, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return rightJoin(condition, null, leftCondition, rightCondition, rightWrapper); - } - - - default Children innerJoin(boolean condition, - String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return join(condition, alias, Constant.INNER_JOIN, leftCondition, rightCondition, rightWrapper); - } - - - default Children innerJoin(MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return innerJoin(true, null, leftCondition, rightCondition, rightWrapper); - } - - default Children innerJoin(String alias, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return innerJoin(true, alias, leftCondition, rightCondition, rightWrapper); - } - - default Children innerJoin(boolean condition, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper) { - return innerJoin(condition, null, leftCondition, rightCondition, rightWrapper); - } - - - Children join(boolean condition, - String alias, - String keyWord, - MySFunction leftCondition, - MySFunction rightCondition, - Function, MyJoinLambdaQueryWrapper> rightWrapper); -} diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyLambdaJoin.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyLambdaJoin.java new file mode 100644 index 0000000..fb5140b --- /dev/null +++ b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyLambdaJoin.java @@ -0,0 +1,35 @@ +package com.github.mybatisplus.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.mybatisplus.toolkit.Constant; + +public interface MyLambdaJoin { + + default Children leftJoin(Class clazz, SFunction left, SFunction right) { + return leftJoin(true, clazz, left, right); + } + + default Children leftJoin(boolean condition, Class clazz, SFunction left, SFunction right) { + return join(Constant.LEFT_JOIN, condition, clazz, left, right); + } + + default Children rightJoin(Class clazz, SFunction left, SFunction right) { + return rightJoin(true, clazz, left, right); + } + + default Children rightJoin(boolean condition, Class clazz, SFunction left, SFunction right) { + return join(Constant.RIGHT_JOIN, condition, clazz, left, right); + } + + default Children innerJoin(Class clazz, SFunction left, SFunction right) { + return innerJoin(true, clazz, left, right); + } + + default Children innerJoin(boolean condition, Class clazz, SFunction left, SFunction right) { + return join(Constant.INNER_JOIN, condition, clazz, left, right); + } + + Children join(String keyWord, boolean condition, Class clazz, SFunction left, SFunction right); + + +} diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyMPJoin.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyMPJoin.java deleted file mode 100644 index 043bb7c..0000000 --- a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyMPJoin.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.github.mybatisplus.wrapper.interfaces; - -import java.io.Serializable; - -/** - * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Join} - */ -public interface MyMPJoin extends Serializable { - - /** - * ignore - */ - default Children or() { - return or(true); - } - - /** - * 拼接 OR - * - * @param condition 执行条件 - * @return children - */ - Children or(boolean condition); - - /** - * ignore - */ - default Children apply(String applySql, Object... value) { - return apply(true, applySql, value); - } - - /** - * 拼接 sql - *

    !! 会有 sql 注入风险 !!

    - *

    例1: apply("id = 1")

    - *

    例2: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

    - *

    例3: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", LocalDate.now())

    - * - * @param condition 执行条件 - * @return children - */ - Children apply(boolean condition, String applySql, Object... value); - - /** - * ignore - */ - default Children last(String lastSql) { - return last(true, lastSql); - } - - /** - * 无视优化规则直接拼接到 sql 的最后(有sql注入的风险,请谨慎使用) - *

    例: last("limit 1")

    - *

    注意只能调用一次,多次调用以最后一次为准

    - * - * @param condition 执行条件 - * @param lastSql sql语句 - * @return children - */ - Children last(boolean condition, String lastSql); - - /** - * ignore - */ - default Children comment(String comment) { - return comment(true, comment); - } - - /** - * sql 注释(会拼接在 sql 的最后面) - * - * @param condition 执行条件 - * @param comment sql注释 - * @return children - */ - Children comment(boolean condition, String comment); - - /** - * ignore - */ - default Children first(String firstSql) { - return first(true, firstSql); - } - - /** - * sql 起始句(会拼接在SQL语句的起始处) - * - * @param condition 执行条件 - * @param firstSql 起始语句 - * @return children - * @since 3.3.1 - */ - Children first(boolean condition, String firstSql); - - /** - * ignore - */ - default Children exists(String existsSql) { - return exists(true, existsSql); - } - - /** - * 拼接 EXISTS ( sql语句 ) - *

    !! sql 注入方法 !!

    - *

    例: exists("select id from table where age = 1")

    - * - * @param condition 执行条件 - * @param existsSql sql语句 - * @return children - */ - Children exists(boolean condition, String existsSql); - - /** - * ignore - */ - default Children notExists(String existsSql) { - return notExists(true, existsSql); - } - - /** - * 拼接 NOT EXISTS ( sql语句 ) - *

    !! sql 注入方法 !!

    - *

    例: notExists("select id from table where age = 1")

    - * - * @param condition 执行条件 - * @param existsSql sql语句 - * @return children - */ - Children notExists(boolean condition, String existsSql); -} diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyNested.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyNested.java deleted file mode 100644 index 7ce333a..0000000 --- a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MyNested.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.github.mybatisplus.wrapper.interfaces; - -import java.io.Serializable; -import java.util.function.Consumer; - -/** - * copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Nested} - */ -public interface MyNested extends Serializable { - - /** - * ignore - */ - default Children and(Consumer consumer) { - return and(true, consumer); - } - - /** - * AND 嵌套 - *

    - * 例: and(i -> i.eq("name", "李白").ne("status", "活着")) - *

    - * - * @param condition 执行条件 - * @param consumer 消费函数 - * @return children - */ - Children and(boolean condition, Consumer consumer); - - - /** - * ignore - */ - default Children or(Consumer consumer) { - return or(true, consumer); - } - - /** - * OR 嵌套 - *

    - * 例: or(i -> i.eq("name", "李白").ne("status", "活着")) - *

    - * - * @param condition 执行条件 - * @param consumer 消费函数 - * @return children - */ - Children or(boolean condition, Consumer consumer); - - /** - * ignore - */ - default Children nested(Consumer consumer) { - return nested(true, consumer); - } - - /** - * 正常嵌套 不带 AND 或者 OR - *

    - * 例: nested(i -> i.eq("name", "李白").ne("status", "活着")) - *

    - * - * @param condition 执行条件 - * @param consumer 消费函数 - * @return children - */ - Children nested(boolean condition, Consumer consumer); - - /** - * ignore - */ - default Children not(Consumer consumer) { - return not(true, consumer); - } - - /** - * not嵌套 - *

    - * 例: not(i -> i.eq("name", "李白").ne("status", "活着")) - *

    - * - * @param condition 执行条件 - * @param consumer 消费函数 - * @return children - */ - Children not(boolean condition, Consumer consumer); -} diff --git a/src/main/java/com/github/mybatisplus/wrapper/interfaces/MySFunctionQuery.java b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MySFunctionQuery.java new file mode 100644 index 0000000..42d27f1 --- /dev/null +++ b/src/main/java/com/github/mybatisplus/wrapper/interfaces/MySFunctionQuery.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2011-2021, baomidou (jobob@qq.com). + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.mybatisplus.wrapper.interfaces; + +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.io.Serializable; +import java.util.function.Predicate; + +/** + * copy {@link com.baomidou.mybatisplus.core.conditions.query.Query} + */ +public interface MySFunctionQuery extends Serializable { + + /** + * 设置查询字段 + * + * @param columns 字段数组 + * @return children + */ + @SuppressWarnings("unchecked") + Children select(SFunction... columns); + + /** + * ignore + *

    注意只有内部有 entity 才能使用该方法

    + */ + default Children select(Predicate predicate) { + return select(null, predicate); + } + + /** + * 过滤查询的字段信息(主键除外!) + *

    例1: 只要 java 字段名以 "test" 开头的 -> select(i -> i.getProperty().startsWith("test"))

    + *

    例2: 只要 java 字段属性是 CharSequence 类型的 -> select(TableFieldInfo::isCharSequence)

    + *

    例3: 只要 java 字段没有填充策略的 -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)

    + *

    例4: 要全部字段 -> select(i -> true)

    + *

    例5: 只要主键字段 -> select(i -> false)

    + * + * @param predicate 过滤方式 + * @return children + */ + Children select(Class entityClass, Predicate predicate); + + /** + * 查询条件 SQL 片段 + */ + String getSqlSelect(); +}