Skip to content

Commit

Permalink
增加达梦数据库方言
Browse files Browse the repository at this point in the history
  • Loading branch information
looly committed Feb 22, 2024
1 parent 90ff9dc commit 5dd8d51
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 23 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
# 🚀Changelog

-------------------------------------------------------------------------------------------------------------
# 5.8.27(2024-02-19)
# 5.8.27(2024-02-22)

### 🐣新特性
* 【extra 】 FreemarkerEngine修改默认版本参数
* 【db 】 增加达梦数据库方言(pr#1178@Gitee)

### 🐞Bug修复

Expand Down
38 changes: 16 additions & 22 deletions hutool-db/src/main/java/cn/hutool/db/dialect/impl/DmDialect.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,55 +30,49 @@ public String dialectName() {
return DialectName.DM.name();
}

@Override
protected SqlBuilder wrapPageSql(SqlBuilder find, Page page) {
// limit A , B 表示:A就是查询的起点位置,B就是你需要多少行。
return find.append(" limit ").append(page.getStartPosition()).append(" , ").append(page.getPageSize());
}

@Override
public PreparedStatement psForUpsert(Connection conn, Entity entity, String... keys) throws SQLException {
Assert.notEmpty(keys, "Keys must be not empty for DM MERGE SQL.");
SqlBuilder.validateEntity(entity);
final SqlBuilder builder = SqlBuilder.create(wrapper);
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();
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 ");
if (keyFieldsPart.length() > 0) {
keyFieldsPart.append(" and ");
}
keyfieldsPart.append(field + "= ?");
keyFieldsPart.append(field + "= ?");
builder.addParams(value);
}
});

entity.forEach((field, value) -> {
if (StrUtil.isNotBlank(field) && !keyList.contains(field)) {
if (updatefieldsPart.length() > 0) {
if (updateFieldsPart.length() > 0) {
// 非第一个参数,追加逗号
updatefieldsPart.append(", ");
updateFieldsPart.append(", ");
}
updatefieldsPart.append(field + "= ?");
updateFieldsPart.append(field).append("= ?");
builder.addParams(value);
}
});

entity.forEach((field, value) -> {
if (StrUtil.isNotBlank(field)) {
if (insertfieldsPart.length() > 0) {
if (insertFieldsPart.length() > 0) {
// 非第一个参数,追加逗号
insertfieldsPart.append(", ");
insertplaceHolder.append(", ");
insertFieldsPart.append(", ");
insertPlaceHolder.append(", ");
}
insertfieldsPart.append((null != wrapper) ? wrapper.wrap(field) : field);
insertplaceHolder.append("?");
insertFieldsPart.append((null != wrapper) ? wrapper.wrap(field) : field);
insertPlaceHolder.append("?");
builder.addParams(value);
}
});
Expand All @@ -88,7 +82,7 @@ public PreparedStatement psForUpsert(Connection conn, Entity entity, String... k
tableName = this.wrapper.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(")");
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(conn, builder);
}
Expand Down
2 changes: 2 additions & 0 deletions hutool-db/src/test/java/cn/hutool/db/DmTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import java.sql.SQLException;
Expand All @@ -27,6 +28,7 @@ public static void init() throws SQLException {
}

@Test
@Ignore
public void upsertTest() throws SQLException {
Db db = Db.use(DS_GROUP_NAME);
db.upsert(Entity.create("test").set("a", 1).set("b", 111), "a");
Expand Down

0 comments on commit 5dd8d51

Please sign in to comment.