This commit is contained in:
admin 2021-02-05 13:54:53 +08:00
parent 6792627b8b
commit b6419c55bf
5 changed files with 233 additions and 163 deletions

102
README.md
View File

@ -1,6 +1,7 @@
# mybatis-plus-join # 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><br>
依赖后无需再次引入mybatis-plus
```xml ```xml
<dependency> <dependency>
@ -20,26 +22,24 @@
2. 配置插件,添加MyJoinInterceptor 2. 配置插件,添加MyJoinInterceptor
```java ```java
@Configuration
@Configuration public class MybatisPlusConfig {
public class MybatisPlusConfig {
/** /**
* 启用连表拦截器 * 启用连表拦截器
*/ */
@Bean @Bean
public MybatisPlusInterceptor paginationInterceptor() { public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页插件 //分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
//连表插件 //连表插件
mybatisPlusInterceptor.addInnerInterceptor(new MyJoinInterceptor()); interceptor.addInnerInterceptor(new MyJoinInterceptor());
//可以添加多租户或其他插件 //可以添加多租户或其他插件
return mybatisPlusInterceptor; return mybatisPlusInterceptor;
} }
} }
``` ```
### 使用 ### 使用
@ -65,6 +65,8 @@ public class MybatisPlusConfig {
|---|---|---|---| |---|---|---|---|
|select(String)|支持|<font color=red>**支持**|不支持| |select(String)|支持|<font color=red>**支持**|不支持|
|select(lambda)|不支持|仅支持主表lambda|所有表lambda| |select(lambda)|不支持|仅支持主表lambda|所有表lambda|
|join(String)|支持|支持|不支持|
|join(lambda)|不支持|不支持|支持|
|条件String|支持|不支持|不支持| |条件String|支持|不支持|不支持|
|条件lambda|不支持|仅支持主表lambda|所有表lambda| |条件lambda|不支持|仅支持主表lambda|所有表lambda|
@ -72,8 +74,8 @@ MyQueryWrapper相当于mp的QueryWrapper
MyLambdaQueryWrapper相当于mp的LambdaQueryWrapper MyLambdaQueryWrapper相当于mp的LambdaQueryWrapper
两者可以无缝切换 两者可以无缝切换
MyQueryWrapper.lambda() -> MyLambdaQueryWrapper MyQueryWrapper.lambda() ===> MyLambdaQueryWrapper
MyLambdaQueryWrapper.stringQuery() -> MyQueryWrapper MyLambdaQueryWrapper.stringQuery() ===> MyQueryWrapper
## MyQueryWrapper和MyLambdaQueryWrapper ## MyQueryWrapper和MyLambdaQueryWrapper
@ -102,15 +104,17 @@ class test {
对应sql 对应sql
```sql ```
SELECT t.id, SELECT
t.id,
t.name, t.name,
t.sex, t.sex,
t.head_img, t.head_img,
addr.tel, addr.tel,
addr.address, addr.address,
a.province a.province
FROM user t FROM
user t
LEFT JOIN user_address addr on t.id = addr.user_id LEFT JOIN user_address addr on t.id = addr.user_id
RIGHT JOIN area a on addr.area_id = a.id RIGHT JOIN area a on addr.area_id = a.id
WHERE ( WHERE (
@ -152,17 +156,20 @@ class test {
对应sql 对应sql
```sql ```
SELECT t.id, SELECT
t.id,
t.name, t.name,
t.sex, t.sex,
t.head_img, t.head_img,
addr.tel, addr.tel,
addr.address, addr.address,
a.province a.province
FROM user t FROM
user t
LEFT JOIN user_address addr on t.id = addr.user_id LEFT JOIN user_address addr on t.id = addr.user_id
RIGHT JOIN area a on addr.area_id = a.id LIMIT ?,? 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("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") .leftJoin("(select * from user_address) addr on t.id = addr.user_id")
.rightJoin("area a on addr.area_id = a.id") .rightJoin("area a on addr.area_id = a.id")
@ -195,31 +202,32 @@ class test {
对应sql 对应sql
```mysql ```
SELECT t.id, SELECT
t.id,
t.name, t.name,
t.sex, t.sex,
t.head_img, t.head_img,
addr.tel, addr.tel,
addr.address, addr.address,
CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex,
sum(a.province) as province sum(a.province) AS province
FROM user t FROM
user t
LEFT JOIN (select * from user_address) addr on t.id = addr.user_id LEFT JOIN (select * from user_address) addr on t.id = addr.user_id
RIGHT JOIN area a on addr.area_id = a.id RIGHT JOIN area a on addr.area_id = a.id
WHERE t.id = ? WHERE (
t.id = ?
AND addr.tel LIKE ? AND addr.tel LIKE ?
AND a.province <= ?) AND a.province <= ?)
ORDER BY ORDER BY
addr.id addr.id DESC
DESC
``` ```
## MyJoinLambdaQueryWrapper用法 ## MyJoinLambdaQueryWrapper用法
MyJoinLambdaQueryWrapper与上面连个Wrapper不同,是一套新的支持多表的wrapper MyJoinLambdaQueryWrapper与上面连个Wrapper不同,是一套新的支持多表的wrapper
MyQueryWrapper是基于QueryWrapper扩展的 MyQueryWrapper是基于QueryWrapper扩展的 MyLambdaQueryWrapper是基于LambdaQueryWrapper扩展的
MyLambdaQueryWrapper是基于LambdaQueryWrapper扩展的
而LambdaQueryWrapper由于泛型约束,不支持扩展成多表的lambdaWrapper 而LambdaQueryWrapper由于泛型约束,不支持扩展成多表的lambdaWrapper
#### MyJoinLambdaQueryWrapper示例 #### MyJoinLambdaQueryWrapper示例
@ -249,8 +257,9 @@ class test {
对应sql 对应sql
```sql ```
SELECT user.id, SELECT
user.id,
user.name, user.name,
user.sex, user.sex,
user.head_img, user.head_img,
@ -258,7 +267,8 @@ SELECT user.id,
user_address.address AS userAddress, user_address.address AS userAddress,
area.province, area.province,
area.city area.city
FROM user FROM
user
LEFT JOIN user_address ON user_address.user_id = user.id LEFT JOIN user_address ON user_address.user_id = user.id
LEFT JOIN area ON area.id = user_address.area_id LEFT JOIN area ON area.id = user_address.area_id
WHERE ( WHERE (
@ -302,18 +312,20 @@ class test {
对应sql 对应sql
```mysql ```
SELECT user.id, SELECT
user.name, t.id,
user.sex, t.name,
user.head_img, t.sex,
user_address.tel, t.head_img,
user_address.address AS userAddress, t1.tel,
area.province, t1.address AS userAddress,
area.city t2.province,
FROM user t2.city
LEFT JOIN user_address ON user_address.user_id = user.id FROM
LEFT JOIN area ON area.id = user_address.area_id user t
LEFT JOIN user_address t1 ON t1.user_id = t.id
LEFT JOIN area t2 ON t2.id = t1.area_id
LIMIT ?,? LIMIT ?,?
``` ```

14
pom.xml
View File

@ -33,7 +33,7 @@
<jdkVersion>1.8</jdkVersion> <jdkVersion>1.8</jdkVersion>
<jdkVersion.test>1.8</jdkVersion.test> <jdkVersion.test>1.8</jdkVersion.test>
</properties> </properties>
<!-- only dependency mybatis-plus-boot-starter -->
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
@ -41,16 +41,8 @@
<version>3.4.2</version> <version>3.4.2</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
@ -103,7 +95,7 @@
<configuration> <configuration>
<serverId>ossrh</serverId> <serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl> <nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- <autoReleaseAfterClose>true</autoReleaseAfterClose>--> <!-- <autoReleaseAfterClose>true</autoReleaseAfterClose>-->
<stagingProgressTimeoutMinutes>30</stagingProgressTimeoutMinutes> <stagingProgressTimeoutMinutes>30</stagingProgressTimeoutMinutes>
</configuration> </configuration>
</plugin> </plugin>
@ -174,7 +166,7 @@
<configuration> <configuration>
<serverId>ossrh</serverId> <serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl> <nexusUrl>https://oss.sonatype.org/</nexusUrl>
<!-- <autoReleaseAfterClose>true</autoReleaseAfterClose>--> <!-- <autoReleaseAfterClose>true</autoReleaseAfterClose>-->
<stagingProgressTimeoutMinutes>30</stagingProgressTimeoutMinutes> <stagingProgressTimeoutMinutes>30</stagingProgressTimeoutMinutes>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -27,7 +27,7 @@ import java.util.stream.Collectors;
* <p> * <p>
* sqlSelect 由覆盖改为追加 * sqlSelect 由覆盖改为追加
*/ */
@SuppressWarnings("serial") @SuppressWarnings("all")
public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambdaQueryWrapper<T>> public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambdaQueryWrapper<T>>
implements Query<MyLambdaQueryWrapper<T>, T, SFunction<T, ?>>, MyJoin<MyLambdaQueryWrapper<T>> { implements Query<MyLambdaQueryWrapper<T>, T, SFunction<T, ?>>, MyJoin<MyLambdaQueryWrapper<T>> {
@ -96,7 +96,12 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
@SafeVarargs @SafeVarargs
@Override @Override
public final MyLambdaQueryWrapper<T> select(SFunction<T, ?>... columns) { public final MyLambdaQueryWrapper<T> select(SFunction<T, ?>... columns) {
if (ArrayUtils.isNotEmpty(columns)) { return select(true, columns);
}
@SafeVarargs
public final MyLambdaQueryWrapper<T> select(boolean condition, SFunction<T, ?>... columns) {
if (condition && ArrayUtils.isNotEmpty(columns)) {
String s = columnsToString(false, columns); String s = columnsToString(false, columns);
if (StringUtils.isBlank(sqlSelect.getStringValue())) { if (StringUtils.isBlank(sqlSelect.getStringValue())) {
this.sqlSelect.setStringValue(s); this.sqlSelect.setStringValue(s);
@ -109,7 +114,12 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
@SafeVarargs @SafeVarargs
public final MyLambdaQueryWrapper<T> select(String... columns) { public final MyLambdaQueryWrapper<T> select(String... columns) {
if (ArrayUtils.isNotEmpty(columns)) { return select(true, columns);
}
@SafeVarargs
public final MyLambdaQueryWrapper<T> select(boolean condition, String... columns) {
if (condition && ArrayUtils.isNotEmpty(columns)) {
String s = String.join(StringPool.COMMA, columns); String s = String.join(StringPool.COMMA, columns);
if (StringUtils.isBlank(sqlSelect.getStringValue())) { if (StringUtils.isBlank(sqlSelect.getStringValue())) {
this.sqlSelect.setStringValue(s); this.sqlSelect.setStringValue(s);
@ -133,6 +143,11 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
*/ */
@Override @Override
public MyLambdaQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) { public MyLambdaQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
return select(true, entityClass, predicate);
}
public MyLambdaQueryWrapper<T> select(boolean condition, Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
if (condition) {
if (entityClass == null) { if (entityClass == null) {
entityClass = getEntityClass(); entityClass = getEntityClass();
} else { } else {
@ -147,10 +162,16 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
} else { } else {
this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join);
} }
}
return typedThis; return typedThis;
} }
public final MyLambdaQueryWrapper<T> selectAll(Class<T> clazz) { public final MyLambdaQueryWrapper<T> selectAll(Class<T> clazz) {
return selectAll(true, clazz);
}
public final MyLambdaQueryWrapper<T> selectAll(boolean condition, Class<T> clazz) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(clazz); TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();
if (info.havePK()) { if (info.havePK()) {
@ -163,6 +184,7 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
} else { } else {
this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join);
} }
}
return typedThis; return typedThis;
} }

View File

@ -80,21 +80,38 @@ public class MyQueryWrapper<T> extends AbstractWrapper<T, String, MyQueryWrapper
@Override @Override
public MyQueryWrapper<T> select(String... columns) { public MyQueryWrapper<T> select(String... columns) {
return select(true, columns);
}
public MyQueryWrapper<T> select(boolean condition, String... columns) {
if (condition) {
if (ArrayUtils.isNotEmpty(columns)) { if (ArrayUtils.isNotEmpty(columns)) {
this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns)); this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns));
} }
}
return typedThis; return typedThis;
} }
@Override @Override
public MyQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) { public MyQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
return select(true, entityClass, predicate);
}
public MyQueryWrapper<T> select(boolean condition, Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
if (condition) {
super.setEntityClass(entityClass); super.setEntityClass(entityClass);
this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate)); this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate));
}
return typedThis; return typedThis;
} }
public final MyQueryWrapper<T> selectAll(Class<T> clazz) { public final MyQueryWrapper<T> selectAll(Class<T> clazz) {
return selectAll(true, clazz);
}
public final MyQueryWrapper<T> selectAll(boolean condition, Class<T> clazz) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(clazz); TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> list = new ArrayList<>(); List<String> list = new ArrayList<>();
if (info.havePK()) { if (info.havePK()) {
@ -107,6 +124,7 @@ public class MyQueryWrapper<T> extends AbstractWrapper<T, String, MyQueryWrapper
} else { } else {
this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join); this.sqlSelect.setStringValue(this.getSqlSelect() + StringPool.COMMA + join);
} }
}
return typedThis; return typedThis;
} }

View File

@ -15,7 +15,9 @@ import com.github.yulichang.toolkit.MyLambdaUtils;
import com.github.yulichang.wrapper.interfaces.MyLambdaJoin; import com.github.yulichang.wrapper.interfaces.MyLambdaJoin;
import com.github.yulichang.wrapper.interfaces.MySFunctionQuery; 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.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -23,7 +25,7 @@ import java.util.stream.Collectors;
/** /**
* copy {@link com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper} * copy {@link com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper}
*/ */
@SuppressWarnings("serial") @SuppressWarnings("all")
public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJoinLambdaQueryWrapper<T>> public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJoinLambdaQueryWrapper<T>>
implements MySFunctionQuery<MyJoinLambdaQueryWrapper<T>>, MyLambdaJoin<MyJoinLambdaQueryWrapper<T>> { implements MySFunctionQuery<MyJoinLambdaQueryWrapper<T>>, MyLambdaJoin<MyJoinLambdaQueryWrapper<T>> {
@ -99,7 +101,12 @@ public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJo
*/ */
@SafeVarargs @SafeVarargs
public final <S> MyJoinLambdaQueryWrapper<T> select(SFunction<S, ?>... columns) { public final <S> MyJoinLambdaQueryWrapper<T> select(SFunction<S, ?>... columns) {
if (ArrayUtils.isNotEmpty(columns)) { return select(true, columns);
}
@SafeVarargs
public final <S> MyJoinLambdaQueryWrapper<T> select(boolean condition, SFunction<S, ?>... columns) {
if (condition && ArrayUtils.isNotEmpty(columns)) {
for (SFunction<S, ?> s : columns) { for (SFunction<S, ?> s : columns) {
selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(s), MyLambdaUtils.getColumn(s), null)); selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(s), MyLambdaUtils.getColumn(s), null));
} }
@ -109,20 +116,37 @@ public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJo
@Override @Override
public <E> MyJoinLambdaQueryWrapper<T> select(Class<E> entityClass, Predicate<TableFieldInfo> predicate) { public <E> MyJoinLambdaQueryWrapper<T> select(Class<E> entityClass, Predicate<TableFieldInfo> predicate) {
return select(true, entityClass, predicate);
}
public <E> MyJoinLambdaQueryWrapper<T> select(boolean condition, Class<E> entityClass, Predicate<TableFieldInfo> predicate) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(entityClass); TableInfo info = TableInfoHelper.getTableInfo(entityClass);
Assert.notNull(info, "table can not be find"); Assert.notNull(info, "table can not be find");
info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach( info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach(
i -> selectColumns.add(new SelectColumn(entityClass, i.getColumn(), null))); i -> selectColumns.add(new SelectColumn(entityClass, i.getColumn(), null)));
}
return typedThis; return typedThis;
} }
public final <S, X> MyJoinLambdaQueryWrapper<T> selectAs(SFunction<S, ?> columns, SFunction<X, ?> alias) { public final <S, X> MyJoinLambdaQueryWrapper<T> selectAs(SFunction<S, ?> columns, SFunction<X, ?> alias) {
return selectAs(true, columns, alias);
}
public final <S, X> MyJoinLambdaQueryWrapper<T> selectAs(boolean condition, SFunction<S, ?> columns, SFunction<X, ?> alias) {
if (condition) {
selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias)));
}
return typedThis; return typedThis;
} }
public final MyJoinLambdaQueryWrapper<T> selectAll(Class<?> clazz) { public final MyJoinLambdaQueryWrapper<T> selectAll(Class<?> clazz) {
return selectAll(clazz);
}
public final MyJoinLambdaQueryWrapper<T> selectAll(boolean condition, Class<?> clazz) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(clazz); TableInfo info = TableInfoHelper.getTableInfo(clazz);
Assert.notNull(info, "table can not be find -> %s", clazz); Assert.notNull(info, "table can not be find -> %s", clazz);
if (info.havePK()) { if (info.havePK()) {
@ -130,9 +154,11 @@ public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJo
} }
info.getFieldList().forEach(c -> info.getFieldList().forEach(c ->
selectColumns.add(new SelectColumn(clazz, c.getColumn(), null))); selectColumns.add(new SelectColumn(clazz, c.getColumn(), null)));
}
return typedThis; return typedThis;
} }
@Override @Override
public String getSqlSelect() { public String getSqlSelect() {
if (StringUtils.isBlank(sqlSelect.getStringValue())) { if (StringUtils.isBlank(sqlSelect.getStringValue())) {