From fc9ae1a143f72f40f815e7fedd2382fcfa0a15bb Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Wed, 24 Feb 2021 10:14:59 +0800 Subject: [PATCH] 1.0.9 --- .../{ => alisa}/AliasLambdaQueryWrapper.java | 2 +- .../{ => alisa}/AliasQueryWrapper.java | 7 +- .../common/support/{ => alisa}/README.md | 0 .../yulichang/common/support/func/F.java | 50 +++++++ .../yulichang/common/support/func/S.java | 72 ++++++++++ .../yulichang/common/support/func/ZREADME.md | 134 ++++++++++++++++++ 6 files changed, 263 insertions(+), 2 deletions(-) rename src/main/java/com/github/yulichang/common/support/{ => alisa}/AliasLambdaQueryWrapper.java (94%) rename src/main/java/com/github/yulichang/common/support/{ => alisa}/AliasQueryWrapper.java (73%) rename src/main/java/com/github/yulichang/common/support/{ => alisa}/README.md (100%) create mode 100644 src/main/java/com/github/yulichang/common/support/func/F.java create mode 100644 src/main/java/com/github/yulichang/common/support/func/S.java create mode 100644 src/main/java/com/github/yulichang/common/support/func/ZREADME.md diff --git a/src/main/java/com/github/yulichang/common/support/AliasLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/common/support/alisa/AliasLambdaQueryWrapper.java similarity index 94% rename from src/main/java/com/github/yulichang/common/support/AliasLambdaQueryWrapper.java rename to src/main/java/com/github/yulichang/common/support/alisa/AliasLambdaQueryWrapper.java index 1663b15..e6498f6 100644 --- a/src/main/java/com/github/yulichang/common/support/AliasLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/common/support/alisa/AliasLambdaQueryWrapper.java @@ -1,4 +1,4 @@ -package com.github.yulichang.common.support; +package com.github.yulichang.common.support.alisa; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringPool; diff --git a/src/main/java/com/github/yulichang/common/support/AliasQueryWrapper.java b/src/main/java/com/github/yulichang/common/support/alisa/AliasQueryWrapper.java similarity index 73% rename from src/main/java/com/github/yulichang/common/support/AliasQueryWrapper.java rename to src/main/java/com/github/yulichang/common/support/alisa/AliasQueryWrapper.java index eb523b7..9062749 100644 --- a/src/main/java/com/github/yulichang/common/support/AliasQueryWrapper.java +++ b/src/main/java/com/github/yulichang/common/support/alisa/AliasQueryWrapper.java @@ -1,4 +1,4 @@ -package com.github.yulichang.common.support; +package com.github.yulichang.common.support.alisa; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringPool; @@ -22,6 +22,11 @@ public class AliasQueryWrapper extends QueryWrapper { /** * 重写字段序列化方法 + * 可以自定义过滤策略可以是空格或其他(以下方法是只为查询字段没有带点 . 的加别名,带点的则不会加) + * setAlias("u") + *

+ * .eq("id") --> u.id + * .eq("ee.id") --> ee.id */ @Override protected String columnToString(String column) { diff --git a/src/main/java/com/github/yulichang/common/support/README.md b/src/main/java/com/github/yulichang/common/support/alisa/README.md similarity index 100% rename from src/main/java/com/github/yulichang/common/support/README.md rename to src/main/java/com/github/yulichang/common/support/alisa/README.md diff --git a/src/main/java/com/github/yulichang/common/support/func/F.java b/src/main/java/com/github/yulichang/common/support/func/F.java new file mode 100644 index 0000000..4c8b132 --- /dev/null +++ b/src/main/java/com/github/yulichang/common/support/func/F.java @@ -0,0 +1,50 @@ +package com.github.yulichang.common.support.func; + +import com.baomidou.mybatisplus.annotation.TableField; +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.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; +import org.apache.ibatis.reflection.property.PropertyNamer; + +import java.util.Objects; + +/** + * 使用表全名,不适用别名 + * UserDO::getId --> user.id + * UserAddrDO::getTel --> user_addr.tel + * + * @author yulichang + */ +public class F { + + public static String s(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return TableInfoHelper.getTableInfo(getEntityClass(sFunction)).getTableName() + + StringPool.DOT + getColumn(sFunction); + } + + /** + * 与S的getColumn一致,连个都用,保留一个就行了 + */ + public static String getColumn(SFunction fn) { + SerializedLambda lambda = LambdaUtils.resolve(fn); + String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); + try { + TableField annotation = lambda.getImplClass().getDeclaredField(fieldName).getAnnotation(TableField.class); + if (Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.value())) { + return annotation.value(); + } + } catch (NoSuchFieldException ignored) { + } + return StringUtils.camelToUnderline(fieldName); + } + + @SuppressWarnings("unchecked") + public static Class getEntityClass(SFunction fn) { + return (Class) com.baomidou.mybatisplus.core.toolkit.LambdaUtils.resolve(fn).getInstantiatedType(); + } +} diff --git a/src/main/java/com/github/yulichang/common/support/func/S.java b/src/main/java/com/github/yulichang/common/support/func/S.java new file mode 100644 index 0000000..b40a338 --- /dev/null +++ b/src/main/java/com/github/yulichang/common/support/func/S.java @@ -0,0 +1,72 @@ +package com.github.yulichang.common.support.func; + +import com.baomidou.mybatisplus.annotation.TableField; +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.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; +import org.apache.ibatis.reflection.property.PropertyNamer; + +import java.util.Objects; + +/** + * 预定义以下别名 可以自行设置别名 + * S.a(UserDO::getId) --> a.id + * S.b(UserDO::getId) --> b.id + * S.c(UserDO::getId) --> c.id + * S.d(UserDO::getId) --> d.id + * S.e(UserDO::getId) --> e.id + * S.f(UserDO::getId) --> f.id + * + * @author yulichang + */ +public class S { + + public static String a(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "a" + StringPool.DOT + getColumn(sFunction); + } + + public static String b(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "b" + StringPool.DOT + getColumn(sFunction); + } + + public static String c(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "c" + StringPool.DOT + getColumn(sFunction); + } + + public static String d(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "d" + StringPool.DOT + getColumn(sFunction); + } + + public static String e(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "e" + StringPool.DOT + getColumn(sFunction); + } + + public static String f(SFunction sFunction) { + Assert.notNull(sFunction, "function is null"); + return "f" + StringPool.DOT + getColumn(sFunction); + } + + /** + * 与F的getColumn一致,连个都用,保留一个就行了 + */ + public static String getColumn(SFunction fn) { + SerializedLambda lambda = LambdaUtils.resolve(fn); + String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName()); + try { + TableField annotation = lambda.getImplClass().getDeclaredField(fieldName).getAnnotation(TableField.class); + if (Objects.nonNull(annotation) && StringUtils.isNotBlank(annotation.value())) { + return annotation.value(); + } + } catch (NoSuchFieldException ignored) { + } + return StringUtils.camelToUnderline(fieldName); + } +} diff --git a/src/main/java/com/github/yulichang/common/support/func/ZREADME.md b/src/main/java/com/github/yulichang/common/support/func/ZREADME.md new file mode 100644 index 0000000..414dd6a --- /dev/null +++ b/src/main/java/com/github/yulichang/common/support/func/ZREADME.md @@ -0,0 +1,134 @@ +## 支持lambda的QueryWrapper + +让QueryWrapper也能使用lambda + +### 使用方法 + +拷贝以下类即可 +[com.github.yulichang.common.support.func.F]() +[com.github.yulichang.common.support.func.S]() + +原理: +F类以表名+列明的形式序列化 (@TableName与@TableField注解是有效的,会优先使用注解的值) + +* F.s(UserDO::getId) --> user.id +* F.s(UserAddrDO::getId) --> user_addr.id + +S类以预定义表名+列明的形式序列化 +忽略表名,以预定义别名替代(@TableField注解是有效的,会优先使用注解的值) + +* S.a(UserDO::getId) --> a.id +* S.b(UserDO::getId) --> b.id +* S.c(UserDO::getId) --> c.id +* S.d(UserDO::getId) --> d.id +* S.e(UserDO::getId) --> e.id +* S.f(UserDO::getId) --> f.id + +注解: + +```java + +@Mapper +public interface UserMapper extends BaseMapper { + /** + * 使用 S + */ + @Select("select a.*,b.tel from user a " + + "left join user_address b on a.id = b.user_id ${ew.customSqlSegment}") + UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 使用 F + */ + @Select("select user.*,user_address.tel from user " + + "left join user_address on user.id = user_address.user_id ${ew.customSqlSegment}") + UserDTO userLeftJoin(@Param(Constants.WRAPPER) Wrapper queryWrapper); +} +``` + +或者xml + +``` + + + + + +``` + +使用wrapper: + +```java +class MpJoinTest { + @Resource + private UserMapper userMapper; + + /** + * 使用S + */ + @Test + void testS() { + UserDTO dto = userMapper.userLeftJoin(new QueryWrapper() + .eq(S.a(UserDO::getId), "1") + .gt(S.a(UserDO::getSex), "3") + .eq(S.b(UserAddressDO::getTel), "10086") + .like(S.b(UserAddressDO::getAddress), "北京")); + } + + /** + * 使用F + */ + @Test + void testF() { + UserDTO dto = userMapper.userLeftJoin(new QueryWrapper() + .eq(F.s(UserDO::getId), "1") + .gt(F.s(UserDO::getSex), "3") + .eq(F.s(UserAddressDO::getTel), "10086") + .like(F.s(UserAddressDO::getAddress), "北京")); + } +} +``` + +对应sql: + +``` +# 使用S +select + a.*, + b.tel +from user a + left join user_address b on a.id = b.user_id +WHERE ( + a.id = ? + AND a.sex > ? + AND b.tel = ? + AND b.address LIKE ?) + +# 使用F +select + user.*, + user_address.tel +from user + left join user_address on user.id = user_address.user_id +WHERE ( + user.id = ? + AND user.sex > ? + AND user_address.tel = ? + AND user_address.address LIKE ?) +``` \ No newline at end of file