diff --git a/CHANGELOG.md b/CHANGELOG.md index 39bdff81f..d9680b464 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【core 】 IterUtil增加getFirstNonNull方法 * 【core 】 NumberUtil判空改为isBlank(issue#1664@Github) * 【jwt 】 增加JWTValidator、RegisteredPayload +* 【db 】 增加Phoenix方言(issue#1656@Github) ### 🐞Bug修复 * 【db 】 修复Oracle下别名错误造成的SQL语法啊错误(issue#I3VTQW@Gitee) diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java index 115ac68cf..5f6e76194 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java @@ -7,6 +7,7 @@ import cn.hutool.db.dialect.impl.AnsiSqlDialect; import cn.hutool.db.dialect.impl.H2Dialect; import cn.hutool.db.dialect.impl.MysqlDialect; import cn.hutool.db.dialect.impl.OracleDialect; +import cn.hutool.db.dialect.impl.PhoenixDialect; import cn.hutool.db.dialect.impl.PostgresqlDialect; import cn.hutool.db.dialect.impl.SqlServer2012Dialect; import cn.hutool.db.dialect.impl.Sqlite3Dialect; @@ -64,6 +65,8 @@ public class DialectFactory implements DriverNamePool{ return new H2Dialect(); } else if (DRIVER_SQLSERVER.equalsIgnoreCase(driverName)) { return new SqlServer2012Dialect(); + } else if (DRIVER_PHOENIX.equalsIgnoreCase(driverName)) { + return new PhoenixDialect(); } } // 无法识别可支持的数据库类型默认使用ANSI方言,可兼容大部分SQL语句 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java index c7a605597..8e3d978b9 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectName.java @@ -1,12 +1,24 @@ package cn.hutool.db.dialect; +import cn.hutool.core.util.StrUtil; + /** * 方言名
* 方言枚举列出了Hutool支持的所有数据库方言 * * @author Looly - * */ public enum DialectName { - ANSI, MYSQL, ORACLE, POSTGREESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012 + ANSI, MYSQL, ORACLE, POSTGREESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX; + + /** + * 是否为指定数据库方言,检查时不分区大小写 + * + * @param dialectName 方言名 + * @return 是否时Oracle数据库 + * @since 5.7.2 + */ + public boolean match(String dialectName) { + return StrUtil.equalsIgnoreCase(dialectName, name()); + } } diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PhoenixDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PhoenixDialect.java new file mode 100644 index 000000000..c2ad5bdd5 --- /dev/null +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PhoenixDialect.java @@ -0,0 +1,34 @@ +package cn.hutool.db.dialect.impl; + +import cn.hutool.db.Entity; +import cn.hutool.db.dialect.DialectName; +import cn.hutool.db.sql.Query; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * Phoenix数据库方言 + * + * @author loolly + * @since 5.7.2 + */ +public class PhoenixDialect extends AnsiSqlDialect { + private static final long serialVersionUID = 1L; + + public PhoenixDialect() { +// wrapper = new Wrapper('"'); + } + + @Override + public PreparedStatement psForUpdate(Connection conn, Entity entity, Query query) throws SQLException { + // Phoenix的插入、更新语句是统一的,统一使用upsert into关键字 + return super.psForInsert(conn, entity); + } + + @Override + public String dialectName() { + return DialectName.PHOENIX.name(); + } +} diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java index 1191435bf..95d15ed8a 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java @@ -151,7 +151,7 @@ public class SqlBuilder implements Builder { entity.setTableName(wrapper.wrap(entity.getTableName())); } - final boolean isOracle = StrUtil.equalsAnyIgnoreCase(dialectName, DialectName.ORACLE.name());// 对Oracle的特殊处理 + final boolean isOracle = DialectName.ORACLE.match(dialectName);// 对Oracle的特殊处理 final StringBuilder fieldsPart = new StringBuilder(); final StringBuilder placeHolder = new StringBuilder(); @@ -181,8 +181,16 @@ public class SqlBuilder implements Builder { } } } - sql.append("INSERT INTO ")// - .append(entity.getTableName()).append(" (").append(fieldsPart).append(") VALUES (")// + + // issue#1656@Github Phoenix兼容 + if (DialectName.PHOENIX.match(dialectName)) { + sql.append("UPSERT INTO "); + } else { + sql.append("INSERT INTO "); + } + + sql.append(entity.getTableName()) + .append(" (").append(fieldsPart).append(") VALUES (")// .append(placeHolder).append(")"); return this;