This commit is contained in:
admin 2021-02-01 10:25:22 +08:00
parent f5d7aff146
commit 475035ffce
3 changed files with 166 additions and 187 deletions

203
README.md
View File

@ -2,12 +2,6 @@
支持连表查询的[mybatis-plus](https://gitee.com/baomidou/mybatis-plus) 支持连表查询的[mybatis-plus](https://gitee.com/baomidou/mybatis-plus)
## 运行环境
* mysql8
* jdk8
* mybatis-plus 3.4.2
## 使用方法 ## 使用方法
### 方法一 ### 方法一
@ -47,6 +41,7 @@
## MyQuery用法 ## MyQuery用法
### 简单的3表查询 ### 简单的3表查询
```java ```java
class test { class test {
@Resource @Resource
@ -72,16 +67,14 @@ class test {
对应sql 对应sql
```sql ```sql
SELECT SELECT t.id,
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 FROM user t
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 (
@ -92,6 +85,7 @@ WHERE (
``` ```
说明: 说明:
* UserDTO.class 查询结果类(resultType) * UserDTO.class 查询结果类(resultType)
* selectAll(UserDO.class) 查询主表全部字段(主表实体类) * selectAll(UserDO.class) 查询主表全部字段(主表实体类)
* select() mp的select策略是覆盖,以最后一次为准,这里的策略是追加,可以一直select * select() mp的select策略是覆盖,以最后一次为准,这里的策略是追加,可以一直select
@ -123,19 +117,16 @@ class test {
对应sql 对应sql
```sql ```sql
SELECT SELECT t.id,
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 FROM user t
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 LIMIT ?,?
LIMIT ?,?
``` ```
### 还可以这么操作,但不建议 ### 还可以这么操作,但不建议
@ -169,8 +160,7 @@ class test {
对应sql 对应sql
```sql ```sql
SELECT SELECT t.id,
t.id,
t.name, t.name,
t.sex, t.sex,
t.head_img, t.head_img,
@ -178,8 +168,7 @@ SELECT
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 FROM user t
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 ( WHERE (
@ -201,12 +190,17 @@ class test {
private UserMapper userMapper; private UserMapper userMapper;
void testJoin() { void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, new MyLambdaQueryWrapper<UserEntity>() List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
.selectAll(UserEntity.class) new MyLambdaQueryWrapper<UserDO>()
.leftJoin(UserEntity::getId, UserAddressEntity::getUserId, .selectAll(UserDO.class)
r1 -> r1.select(UserAddressEntity::getAddress) .select(UserAddressDO::getTel)
.leftJoin(UserAddressEntity::getAreaId, AreaEntity::getId, .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
r2 -> r2.select(AreaEntity::getProvince)))); .select(AreaDO::getProvince, AreaDO::getCity)
.leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
.leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
.eq(true, UserDO::getId, 1)
.like(true, UserAddressDO::getTel, "1")
.gt(true, UserDO::getId, 5));
} }
} }
``` ```
@ -214,98 +208,71 @@ class test {
对应sql 对应sql
```sql ```sql
SELECT t0.name, SELECT user.id,
t0.sex, user.name,
t0.head_img, user.sex,
t0.id, user.head_img,
t1.address, user_address.tel,
t2.province user_address.address AS userAddress,
FROM user t0 area.province,
LEFT JOIN user_address t1 ON t0.id = t1.user_id area.city
LEFT JOIN area t2 ON t1.area_id = t2.id FROM user
``` LEFT JOIN user_address ON user_address.user_id = user.id
LEFT JOIN area ON area.id = user_address.area_id
sql -> 伪代码
```java
class test {
void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, new MyLambdaQueryWrapper<user表>()
.selectAll(user表实体类.class)//查询user表全部字段
.leftJoin(user表on字段, user_address表on字段,
user_address表对象 -> user_address表对象
.select(user_address表address字段)
.leftJoin(user_address表表的on字段, area表的on字段,
area表对象 -> area表对象.select(area表的province字段))));
}
}
```
#### 字段别名,查询字段别名 head_img as userHeadImg
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, new MyLambdaQueryWrapper<UserEntity>()
.as(UserEntity::getHeadImg, UserDTO::getUserHeadImg)
.leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel)));
}
}
```
对应sql
```sql
SELECT t0.head_img AS userHeadImg,
t1.address,
t1.tel
FROM user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id
```
#### 左连接 leftJoin(UserEntity::getId,UserAddressEntity::getUserId,right -> right)
前连个参数是两个表的连接条件:
user left join user_address on user.id = User_address.user_id
第三个参数是右表wrapper对象,可以继续使用,以上方法.
#### 条件查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, new MyLambdaQueryWrapper<UserEntity>()
.selectAll(UserEntity.class)
.leftJoin(UserEntity::getId, UserAddressEntity::getUserId,
right -> right.select(UserAddressEntity::getAddress, UserAddressEntity::getTel))
.eq(true, UserEntity::getId, 1)
.like(UserAddressEntity::getTel, "1")
.eq(UserEntity::getId, UserAddressEntity::getUserId));
}
}
```
对应sql
```sql
SELECT t0.name,
t0.sex,
t0.head_img,
t0.id,
t1.address,
t1.tel
FROM user t0
LEFT JOIN user_address t1 ON t0.id = t1.user_id
WHERE ( WHERE (
t0.id = ? user.id = ?
AND t1.tel LIKE ? AND user_address.tel LIKE ?
AND t0.id = t1.user_id) AND user.id > ?)
``` ```
说明:
* UserDTO.class 查询结果返回类(resultType)
* selectAll() 查询指定实体类的全部字段
* select() 查询指定的字段,支持可变参数,同意个select只能查询相同表的字段
故将UserAddressDO和AreaDO分开为连个select
* selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
* leftJoin() 参数说明
第一个参数:参与连表的实体类class
第二个参数数:连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数:参与连表的另一个实体类属性
* 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
#### 分页查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
IPage<UserDTO> iPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class,
new MyLambdaQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select(UserAddressDO::getTel)
.selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
.select(AreaDO::getProvince, AreaDO::getCity)
.leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
.leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId));
}
}
```
对应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
LIMIT ?,?
```

View File

@ -14,6 +14,7 @@ import org.apache.ibatis.reflection.property.PropertyNamer;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.joining;
@ -93,8 +94,9 @@ public abstract class MyAbstractLambdaWrapper<T, Children extends MyAbstractLamb
private ColumnCache getColumnCache(String fieldName, Class<?> lambdaClass) { private ColumnCache getColumnCache(String fieldName, Class<?> lambdaClass) {
ColumnCache columnCache = columnMap.get(LambdaUtils.formatKey(fieldName)); ColumnCache columnCache = columnMap.get(LambdaUtils.formatKey(fieldName));
Assert.notNull(columnCache, "can not find lambda cache for this property [%s] of entity [%s]", if (Objects.isNull(columnCache)) {
fieldName, lambdaClass.getName()); columnCache = new ColumnCache(fieldName, null);
}
return columnCache; return columnCache;
} }

View File

@ -118,10 +118,20 @@ public class MyLambdaQueryWrapper<T> extends MyAbstractLambdaWrapper<T, MyLambda
public final <S, X> MyLambdaQueryWrapper<T> selectAs(SFunction<S, ?> columns, SFunction<X, ?> alias) { public final <S, X> MyLambdaQueryWrapper<T> selectAs(SFunction<S, ?> columns, SFunction<X, ?> alias) {
Class<S> clazz = MyLambdaUtils.getEntityClass(columns); Class<S> clazz = MyLambdaUtils.getEntityClass(columns);
TableInfo info = TableInfoHelper.getTableInfo(clazz); TableInfo info = TableInfoHelper.getTableInfo(clazz);
Assert.notNull(info, "table can not be find for lambda");
selectColumns.add(new SelectColumn(clazz, info.getTableName(), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias))); selectColumns.add(new SelectColumn(clazz, info.getTableName(), MyLambdaUtils.getColumn(columns), MyLambdaUtils.getName(alias)));
return typedThis; return typedThis;
} }
public final MyLambdaQueryWrapper<T> selectAll(Class<?> clazz) {
TableInfo info = TableInfoHelper.getTableInfo(clazz);
Assert.notNull(info, "table can not be find -> %s", clazz);
selectColumns.add(new SelectColumn(clazz, info.getTableName(), info.getKeyColumn(), null));
info.getFieldList().forEach(c ->
selectColumns.add(new SelectColumn(clazz, info.getTableName(), c.getColumn(), null)));
return typedThis;
}
@Override @Override
public String getSqlSelect() { public String getSqlSelect() {
if (StringUtils.isBlank(sqlSelect.getStringValue())) { if (StringUtils.isBlank(sqlSelect.getStringValue())) {