mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-24 18:04:54 +08:00
add dm dialect
This commit is contained in:
parent
ae6054547a
commit
6cd11eeb9a
@ -141,6 +141,12 @@
|
||||
<version>2.2.224</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.dameng</groupId>
|
||||
<artifactId>DmJdbcDriver18</artifactId>
|
||||
<version>8.1.3.62</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
|
@ -72,6 +72,8 @@ public class DialectFactory implements DriverNamePool {
|
||||
return new SqlServer2012Dialect(dbConfig);
|
||||
} else if (DRIVER_PHOENIX.equalsIgnoreCase(driverName)) {
|
||||
return new PhoenixDialect(dbConfig);
|
||||
} else if (DRIVER_DM.equalsIgnoreCase(driverName)) {
|
||||
return new DmDialect(dbConfig);
|
||||
}
|
||||
}
|
||||
// 无法识别可支持的数据库类型默认使用ANSI方言,可兼容大部分SQL语句
|
||||
|
@ -21,7 +21,7 @@ import org.dromara.hutool.core.text.StrUtil;
|
||||
* @author Looly
|
||||
*/
|
||||
public enum DialectName {
|
||||
ANSI, MYSQL, ORACLE, POSTGRESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX;
|
||||
ANSI, MYSQL, ORACLE, POSTGRESQL, SQLITE3, H2, SQLSERVER, SQLSERVER2012, PHOENIX, DM;
|
||||
|
||||
/**
|
||||
* 是否为指定数据库方言,检查时不分区大小写
|
||||
|
@ -73,9 +73,9 @@ public interface DriverNamePool {
|
||||
*/
|
||||
String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver";
|
||||
/**
|
||||
* JDBC 驱动 达梦7
|
||||
* JDBC 驱动 达梦
|
||||
*/
|
||||
String DRIVER_DM7 = "dm.jdbc.driver.DmDriver";
|
||||
String DRIVER_DM = "dm.jdbc.driver.DmDriver";
|
||||
/**
|
||||
* JDBC 驱动 人大金仓
|
||||
*/
|
||||
|
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2024. looly(loolly@aliyun.com)
|
||||
* Hutool is licensed under Mulan PSL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||
* You may obtain a copy of Mulan PSL v2 at:
|
||||
* https://license.coscl.org.cn/MulanPSL2
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PSL v2 for more details.
|
||||
*/
|
||||
|
||||
package org.dromara.hutool.db.dialect.impl;
|
||||
|
||||
import org.dromara.hutool.core.lang.Assert;
|
||||
import org.dromara.hutool.core.text.StrUtil;
|
||||
import org.dromara.hutool.db.Entity;
|
||||
import org.dromara.hutool.db.config.DbConfig;
|
||||
import org.dromara.hutool.db.dialect.DialectName;
|
||||
import org.dromara.hutool.db.sql.QuoteWrapper;
|
||||
import org.dromara.hutool.db.sql.SqlBuilder;
|
||||
import org.dromara.hutool.db.sql.StatementUtil;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 达梦数据库方言
|
||||
*
|
||||
* @author wb04307201
|
||||
*/
|
||||
public class DmDialect extends AnsiSqlDialect {
|
||||
private static final long serialVersionUID = 3415348435502927423L;
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param dbConfig 数据库配置
|
||||
*/
|
||||
public DmDialect(final DbConfig dbConfig) {
|
||||
super(dbConfig);
|
||||
quoteWrapper = new QuoteWrapper('\'');
|
||||
}
|
||||
|
||||
@Override
|
||||
public String dialectName() {
|
||||
return DialectName.DM.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PreparedStatement psForUpsert(final Connection conn, final Entity entity, final String... keys) {
|
||||
Assert.notEmpty(keys, "Keys must be not empty for DM MERGE SQL.");
|
||||
SqlBuilder.validateEntity(entity);
|
||||
final SqlBuilder builder = SqlBuilder.of(quoteWrapper);
|
||||
final List<String> keyList = Arrays.asList(keys);
|
||||
|
||||
final StringBuilder keyFieldsPart = new StringBuilder();
|
||||
final StringBuilder updateFieldsPart = new StringBuilder();
|
||||
final StringBuilder insertFieldsPart = new StringBuilder();
|
||||
final StringBuilder insertPlaceHolder = new StringBuilder();
|
||||
|
||||
// 构建字段部分和参数占位符部分
|
||||
entity.forEach((field, value) -> {
|
||||
if (StrUtil.isNotBlank(field) && keyList.contains(field)) {
|
||||
if (keyFieldsPart.length() > 0) {
|
||||
keyFieldsPart.append(" and ");
|
||||
}
|
||||
keyFieldsPart.append(field).append("= ?");
|
||||
builder.addParams(value);
|
||||
}
|
||||
});
|
||||
|
||||
entity.forEach((field, value) -> {
|
||||
if (StrUtil.isNotBlank(field) && !keyList.contains(field)) {
|
||||
if (updateFieldsPart.length() > 0) {
|
||||
// 非第一个参数,追加逗号
|
||||
updateFieldsPart.append(", ");
|
||||
}
|
||||
updateFieldsPart.append(field).append("= ?");
|
||||
builder.addParams(value);
|
||||
}
|
||||
});
|
||||
|
||||
entity.forEach((field, value) -> {
|
||||
if (StrUtil.isNotBlank(field)) {
|
||||
if (insertFieldsPart.length() > 0) {
|
||||
// 非第一个参数,追加逗号
|
||||
insertFieldsPart.append(", ");
|
||||
insertPlaceHolder.append(", ");
|
||||
}
|
||||
insertFieldsPart.append((null != quoteWrapper) ? quoteWrapper.wrap(field) : field);
|
||||
insertPlaceHolder.append("?");
|
||||
builder.addParams(value);
|
||||
}
|
||||
});
|
||||
|
||||
String tableName = entity.getTableName();
|
||||
if (null != this.quoteWrapper) {
|
||||
tableName = this.quoteWrapper.wrap(tableName);
|
||||
}
|
||||
|
||||
builder.append("MERGE INTO ").append(tableName).append(" USING DUAL ON ").append(keyFieldsPart).append(" WHEN MATCHED THEN UPDATE SET ").append(updateFieldsPart).append(" WHEN NOT MATCHED THEN INSERT (").append(insertFieldsPart).append(") VALUES (").append(insertPlaceHolder).append(")");
|
||||
|
||||
return StatementUtil.prepareStatement(false, dbConfig, conn, builder.build(), builder.getParamValueArray());
|
||||
}
|
||||
}
|
37
hutool-db/src/test/java/org/dromara/hutool/db/DmTest.java
Normal file
37
hutool-db/src/test/java/org/dromara/hutool/db/DmTest.java
Normal file
@ -0,0 +1,37 @@
|
||||
package org.dromara.hutool.db;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* 达梦数据库单元测试
|
||||
*
|
||||
* @author wb04307201
|
||||
*/
|
||||
public class DmTest {
|
||||
|
||||
private static final String DS_GROUP_NAME = "dm";
|
||||
|
||||
@BeforeAll
|
||||
@Disabled
|
||||
public static void init() {
|
||||
final Db db = Db.of(DS_GROUP_NAME);
|
||||
db.execute("CREATE TABLE test(a INTEGER, b INTEGER)");
|
||||
|
||||
db.insert(Entity.of("test").set("a", 1).set("b", 11));
|
||||
db.insert(Entity.of("test").set("a", 2).set("b", 21));
|
||||
db.insert(Entity.of("test").set("a", 3).set("b", 31));
|
||||
db.insert(Entity.of("test").set("a", 4).set("b", 41));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Disabled
|
||||
public void upsertTest() {
|
||||
final Db db = Db.of(DS_GROUP_NAME);
|
||||
db.upsert(Entity.of("test").set("a", 1).set("b", 111), "a");
|
||||
final Entity a1 = db.get("test", "a", 1);
|
||||
Assertions.assertEquals(Long.valueOf(111), a1.getLong("b"));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user