From 65079d451ed9ed92a4ae8cda8410f4cdd65fad2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E5=B9=B3?= Date: Sun, 18 Jun 2023 17:28:02 +0800 Subject: [PATCH] =?UTF-8?q?fix=20Db=20=E7=B1=BB=20=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=95=B0=E6=8D=AE=E5=8F=91=E7=94=9F=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=90=8D=E4=B9=B1=E5=BA=8F=E9=97=AE=E9=A2=98,?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=95=B0=E6=8D=AE=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E6=8F=92=E5=85=A5=20=E5=A2=9E=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/dialect/impl/AnsiSqlDialect.java | 6 +- .../java/org/dromara/hutool/db/DbTest.java | 279 ++++++++++-------- hutool-db/test.db | Bin 24576 -> 32768 bytes 3 files changed, 166 insertions(+), 119 deletions(-) diff --git a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java index 0de70e9e8..5e3efa4a5 100644 --- a/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java +++ b/hutool-db/src/main/java/org/dromara/hutool/db/dialect/impl/AnsiSqlDialect.java @@ -30,7 +30,10 @@ import org.dromara.hutool.db.sql.QuoteWrapper; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * ANSI SQL 方言 @@ -67,7 +70,8 @@ public class AnsiSqlDialect implements Dialect { } // 批量,根据第一行数据结构生成SQL占位符 final SqlBuilder insert = SqlBuilder.of(quoteWrapper).insert(entities[0], this.dialectName()); - final Set fields = CollUtil.filter(entities[0].keySet(), StrUtil::isNotBlank); + final List fields = + entities[0].keySet().stream().filter(StrUtil::isNotBlank).collect(Collectors.toList()); return StatementUtil.prepareStatementForBatch(conn, insert.build(), fields, entities); } diff --git a/hutool-db/src/test/java/org/dromara/hutool/db/DbTest.java b/hutool-db/src/test/java/org/dromara/hutool/db/DbTest.java index 60ceb43af..e6edb70e1 100644 --- a/hutool-db/src/test/java/org/dromara/hutool/db/DbTest.java +++ b/hutool-db/src/test/java/org/dromara/hutool/db/DbTest.java @@ -1,5 +1,6 @@ package org.dromara.hutool.db; +import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.db.handler.EntityListHandler; import org.dromara.hutool.db.sql.Condition; import org.dromara.hutool.log.LogUtil; @@ -10,148 +11,190 @@ import org.junit.jupiter.api.Test; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; /** * Db对象单元测试 - * @author looly * + * @author looly */ public class DbTest { - @Test - public void queryTest() { - final List find = Db.of().query("select * from user where age = ?", 18); - Assertions.assertEquals("王五", find.get(0).get("name")); - } + @Test + public void queryTest() { + final List find = Db.of().query("select * from user where age = ?", 18); + Assertions.assertEquals("王五", find.get(0).get("name")); + } - @Test - public void findTest() { - final List find = Db.of().find(Entity.of("user").set("age", 18)); - Assertions.assertEquals("王五", find.get(0).get("name")); - } + @Test + public void findTest() { + final List find = Db.of().find(Entity.of("user").set("age", 18)); + Assertions.assertEquals("王五", find.get(0).get("name")); + } - @Test - public void pageTest() { - // 测试数据库中一共4条数据,第0页有3条,第1页有1条 - final List page0 = Db.of().page(Entity.of("user"), - Page.of(0, 3)); - Assertions.assertEquals(3, page0.size()); + @Test + public void pageTest() { + // 测试数据库中一共4条数据,第0页有3条,第1页有1条 + final List page0 = Db.of().page(Entity.of("user"), + Page.of(0, 3)); + Assertions.assertEquals(3, page0.size()); - final List page1 = Db.of().page(Entity.of("user"), Page.of(1, 3)); - Assertions.assertEquals(1, page1.size()); - } + final List page1 = Db.of().page(Entity.of("user"), Page.of(1, 3)); + Assertions.assertEquals(1, page1.size()); + } - @Test - public void pageBySqlTest() { - final String sql = "select * from user order by name"; - // 测试数据库中一共4条数据,第0页有3条,第1页有1条 - final List page0 = Db.of().page( - sql, Page.of(0, 3)); - Assertions.assertEquals(3, page0.size()); + @Test + public void pageBySqlTest() { + final String sql = "select * from user order by name"; + // 测试数据库中一共4条数据,第0页有3条,第1页有1条 + final List page0 = Db.of().page( + sql, Page.of(0, 3)); + Assertions.assertEquals(3, page0.size()); - final List page1 = Db.of().page( - sql, Page.of(1, 3)); - Assertions.assertEquals(1, page1.size()); - } + final List page1 = Db.of().page( + sql, Page.of(1, 3)); + Assertions.assertEquals(1, page1.size()); + } - @Test - public void pageBySqlWithInTest() { - // in和其他条件混用 - final String sql = "select * from user where age > :age and name in (:names) order by name"; - // 测试数据库中一共4条数据,第0页有3条,第1页有1条 - final List page0 = Db.of().page( - sql, Page.of(0, 3), - Entity.of().set("age", 12) - .set("names", new String[]{"张三", "王五"}) - ); - Assertions.assertEquals(1, page0.size()); - } + @Test + public void pageBySqlWithInTest() { + // in和其他条件混用 + final String sql = "select * from user where age > :age and name in (:names) order by name"; + // 测试数据库中一共4条数据,第0页有3条,第1页有1条 + final List page0 = Db.of().page( + sql, Page.of(0, 3), + Entity.of().set("age", 12) + .set("names", new String[]{"张三", "王五"}) + ); + Assertions.assertEquals(1, page0.size()); + } - @Test - public void pageWithParamsTest() { - final String sql = "select * from user where name = ?"; - final PageResult result = Db.of().page( - sql, Page.of(0, 3), "张三"); + @Test + public void pageWithParamsTest() { + final String sql = "select * from user where name = ?"; + final PageResult result = Db.of().page( + sql, Page.of(0, 3), "张三"); - Assertions.assertEquals(2, result.getTotal()); - Assertions.assertEquals(1, result.getTotalPage()); - Assertions.assertEquals(2, result.size()); - } + Assertions.assertEquals(2, result.getTotal()); + Assertions.assertEquals(1, result.getTotalPage()); + Assertions.assertEquals(2, result.size()); + } - @Test - public void countTest() { - final long count = Db.of().count("select * from user"); - Assertions.assertEquals(4, count); - } + @Test + public void countTest() { + final long count = Db.of().count("select * from user"); + Assertions.assertEquals(4, count); + } - @Test - public void countByQueryTest() { - final long count = Db.of().count(Entity.of("user")); - Assertions.assertEquals(4, count); - } + @Test + public void countByQueryTest() { + final long count = Db.of().count(Entity.of("user")); + Assertions.assertEquals(4, count); + } - @Test - public void countTest2() { - final long count = Db.of().count("select * from user order by name DESC"); - Assertions.assertEquals(4, count); - } + @Test + public void countTest2() { + final long count = Db.of().count("select * from user order by name DESC"); + Assertions.assertEquals(4, count); + } - @Test - public void findLikeTest() { - // 方式1 - List find = Db.of().find(Entity.of("user").set("name", "like 王%")); - Assertions.assertEquals("王五", find.get(0).get("name")); + @Test + public void findLikeTest() { + // 方式1 + List find = Db.of().find(Entity.of("user").set("name", "like 王%")); + Assertions.assertEquals("王五", find.get(0).get("name")); - // 方式2 - find = Db.of().findLike("user", "name", "王", Condition.LikeType.StartWith); - Assertions.assertEquals("王五", find.get(0).get("name")); + // 方式2 + find = Db.of().findLike("user", "name", "王", Condition.LikeType.StartWith); + Assertions.assertEquals("王五", find.get(0).get("name")); - // 方式3 - find = Db.of().query("select * from user where name like ?", "王%"); - Assertions.assertEquals("王五", find.get(0).get("name")); - } + // 方式3 + find = Db.of().query("select * from user where name like ?", "王%"); + Assertions.assertEquals("王五", find.get(0).get("name")); + } - @Test - public void findByTest() { - final List find = Db.of().findBy("user", - Condition.parse("age", "> 18"), - Condition.parse("age", "< 100") - ); - for (final Entity entity : find) { - LogUtil.debug("{}", entity); - } - Assertions.assertEquals("unitTestUser", find.get(0).get("name")); - } + @Test + public void findByTest() { + final List find = Db.of().findBy("user", + Condition.parse("age", "> 18"), + Condition.parse("age", "< 100") + ); + for (final Entity entity : find) { + LogUtil.debug("{}", entity); + } + Assertions.assertEquals("unitTestUser", find.get(0).get("name")); + } - @Test - @Disabled - public void txTest() throws SQLException { - Db.of().tx(db -> { - db.insert(Entity.of("user").set("name", "unitTestuser2")); - db.update(Entity.of().set("age", 79), Entity.of("user").set("name", "unitTestuser2")); - db.del("user", "name", "unitTestuser2"); - }); - } + @Test + @Disabled + public void txTest() throws SQLException { + Db.of().tx(db -> { + db.insert(Entity.of("user").set("name", "unitTestuser2")); + db.update(Entity.of().set("age", 79), Entity.of("user").set("name", "unitTestuser2")); + db.del("user", "name", "unitTestuser2"); + }); + } - @Test - @Disabled - public void queryFetchTest() { - // https://gitee.com/dromara/hutool/issues/I4JXWN - Db.of().query((conn->{ - final PreparedStatement ps = conn.prepareStatement("select * from table", - ResultSet.TYPE_FORWARD_ONLY, - ResultSet.CONCUR_READ_ONLY); - ps.setFetchSize(Integer.MIN_VALUE); - ps.setFetchDirection(ResultSet.FETCH_FORWARD); - return ps; - }), new EntityListHandler()); - } + @Test + public void batchInsert() throws SQLException { + List es = new ArrayList<>(); + String tableName = "act_ge_property"; + Entity e = buildEntity(tableName); + es.add(e); + Db.of().tx(db -> { + db.insert(es); + List ens = Db.of().find(e); + Assertions.assertEquals(1, ens.size()); + db.del(tableName, "NAME_", "!= null"); + }); + } - @Test - @Disabled - public void findWithDotTest() { - // 当字段带有点时,导致被拆分分别wrap了,因此此时关闭自动包装即可 - Db.of().disableWrapper().find(Entity.of("user").set("a.b", "1")); - } + @Test + public void batchInsertBatch() throws SQLException { + List es = new ArrayList<>(); + String tableName = "act_ge_property"; + Entity e = buildEntity(tableName); + es.add(e); + es.add(buildEntity(tableName)); + es.add(buildEntity(tableName)); + es.add(buildEntity(tableName)); + Db.of().tx(db -> { + db.insert(es); + List ens = Db.of().find(e); + Assertions.assertEquals(1, ens.size()); + db.del(tableName, "NAME_", "!= null"); + }); + + + } + + private Entity buildEntity(String tableName) { + Entity entity = Entity.of("act_ge_property"); + entity.put("NAME_", RandomUtil.randomString(15)); + entity.put("VALUE_", RandomUtil.randomString(50)); + entity.put("REV_", RandomUtil.randomInt()); + return entity; + } + + @Test + @Disabled + public void queryFetchTest() { + // https://gitee.com/dromara/hutool/issues/I4JXWN + Db.of().query((conn -> { + final PreparedStatement ps = conn.prepareStatement("select * from table", + ResultSet.TYPE_FORWARD_ONLY, + ResultSet.CONCUR_READ_ONLY); + ps.setFetchSize(Integer.MIN_VALUE); + ps.setFetchDirection(ResultSet.FETCH_FORWARD); + return ps; + }), new EntityListHandler()); + } + + @Test + @Disabled + public void findWithDotTest() { + // 当字段带有点时,导致被拆分分别wrap了,因此此时关闭自动包装即可 + Db.of().disableWrapper().find(Entity.of("user").set("a.b", "1")); + } } diff --git a/hutool-db/test.db b/hutool-db/test.db index 1a392e4727aea54dc1a2dfdc1c844c60e77d84e2..7495e65c3612d99b821fcf447672885fe4f7e74f 100644 GIT binary patch delta 1757 zcmbtUO|0Wq74{pVSM=UXr>{a3sS(o$G?eVJN`*nJnZ-<{)rvO zPMkz7nb!rPyH-=R6)ZZU>ZS!%({^9PrbtMX6#^mD=>iF{09GtO2;6oyjAq9@y1M6l z_v+Jk&b{~C`uV}FTUTCs^7In`0KR;G9@OhsUp_~l`~-M5`c3oXW8m=QI&k&o$@NFS z*Zf!W`IEmN|KRTB!STM{dFKg|Jh+U@+P(9+tCzNuc=ois2)v8MGFy1da(m$h7v+5M zaP*O`%1|TbY(#Y==Ir5Tj&2;C)x)49ow+zGy-j%ogU+8h{~R4q{TloNg|Yjf${00v z7N(^ac*~<_ZeKt7>HZsaX29jsM~^%~9v&ao?$?fMw@yI(O!eha9f9Ee=)oKw5ca>S zuRXAP?f)12{`1Wjt{pu79(3nhr(b#e5cp<&EvqyvM_y5`Zr{C-Z!|y4<}m;`dG6tM z{Pi#F?&Uv@_9p@$f{jcWmAyhAlCU<+GBi?x^+@DpYYho1obLww0E>}|;P72E*~QT) zV?{XIrDW`(N~(lHa{KpJ!REay*TIH^%Q813kt~%b8E564uA{Cuvx(F%G^IBwV#dzU zgf3u}ZiVtbOvHFInTEI(yDC;dwt#>8_3!MO_YVF5HY^FI7&7ZpR>(`aPB3k!?dmaZ z7zx2a@Ia1WqcyZjB!ghWGd)z*s;HOPVYebgamoefcizsM_kh2GjfxtUJ%3@6jLklR#L)LsXLbfOdU8Y!T#lU|6FsunS(cB z6l;?NK_DdGQnz}aMLMHuC@8oJd%fI+^(leI$%cnp6aJ);gN-Rs7D`I*;$c7M^kLHB z#Qv5uX?O22eU@29qPJb!z7{XKi@?Md)o^EoLs}VI{irPEE(^bwU;7mRe2D}bnyB>J zq9I98W+$5^JvBS1j(5;0KU|ub%i^u^ESi_PY(vnN8ZhX523tyt>8^K!DXyi?>5D&- z0pLnq6dT^hPA*n`L{!?_MdBdKG6)bHnRTFFshl0rRnmKiSX2>|!l5X+PRFF+q z>6UG3&pF0ObNzG{KollngKZfqoq@d!ebj{eL6_-0^_KQ;066#s*uZvd>QSZcJ3c*A zSqiBNV>Qm~+|3uI261@{-g)9&O*z+eqFjn1dA1oDqCX+1`Z>VZ8-IESsi`WkLHKkv z+605WEslHGY(}^t$?|MqsZ0WobYH_M1)JwI)@@^kxpU>gLJRDyfU*fZPE4ESo;?I# zskzRUZrh&C{EMXG=Oz@)3x+UpPRdQ zPpQl<{r*QE->iGar?sv%rrHX=?v;p{+nowwX8yMA1nIhun9Ej3TO1tpFt30KXh|-* z_^iN0pOX00TKMXq&HcLb&u&fiYW;apc{(xMofgXTh^G4}p6XoEg}8#3I-D&yGU`{c zv9dOfVD=zJ+pJP;GfRziib~nW=8Ev65C2$m)%|Hjl2x9hqag9%x-L_X-x3TjcH7&w wfQz!&iupD&!L&{y;sH+C6g|@{N-C>}!%Y$v@E`vq``P=akNxfH%P*b&7s=BtfdBvi delta 100 zcmZo@U}`wPI6+!)9RmXc8xX?)??fGA@pTM(-V=Cv&NHy`s4?*C@~H78@c!nl-7F}u wfqSwV&l<*c6B}1;uH|h~V&vOous~lBs9Q{(k%6H!FS8^hwYVg7^2T_708)Y(4gdfE