From e611019659b3d20c56fd21d9dce0dceffbe09801 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Thu, 28 Mar 2024 10:09:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=20wrapper=20=E6=94=AF=E6=8C=81=E5=8F=8D=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/db/sql/Wrapper.java | 30 +++++++++++++ .../test/java/cn/hutool/db/WrapperTest.java | 43 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 hutool-db/src/test/java/cn/hutool/db/WrapperTest.java diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java b/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java index 8851b2eac..8dabddc9e 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java @@ -120,6 +120,36 @@ public class Wrapper implements Serializable { return StrUtil.format("{}{}{}", preWrapQuote, field, sufWrapQuote); } + /** + * 反解包装字段名
+ * + * @param field 字段名 + * @return 未包装的字段名 + */ + public String unWrap(String field) { + if (preWrapQuote == null || sufWrapQuote == null || StrUtil.isBlank(field)) { + return field; + } + + //如果已经包含包装的引号,返回原字符 + if (!StrUtil.isSurround(field, preWrapQuote, sufWrapQuote)) { + return field; + } + + //如果字段中包含通配符或者括号(字段通配符或者函数),不做包装 + if (StrUtil.containsAnyIgnoreCase(field, "*", "(", " ", " as ")) { + return field; + } + + //对于Oracle这类数据库,表名中包含用户名需要单独拆分包装 + if (field.contains(StrUtil.DOT)) { + final Collection target = CollUtil.edit(StrUtil.split(field, CharUtil.DOT, 2), t -> StrUtil.unWrap(t, preWrapQuote, sufWrapQuote)); + return CollectionUtil.join(target, StrUtil.DOT); + } + + return StrUtil.unWrap(field, preWrapQuote, sufWrapQuote); + } + /** * 包装字段名
* 有时字段与SQL的某些关键字冲突,导致SQL出错,因此需要将字段名用单引号或者反引号包装起来,避免冲突 diff --git a/hutool-db/src/test/java/cn/hutool/db/WrapperTest.java b/hutool-db/src/test/java/cn/hutool/db/WrapperTest.java new file mode 100644 index 000000000..ba89e80b6 --- /dev/null +++ b/hutool-db/src/test/java/cn/hutool/db/WrapperTest.java @@ -0,0 +1,43 @@ +package cn.hutool.db; + +import cn.hutool.db.sql.Wrapper; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +/** + * @author bwcx_jzy + * @since 24/3/28 028 + */ +public class WrapperTest { + + @Test + @Ignore + public void test() { + Wrapper wrapper = new Wrapper('`'); + String originalName = "name"; + String wrapName = wrapper.wrap(originalName); + String unWrapName = wrapper.unWrap(wrapName); + Assert.assertEquals(unWrapName, originalName); + } + + @Test + @Ignore + public void testDotWrap() { + Wrapper wrapper = new Wrapper('`'); + String originalName = "name.age"; + String wrapName = wrapper.wrap(originalName); + String unWrapName = wrapper.unWrap(wrapName); + Assert.assertEquals(unWrapName, originalName); + } + + @Test + @Ignore + public void testError() { + Wrapper wrapper = new Wrapper('`'); + String originalName = "name.age*"; + String wrapName = wrapper.wrap(originalName); + String unWrapName = wrapper.unWrap(wrapName); + Assert.assertEquals(unWrapName, originalName); + } +}