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

204
README.md
View File

@ -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><br>
依赖后无需再次引入mybatis-plus
```xml
<dependency>
@ -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)|支持|<font color=red>**支持**|不支持|
|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 ?,?
```

14
pom.xml
View File

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

View File

@ -27,7 +27,7 @@ import java.util.stream.Collectors;
* <p>
* sqlSelect 由覆盖改为追加
*/
@SuppressWarnings("serial")
@SuppressWarnings("all")
public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, 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
@Override
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);
if (StringUtils.isBlank(sqlSelect.getStringValue())) {
this.sqlSelect.setStringValue(s);
@ -109,7 +114,12 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
@SafeVarargs
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);
if (StringUtils.isBlank(sqlSelect.getStringValue())) {
this.sqlSelect.setStringValue(s);
@ -133,35 +143,47 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
*/
@Override
public MyLambdaQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> 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<String> 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<T> select(boolean condition, Class<T> entityClass, Predicate<TableFieldInfo> 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<String> 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<T> selectAll(Class<T> clazz) {
TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> 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<T> selectAll(boolean condition, Class<T> clazz) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> 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;
}

View File

@ -80,32 +80,50 @@ public class MyQueryWrapper<T> extends AbstractWrapper<T, String, MyQueryWrapper
@Override
public MyQueryWrapper<T> select(String... columns) {
if (ArrayUtils.isNotEmpty(columns)) {
this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns));
return select(true, columns);
}
public MyQueryWrapper<T> select(boolean condition, String... columns) {
if (condition) {
if (ArrayUtils.isNotEmpty(columns)) {
this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns));
}
}
return typedThis;
}
@Override
public MyQueryWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
super.setEntityClass(entityClass);
this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate));
return select(true, entityClass, predicate);
}
public MyQueryWrapper<T> select(boolean condition, Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
if (condition) {
super.setEntityClass(entityClass);
this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate));
}
return typedThis;
}
public final MyQueryWrapper<T> selectAll(Class<T> clazz) {
TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> 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<T> selectAll(boolean condition, Class<T> clazz) {
if (condition) {
TableInfo info = TableInfoHelper.getTableInfo(clazz);
List<String> 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;
}

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.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<T> extends MyAbstractLambdaWrapper<T, MyJoinLambdaQueryWrapper<T>>
implements MySFunctionQuery<MyJoinLambdaQueryWrapper<T>>, MyLambdaJoin<MyJoinLambdaQueryWrapper<T>> {
@ -99,7 +101,12 @@ public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJo
*/
@SafeVarargs
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) {
selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(s), MyLambdaUtils.getColumn(s), null));
}
@ -109,30 +116,49 @@ public class MyJoinLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyJo
@Override
public <E> MyJoinLambdaQueryWrapper<T> select(Class<E> entityClass, Predicate<TableFieldInfo> 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 <E> MyJoinLambdaQueryWrapper<T> select(boolean condition, Class<E> entityClass, Predicate<TableFieldInfo> 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 <S, X> MyJoinLambdaQueryWrapper<T> selectAs(SFunction<S, ?> columns, SFunction<X, ?> alias) {
selectColumns.add(new SelectColumn(MyLambdaUtils.getEntityClass(columns), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(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)));
}
return typedThis;
}
public final MyJoinLambdaQueryWrapper<T> 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<T> 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())) {