20260615-达梦数据库JDBC执行SQL操作记录.md 4.1 KB

达梦数据库 JDBC 执行 SQL 操作记录

日期:2026-06-10
数据库:达梦 DM8 (192.168.0.56:5236, schema: ZJRS_JEECG_BOOT)
驱动:项目 Maven 本地仓库中的 DmJdbcDriver18 8.1.3.140


一、背景

项目开发过程中需要直接在达梦数据库上执行建表、插入测试数据等 SQL,但当前机器未安装 disql 客户端。因此利用项目已有的 DmJdbcDriver18 JDBC 驱动,编写简单 Java 程序直连数据库执行 SQL。

二、驱动路径

~/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar

Windows 绝对路径:

C:/Users/bowinuser/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar

三、连接信息

URL:     jdbc:dm://192.168.0.56:5236?schema=ZJRS_JEECG_BOOT&compatibleMode=oracle&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
用户名:  SYSDBA
密码:    Bowin123456

四、编译与执行

4.1 编译

cd "D:\我的文件\JeecgBoot-main"

javac -encoding UTF-8 \
  -cp "C:/Users/bowinuser/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar" \
  .claude/DmRun.java -d .claude/

关键点: 必须加 -encoding UTF-8,否则 Java 源文件中的中文字符会因 Windows 默认 GBK 编码导致编译失败("未映射字符"错误)。

4.2 执行

java -cp ".claude;C:/Users/bowinuser/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar" \
  DmRun

五、核心代码模板

import java.sql.*;

public class DmRun {
    static String url = "jdbc:dm://192.168.0.56:5236?schema=ZJRS_JEECG_BOOT&compatibleMode=oracle&...";
    static String user = "SYSDBA";
    static String pw = "Bowin123456";

    public static void main(String[] args) throws Exception {
        try (Connection c = DriverManager.getConnection(url, user, pw)) {
            c.setAutoCommit(false);
            Statement s = c.createStatement();

            // 执行建表
            s.execute("CREATE TABLE xxx (...)");
            // 执行注释(DM8 特有语法)
            s.execute("COMMENT ON TABLE xxx IS '表说明'");
            s.execute("COMMENT ON COLUMN xxx.col IS '列说明'");
            // 执行索引
            s.execute("CREATE UNIQUE INDEX idx_xxx ON xxx(col)");
            // 插入数据(日期使用 TO_DATE)
            s.execute("INSERT INTO xxx VALUES (..., TO_DATE('2026-06-09','YYYY-MM-DD HH24:MI:SS'), ...)");

            c.commit();
        }
    }
}

六、踩坑记录

问题 原因 解决
ClassNotFoundException: dm.jdbc.driver.DmDriver classpath 中 JAR 路径不对 使用绝对路径 C:/Users/.../DmJdbcDriver18-8.1.3.140.jar
编译报"未映射字符" Java 源文件含中文但 javac 默认用 GBK -encoding UTF-8
从 SQL 文件读取执行时 COMMENT ON 失败 文件编码/语句拆分不准确 直接在 Java 代码中拼接 SQL 字符串执行
CURRENT_TIMESTAMP 等关键字大小写 DM8 Oracle 兼容模式下关键字不区分大小写 直接使用
日期插入 字符串不能直接转为 TIMESTAMP 使用 TO_DATE('2026-06-09 10:00:00','YYYY-MM-DD HH24:MI:SS')

七、验证数据

// DmCheck.java - 检查表是否存在及行数
try (Connection c = DriverManager.getConnection(url, user, pw)) {
    for (String t : new String[]{"ENTERPRISE_STATUS_LOCAL", "PERSONAL_STATUS_LOCAL", ...}) {
        ResultSet rs = c.createStatement().executeQuery("SELECT COUNT(*) FROM " + t);
        rs.next();
        System.out.println(t + ": " + rs.getInt(1) + " rows");
    }
}

八、便捷执行清单

后续如需执行新的 SQL,按以下步骤操作:

# 1. 编写/修改 .claude/DmRun.java
# 2. 编译
cd "D:\我的文件\JeecgBoot-main"
javac -encoding UTF-8 -cp "C:/Users/bowinuser/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar" .claude/DmRun.java -d .claude/

# 3. 执行
java -cp ".claude;C:/Users/bowinuser/.m2/repository/com/dameng/DmJdbcDriver18/8.1.3.140/DmJdbcDriver18-8.1.3.140.jar" DmRun