From b6419c55bfb26ae1653a5e8f8dc1b43c3fea8410 Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Fri, 5 Feb 2021 13:54:53 +0800 Subject: [PATCH] update --- README.md | 204 +++++++++--------- pom.xml | 14 +- .../yulichang/query/MyLambdaQueryWrapper.java | 76 ++++--- .../yulichang/query/MyQueryWrapper.java | 48 +++-- .../wrapper/MyJoinLambdaQueryWrapper.java | 54 +++-- 5 files changed, 233 insertions(+), 163 deletions(-) diff --git a/README.md b/README.md index 8ec7653..9acb28e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # mybatis-plus-join -支持连表查询的[mybatis-plus](https://gitee.com/baomidou/mybatis-plus) +支持连表查询的[mybatis-plus](https://gitee.com/baomidou/mybatis-plus) +只做增强,不做修改,可以使用原生mybatis-plus全部的功能 ## 使用方法 @@ -8,7 +9,8 @@ ### 方法一 -1. 在项目中添加依赖,依赖已经包含了mybatis-plus3.4.2,依赖后无需再次引入mybatis-plus +1. 在项目中添加依赖,依赖已经包含了mybatis-plus-boot-starter<3.4.2>
+ 依赖后无需再次引入mybatis-plus ```xml @@ -20,26 +22,24 @@ 2. 配置插件,添加MyJoinInterceptor -```java - -@Configuration -public class MybatisPlusConfig { - - /** - * 启用连表拦截器 - */ - @Bean - public MybatisPlusInterceptor paginationInterceptor() { - MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); - //分页插件 - mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); - //连表插件 - mybatisPlusInterceptor.addInnerInterceptor(new MyJoinInterceptor()); - //可以添加多租户或其他插件 - return mybatisPlusInterceptor; + ```java + @Configuration + public class MybatisPlusConfig { + /** + * 启用连表拦截器 + */ + @Bean + public MybatisPlusInterceptor paginationInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + //分页插件 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + //连表插件 + interceptor.addInnerInterceptor(new MyJoinInterceptor()); + //可以添加多租户或其他插件 + return mybatisPlusInterceptor; + } } -} -``` + ``` ### 使用 @@ -65,6 +65,8 @@ public class MybatisPlusConfig { |---|---|---|---| |select(String)|支持|**支持**|不支持| |select(lambda)|不支持|仅支持主表lambda|所有表lambda| +|join(String)|支持|支持|不支持| +|join(lambda)|不支持|不支持|支持| |条件String|支持|不支持|不支持| |条件lambda|不支持|仅支持主表lambda|所有表lambda| @@ -72,8 +74,8 @@ MyQueryWrapper相当于mp的QueryWrapper MyLambdaQueryWrapper相当于mp的LambdaQueryWrapper 两者可以无缝切换 -MyQueryWrapper.lambda() -> MyLambdaQueryWrapper -MyLambdaQueryWrapper.stringQuery() -> MyQueryWrapper +MyQueryWrapper.lambda() ===> MyLambdaQueryWrapper +MyLambdaQueryWrapper.stringQuery() ===> MyQueryWrapper ## MyQueryWrapper和MyLambdaQueryWrapper @@ -102,22 +104,24 @@ class test { 对应sql -```sql -SELECT t.id, - t.name, - t.sex, - t.head_img, - addr.tel, - addr.address, - a.province -FROM user t - LEFT JOIN user_address addr on t.id = addr.user_id - RIGHT JOIN area a on addr.area_id = a.id +``` +SELECT + t.id, + t.name, + t.sex, + t.head_img, + addr.tel, + addr.address, + a.province +FROM + user t + LEFT JOIN user_address addr on t.id = addr.user_id + RIGHT JOIN area a on addr.area_id = a.id WHERE ( - t.id > ? - AND t.sex = ? - AND addr.tel LIKE ? - AND a.province <= ?) + t.id > ? + AND t.sex = ? + AND addr.tel LIKE ? + AND a.province <= ?) ``` 说明: @@ -152,17 +156,20 @@ class test { 对应sql -```sql -SELECT t.id, - t.name, - t.sex, - t.head_img, - addr.tel, - addr.address, - a.province -FROM user t - LEFT JOIN user_address addr on t.id = addr.user_id - RIGHT JOIN area a on addr.area_id = a.id LIMIT ?,? +``` +SELECT + t.id, + t.name, + t.sex, + t.head_img, + addr.tel, + addr.address, + a.province +FROM + user t + LEFT JOIN user_address addr on t.id = addr.user_id + RIGHT JOIN area a on addr.area_id = a.id +LIMIT ?,? ``` ### 还可以这么操作,但不建议 @@ -180,7 +187,7 @@ class test { //行列转换 .select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex") //求和函数 - .select("sum(a.province) as province") + .select("sum(a.province) AS province") //自定义数据集 .leftJoin("(select * from user_address) addr on t.id = addr.user_id") .rightJoin("area a on addr.area_id = a.id") @@ -195,31 +202,32 @@ class test { 对应sql -```mysql -SELECT t.id, - t.name, - t.sex, - t.head_img, - addr.tel, - addr.address, - CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, - sum(a.province) as province -FROM user t - LEFT JOIN (select * from user_address) addr on t.id = addr.user_id - RIGHT JOIN area a on addr.area_id = a.id -WHERE t.id = ? - AND addr.tel LIKE ? - AND a.province <= ?) +``` +SELECT + t.id, + t.name, + t.sex, + t.head_img, + addr.tel, + addr.address, + CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, + sum(a.province) AS province +FROM + user t + LEFT JOIN (select * from user_address) addr on t.id = addr.user_id + RIGHT JOIN area a on addr.area_id = a.id +WHERE ( + t.id = ? + AND addr.tel LIKE ? + AND a.province <= ?) ORDER BY - addr.id -DESC + addr.id DESC ``` ## MyJoinLambdaQueryWrapper用法 MyJoinLambdaQueryWrapper与上面连个Wrapper不同,是一套新的支持多表的wrapper -MyQueryWrapper是基于QueryWrapper扩展的 -MyLambdaQueryWrapper是基于LambdaQueryWrapper扩展的 +MyQueryWrapper是基于QueryWrapper扩展的 MyLambdaQueryWrapper是基于LambdaQueryWrapper扩展的 而LambdaQueryWrapper由于泛型约束,不支持扩展成多表的lambdaWrapper #### MyJoinLambdaQueryWrapper示例 @@ -249,22 +257,24 @@ class test { 对应sql -```sql -SELECT user.id, - user.name, - user.sex, - user.head_img, - user_address.tel, - user_address.address AS userAddress, - area.province, - area.city -FROM user - LEFT JOIN user_address ON user_address.user_id = user.id - LEFT JOIN area ON area.id = user_address.area_id +``` +SELECT + user.id, + user.name, + user.sex, + user.head_img, + user_address.tel, + user_address.address AS userAddress, + area.province, + area.city +FROM + user + LEFT JOIN user_address ON user_address.user_id = user.id + LEFT JOIN area ON area.id = user_address.area_id WHERE ( - user.id = ? - AND user_address.tel LIKE ? - AND user.id > ?) + user.id = ? + AND user_address.tel LIKE ? + AND user.id > ?) ``` 说明: @@ -302,18 +312,20 @@ class test { 对应sql -```mysql -SELECT user.id, - user.name, - user.sex, - user.head_img, - user_address.tel, - user_address.address AS userAddress, - area.province, - area.city -FROM user - LEFT JOIN user_address ON user_address.user_id = user.id - LEFT JOIN area ON area.id = user_address.area_id +``` +SELECT + t.id, + t.name, + t.sex, + t.head_img, + t1.tel, + t1.address AS userAddress, + t2.province, + t2.city +FROM + user t + LEFT JOIN user_address t1 ON t1.user_id = t.id + LEFT JOIN area t2 ON t2.id = t1.area_id LIMIT ?,? ``` diff --git a/pom.xml b/pom.xml index 8a0e1e3..345d024 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 1.8 1.8 - + com.baomidou @@ -41,16 +41,8 @@ 3.4.2 compile - - - cglib - cglib - 3.3.0 - compile - - @@ -103,7 +95,7 @@ ossrh https://oss.sonatype.org/ - + 30 @@ -174,7 +166,7 @@ ossrh https://oss.sonatype.org/ - + 30 diff --git a/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java index 0c270ae..0c8fcf2 100644 --- a/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MyLambdaQueryWrapper.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; *

* sqlSelect 由覆盖改为追加 */ -@SuppressWarnings("serial") +@SuppressWarnings("all") public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper> implements Query, T, SFunction>, MyJoin> { @@ -96,7 +96,12 @@ public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper select(SFunction... columns) { - if (ArrayUtils.isNotEmpty(columns)) { + return select(true, columns); + } + + @SafeVarargs + public final MyLambdaQueryWrapper select(boolean condition, SFunction... columns) { + if (condition && ArrayUtils.isNotEmpty(columns)) { String s = columnsToString(false, columns); if (StringUtils.isBlank(sqlSelect.getStringValue())) { this.sqlSelect.setStringValue(s); @@ -109,7 +114,12 @@ public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper select(String... columns) { - if (ArrayUtils.isNotEmpty(columns)) { + return select(true, columns); + } + + @SafeVarargs + public final MyLambdaQueryWrapper select(boolean condition, String... columns) { + if (condition && ArrayUtils.isNotEmpty(columns)) { String s = String.join(StringPool.COMMA, columns); if (StringUtils.isBlank(sqlSelect.getStringValue())) { this.sqlSelect.setStringValue(s); @@ -133,35 +143,47 @@ public class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper select(Class entityClass, Predicate predicate) { - if (entityClass == null) { - entityClass = getEntityClass(); - } else { - setEntityClass(entityClass); - } - Assert.notNull(entityClass, "entityClass can not be null"); - String s = TableInfoHelper.getTableInfo(entityClass).chooseSelect(predicate); - List list = Arrays.stream(s.split(StringPool.COMMA)).map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i).collect(Collectors.toList()); - String join = String.join(StringPool.COMMA, list); - if (StringUtils.isBlank(sqlSelect.getStringValue())) { - this.sqlSelect.setStringValue(join); - } else { - this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + return select(true, entityClass, predicate); + } + + public MyLambdaQueryWrapper select(boolean condition, Class entityClass, Predicate predicate) { + if (condition) { + if (entityClass == null) { + entityClass = getEntityClass(); + } else { + setEntityClass(entityClass); + } + Assert.notNull(entityClass, "entityClass can not be null"); + String s = TableInfoHelper.getTableInfo(entityClass).chooseSelect(predicate); + List list = Arrays.stream(s.split(StringPool.COMMA)).map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i).collect(Collectors.toList()); + String join = String.join(StringPool.COMMA, list); + if (StringUtils.isBlank(sqlSelect.getStringValue())) { + this.sqlSelect.setStringValue(join); + } else { + this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + } } return typedThis; } public final MyLambdaQueryWrapper selectAll(Class clazz) { - TableInfo info = TableInfoHelper.getTableInfo(clazz); - List list = new ArrayList<>(); - if (info.havePK()) { - list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); - } - list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); - String join = String.join(StringPool.COMMA, list); - if (StringUtils.isBlank(sqlSelect.getStringValue())) { - this.sqlSelect.setStringValue(join); - } else { - this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + return selectAll(true, clazz); + } + + public final MyLambdaQueryWrapper selectAll(boolean condition, Class clazz) { + if (condition) { + TableInfo info = TableInfoHelper.getTableInfo(clazz); + List list = new ArrayList<>(); + if (info.havePK()) { + list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + } + list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); + String join = String.join(StringPool.COMMA, list); + if (StringUtils.isBlank(sqlSelect.getStringValue())) { + this.sqlSelect.setStringValue(join); + } else { + this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + } } return typedThis; } diff --git a/src/main/java/com/github/yulichang/query/MyQueryWrapper.java b/src/main/java/com/github/yulichang/query/MyQueryWrapper.java index 7b357bc..d9953ab 100644 --- a/src/main/java/com/github/yulichang/query/MyQueryWrapper.java +++ b/src/main/java/com/github/yulichang/query/MyQueryWrapper.java @@ -80,32 +80,50 @@ public class MyQueryWrapper extends AbstractWrapper select(String... columns) { - if (ArrayUtils.isNotEmpty(columns)) { - this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns)); + return select(true, columns); + } + + public MyQueryWrapper select(boolean condition, String... columns) { + if (condition) { + if (ArrayUtils.isNotEmpty(columns)) { + this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns)); + } } return typedThis; } @Override public MyQueryWrapper select(Class entityClass, Predicate predicate) { - super.setEntityClass(entityClass); - this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate)); + return select(true, entityClass, predicate); + } + + public MyQueryWrapper select(boolean condition, Class entityClass, Predicate predicate) { + if (condition) { + super.setEntityClass(entityClass); + this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate)); + } return typedThis; } public final MyQueryWrapper selectAll(Class clazz) { - TableInfo info = TableInfoHelper.getTableInfo(clazz); - List list = new ArrayList<>(); - if (info.havePK()) { - list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); - } - list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); - String join = String.join(StringPool.COMMA, list); - if (StringUtils.isBlank(sqlSelect.getStringValue())) { - this.sqlSelect.setStringValue(join); - } else { - this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + return selectAll(true, clazz); + } + + public final MyQueryWrapper selectAll(boolean condition, Class clazz) { + if (condition) { + TableInfo info = TableInfoHelper.getTableInfo(clazz); + List list = new ArrayList<>(); + if (info.havePK()) { + list.add(Constant.TABLE_ALIAS + StringPool.DOT + info.getKeyColumn()); + } + list.addAll(info.getFieldList().stream().map(i -> Constant.TABLE_ALIAS + StringPool.DOT + i.getColumn()).collect(Collectors.toList())); + String join = String.join(StringPool.COMMA, list); + if (StringUtils.isBlank(sqlSelect.getStringValue())) { + this.sqlSelect.setStringValue(join); + } else { + this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); + } } return typedThis; } diff --git a/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java index 6325410..40517c3 100644 --- a/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/wrapper/MyJoinLambdaQueryWrapper.java @@ -15,7 +15,9 @@ import com.github.yulichang.toolkit.MyLambdaUtils; import com.github.yulichang.wrapper.interfaces.MyLambdaJoin; import com.github.yulichang.wrapper.interfaces.MySFunctionQuery; -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.Predicate; import java.util.stream.Collectors; @@ -23,7 +25,7 @@ import java.util.stream.Collectors; /** * copy {@link com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper} */ -@SuppressWarnings("serial") +@SuppressWarnings("all") public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper> implements MySFunctionQuery>, MyLambdaJoin> { @@ -99,7 +101,12 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper MyJoinLambdaQueryWrapper select(SFunction... columns) { - if (ArrayUtils.isNotEmpty(columns)) { + return select(true, columns); + } + + @SafeVarargs + public final MyJoinLambdaQueryWrapper select(boolean condition, SFunction... columns) { + if (condition && ArrayUtils.isNotEmpty(columns)) { for (SFunction s : columns) { selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(s), MyLambdaUtils.getColumn(s), null)); } @@ -109,30 +116,49 @@ public class MyJoinLambdaQueryWrapper extends MyAbstractLambdaWrapper MyJoinLambdaQueryWrapper 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, i.getColumn(), null))); + return select(true, entityClass, predicate); + } + + public MyJoinLambdaQueryWrapper select(boolean condition, Class entityClass, Predicate predicate) { + if (condition) { + 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, i.getColumn(), null))); + } return typedThis; } public final MyJoinLambdaQueryWrapper selectAs(SFunction columns, SFunction alias) { - selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); + return selectAs(true, columns, alias); + } + + public final MyJoinLambdaQueryWrapper selectAs(boolean condition, SFunction columns, SFunction alias) { + if (condition) { + selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); + } return typedThis; } public final MyJoinLambdaQueryWrapper selectAll(Class clazz) { - TableInfo info = TableInfoHelper.getTableInfo(clazz); - Assert.notNull(info, "table can not be find -> %s", clazz); - if (info.havePK()) { - selectColumns.add(new SelectColumn(clazz, info.getKeyColumn(), null)); + return selectAll(clazz); + } + + public final MyJoinLambdaQueryWrapper selectAll(boolean condition, Class clazz) { + if (condition) { + TableInfo info = TableInfoHelper.getTableInfo(clazz); + Assert.notNull(info, "table can not be find -> %s", clazz); + if (info.havePK()) { + selectColumns.add(new SelectColumn(clazz, info.getKeyColumn(), null)); + } + info.getFieldList().forEach(c -> + selectColumns.add(new SelectColumn(clazz, c.getColumn(), null))); } - info.getFieldList().forEach(c -> - selectColumns.add(new SelectColumn(clazz, c.getColumn(), null))); return typedThis; } + @Override public String getSqlSelect() { if (StringUtils.isBlank(sqlSelect.getStringValue())) {