Java中用JDBC实现简易表结构迁移的核心是“读取源库表结构→生成目标库建表语句→执行语句创建表”,需手动处理类型映射、主键索引、注释、字符集、自增字段及默认值等跨库兼容细节。

Java 中用 JDBC 实现简易表结构迁移,核心是“读取源库表结构 → 生成目标库建表语句 → 执行语句创建表”。不依赖框架,纯 JDBC 可行,但需手动处理字段类型映射、主键/索引/注释等细节。
1. 获取源表元数据(DatabaseMetaData + ResultSetMetaData)
通过 DatabaseMetaData 查表是否存在、列信息、主键;用 ResultSetMetaData 辅助验证(如执行 SELECT * FROM table WHERE 1=0 获取空结果集的列定义):
- 调用
connection.getMetaData().getColumns(null, null, "user", null)获取列名、SQL 类型(DATA_TYPE)、精度(COLUMN_SIZE)、是否为空(NULLABLE)、备注(REMARKS) - 用
getPrimaryKeys(null, null, "user")获取主键列名和顺序 - 注意:不同数据库返回的类型码(如
Types.VARCHAR)一致,但具体字符串表示(如"VARCHAR"还是"TEXT")需按目标库适配
2. 构建跨数据库兼容的建表 SQL
不能直接复用源库 SQL,要根据目标数据库方言转换类型。例如:
- MySQL 的
TINYINT(1)→ PostgreSQL 建议转为BOOLEAN或SMALLINT - Oracle 的
NUMBER(1)→ H2 可转为TINYINT - 统一处理:用
switch (columnType)映射到目标库常用类型,并保留长度/小数位(如VARCHAR(50)、DECIMAL(10,2)) - 主键约束单独拼接:
"PRIMARY KEY (" + String.join(",", pkColumns) + ")"
3. 执行建表并处理异常
使用 Statement 执行 DDL,注意事务与自动提交:
- DDL 在多数 JDBC 驱动中隐式提交,无需手动
commit(),但需关闭自动提交前先备份原连接状态 - 捕获
SQLSyntaxErrorException判断表是否已存在(如 MySQL 报错码 1050,PostgreSQL 是 42P07),可加IF NOT EXISTS(若目标库支持)避免失败 - 建议封装执行方法,带日志输出实际执行的 SQL,便于排查字段类型不支持等问题
4. 简易迁移工具类示例结构
一个实用的轻量级迁移器可包含:
-
SchemaReader:封装元数据查询,返回
TableSchema对象(含列列表、主键、表注释) -
TypeMapper:抽象类或策略接口,实现
mapType(int sqlType, int size, int decimalDigits),子类对应 MySQLMapper、PgMapper -
SqlGenerator:将
TableSchema转为CREATE TABLE字符串 -
Migrator:协调读取、生成、执行三步,提供
migrate(String tableName, Connection srcConn, Connection dstConn)
不复杂但容易忽略的是字符集和排序规则(如 MySQL 的 CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci)、自增字段(AUTO_INCREMENT vs SERIAL)、默认值写法(DEFAULT CURRENT_TIMESTAMP 兼容性差),这些需按目标库文档补充处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











