From a5bf57e71e1c2338eec7cbfb25af6357c193c635 Mon Sep 17 00:00:00 2001 From: blinkfox Date: Thu, 21 Nov 2019 00:01:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E6=96=B9=E5=BC=8F=E7=9A=84=E4=BD=BF=E7=94=A8=E5=92=8C?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/CHANGELOG.md | 4 +-- docs/compare-mybatis.md | 13 ++++---- docs/java/main-method.md | 23 ++++++++++++- docs/xml/xml-tags.md | 33 +++++++++++++++++-- .../java/com/blinkfox/fenix/core/Fenix.java | 12 +++++++ .../com/blinkfox/fenix/core/FenixTest.java | 12 +++---- src/test/resources/fenix/fenix.xml | 23 ++++++------- 7 files changed, 89 insertions(+), 31 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 76e4485..eddde9e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,6 @@ -## v2.1.0 新增 标签和对应的 Java API (2019-11-20) +## v2.1.0 新增 标签和对应的 Java API (2019-11-21) -- 新增了 `` 标签和 `where(Consumer consumer)` API,用来消除全动态 SQL 中 `WHERE` 关键字后的 `AND` 或者 `OR` 关键字; +- 新增了 `` 标签和动态 `where` 的 Java API,用来消除在全动态 SQL 中场景中,`WHERE` 关键字后的 `AND` 或者 `OR` 关键字; ## v2.0.0 支持 Spring Boot 的 2.2.0.RELEASE 版本 (2019-10-10) diff --git a/docs/compare-mybatis.md b/docs/compare-mybatis.md index 5b0ecd1..08409f4 100644 --- a/docs/compare-mybatis.md +++ b/docs/compare-mybatis.md @@ -89,12 +89,11 @@ ol.description FROM OperationLog AS ol - - - - - - + + + + + @@ -106,7 +105,7 @@ - MyBatis 只能写原生 SQL,无法享受跨数据库时的兼容性;由于 Fenix 是基于 Spring Data JPA 的扩展,即可以写 `JPQL` 语句,也可以写原生 `SQL` 语句,上述示例中写的是 `JPQL` 语句,SQL 的字段表达上更简洁,也不需要再定义 `resultMap` 映射关系。 - MyBatis 书写动态 SQL 依赖只能使用 `if/else`、`foreach` 等分支选择、循环等操作,保证了灵活性,但是代码量和重复性较高,且 SQL 嵌套多层,视觉上比较混乱,可读写差;而 Fenix 也有 `if/else`、`foreach` 等分支循环操作,但内置了大量的更加简单、强大和语义化的 XML [SQL 标签](xml/xml-tags),使用语义化的 SQL 标签,使得 SQL 的语义简单明了,没有多层嵌套,可读写更好,通过 `match` 属性的值来确定是否生成此条 SQL,来达到动态性。 -- MyBatis 通过 `trim` 标签或者使用 `` 标签来消除 `WHERE` 语句后的 `AND` 关键字,`Fenix` 也是使用 `` 标签来包裹即可。也可以通过在 `` 节点中声明 `removeIfExist` 属性(非必填)来声明式的消除。 +- MyBatis 通过 `trim` 标签或者使用 `` 标签来消除 `WHERE` 语句后的 `AND` 关键字,而 `Fenix` 也是直接使用 `` 标签即可动态处理 `WHERE` 与 `AND` 的关系,也可以将各个动态条件包裹在 `` 标签内。 - MyBatis 的动态 SQL 解析引擎是 [OGNL](http://commons.apache.org/proper/commons-ognl/),而 Fenix 的解析引擎是 [MVEL](http://mvel.documentnode.com/),功能和性能上都更优一些。 > 通过以上 MyBatis 和 Fenix 的各自 SQL 写法比较来看,`Fenix` 的 SQL 在**动态性**、**简介性**和**SQL 语义化**等方面,都更加强大。 diff --git a/docs/java/main-method.md b/docs/java/main-method.md index 06bab1d..a14b1b9 100644 --- a/docs/java/main-method.md +++ b/docs/java/main-method.md @@ -447,11 +447,32 @@ where(String text, String key, Object value) // 通过 Lambda 继续拼接 SQL,并动态处理 WHERE 关键字后的 AND 或者 OR 关键字. where(Consumer consumer) + +// 通过 Lambda 继续拼接 SQL,并动态处理 WHERE 关键字后的 AND 或者 OR 关键字. +// 该方法等价于 XML 中的 标签 +where(Consumer consumer) + +// 使用该方法会动态处理 WHERE 关键字后的 AND 或者 OR 关键字,同 where(Consumer consumer) 方法类似. +// 该方法等价于 XML 中的 标签 +whereDynamic() ``` ### 使用示例 -下面是 `where(Consumer consumer)` 的执行示例,供你参考。 +下面是动态 where(`whereDynamic()` 和 `where(Consumer consumer)`)的使用示例,供你参考。 + +```java +SqlInfo sqlInfo = Fenix.start() + .select("u") + .from("User") + .whereDynamic() + .andEqual("u.id", context.get("id"), context.get("id_a") != null) + .andLike("u.nickName", context.get("name"), context.get("name") != null) + .andLike("u.email", context.get("email"), context.get("email") != null) + .andIn("u.sex", (Object[]) context.get("sexs"), context.get("sexs") != null) + .orderBy("u.updateTime").desc() + .end(); +``` ```java SqlInfo sqlInfo = Fenix.start() diff --git a/docs/xml/xml-tags.md b/docs/xml/xml-tags.md index edd36b8..cdcc5f4 100644 --- a/docs/xml/xml-tags.md +++ b/docs/xml/xml-tags.md @@ -266,7 +266,13 @@ AND u.n_age IS NULL ### 标签 +下面是 `where` 标签的使用方式,两种方式是等价的,看情况选用一种方式即可。 + ```xml + + + + @@ -274,6 +280,30 @@ AND u.n_age IS NULL ### 使用示例 +```xml + + + + SELECT u FROM @{entityName} + + anD u.id = #{user.id} + + + ORDER BY u.updateTime DESC + + + + + + SELECT u FROM @{entityName} + + + + +``` + +下面的使用方式等价于上面的方式,看情况选用一种方式来使用即可: + ```xml @@ -284,8 +314,7 @@ AND u.n_age IS NULL - ORDER BY - u.updateTime DESC + ORDER BY u.updateTime DESC diff --git a/src/main/java/com/blinkfox/fenix/core/Fenix.java b/src/main/java/com/blinkfox/fenix/core/Fenix.java index 1e0b9c3..4fde03e 100644 --- a/src/main/java/com/blinkfox/fenix/core/Fenix.java +++ b/src/main/java/com/blinkfox/fenix/core/Fenix.java @@ -238,6 +238,18 @@ public Fenix where(Consumer consumer) { return this; } + /** + * 动态处理 WHERE 关键字. + * + *

使用该方法会动态处理 WHERE 关键字后的 AND 或者 OR 关键字,同 {@link #where(Consumer)} 方法类似.

+ * + * @return {@link Fenix} 实例 + */ + public Fenix whereDynamic() { + this.source.getSqlInfo().setPrependWhere(true); + return this; + } + /** * 拼接并带上 'AND' 关键字的字符串. * diff --git a/src/test/java/com/blinkfox/fenix/core/FenixTest.java b/src/test/java/com/blinkfox/fenix/core/FenixTest.java index d8bc8a6..9050470 100644 --- a/src/test/java/com/blinkfox/fenix/core/FenixTest.java +++ b/src/test/java/com/blinkfox/fenix/core/FenixTest.java @@ -664,9 +664,9 @@ public void testWhere2() { SqlInfo sqlInfo = Fenix.start() .select("u") .from("User") - .where(fenix -> - fenix.andEqual("u.id", context.get("id"), context.get("id_a") != null) - .andLike("u.nickName", context.get("name"), context.get("name_b") != null)) + .whereDynamic() + .andEqual("u.id", context.get("id"), context.get("id_a") != null) + .andLike("u.nickName", context.get("name"), context.get("name_b") != null) .orderBy("u.updateTime").desc() .end(); @@ -682,9 +682,9 @@ public void testWhere3() { SqlInfo sqlInfo = Fenix.start() .select("u") .from("User") - .where(fenix -> - fenix.andEqual("u.id", context.get("id"), context.get("id_a") != null) - .andLike("u.nickName", context.get("name"), context.get("name") != null)) + .whereDynamic() + .andEqual("u.id", context.get("id"), context.get("id_a") != null) + .andLike("u.nickName", context.get("name"), context.get("name") != null) .andIn("u.sex", (Object[]) context.get("sexs"), context.get("sexs") != null) .orderBy("u.updateTime").desc() .end(); diff --git a/src/test/resources/fenix/fenix.xml b/src/test/resources/fenix/fenix.xml index 63e36df..c61d5e7 100644 --- a/src/test/resources/fenix/fenix.xml +++ b/src/test/resources/fenix/fenix.xml @@ -234,29 +234,26 @@ SELECT u FROM @{entityName} - - - - + + + SELECT u FROM @{entityName} - - - - + + + SELECT u FROM @{entityName} - - anD u.id = #{user.id} - - - + + anD u.id = #{user.id} + + ORDER BY u.updateTime DESC