核心步骤
在 Java 中通过 JDBC 操作 Oracle 数据库并创建表,主要分为以下几个步骤:

- 添加 JDBC 驱动依赖:确保你的项目中包含了 Oracle JDBC 驱动(JAR 包)。
- 建立数据库连接:使用 JDBC URL、用户名和密码连接到 Oracle 数据库。
- 创建
Statement对象:通过连接对象创建一个Statement,用于执行 SQL 命令。 - 定义并执行
CREATE TABLESQL 语句:编写建表的 SQL 语句,并通过Statement对象执行它。 - 处理结果和关闭资源:检查执行结果,并按照反向顺序关闭所有资源(
Statement、Connection),以防止资源泄漏。
详细示例代码
这是一个完整的、可运行的 Java 类示例,它连接到 Oracle 数据库并创建一个名为 employees 的表。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleCreateTableExample {
// --- 1. 数据库连接信息 (请根据您的环境修改) ---
private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:XE";
// "XE" 是 Oracle Express Edition 的默认 SID,如果你的数据库是其他服务名,请相应修改。
// jdbc:oracle:thin:@localhost:1521:ORCL
private static final String USER = "your_username"; // 替换为你的数据库用户名
private static final String PASS = "your_password"; // 替换为你的数据库密码
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// --- 2. 加载 JDBC 驱动 ---
// 对于较新的 JDBC 驱动 (如 ojdbc8.jar), Class.forName() 可能不是必须的,
// 但为了兼容性,最好还是加上。
Class.forName("oracle.jdbc.driver.OracleDriver");
// --- 3. 建立数据库连接 ---
System.out.println("正在连接到 Oracle 数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
System.out.println("数据库连接成功!");
// --- 4. 创建 Statement 对象 ---
stmt = conn.createStatement();
// --- 5. 定义 CREATE TABLE SQL 语句 ---
// 使用 StringBuilder 来高效地构建 SQL 字符串
String sql = "CREATE TABLE employees (" +
"id NUMBER(10) PRIMARY KEY, " +
"first_name VARCHAR2(50) NOT NULL, " +
"last_name VARCHAR2(50) NOT NULL, " +
"email VARCHAR2(100) UNIQUE, " +
"hire_date DATE NOT NULL, " +
"salary NUMBER(8, 2)" +
")";
System.out.println("正在执行建表 SQL: " + sql);
// --- 6. 执行 SQL 语句 ---
// executeUpdate() 用于执行 CREATE, INSERT, UPDATE, DELETE 等会改变数据库状态的语句
stmt.executeUpdate(sql);
System.out.println("表 'employees' 创建成功!");
} catch (ClassNotFoundException e) {
System.err.println("错误: 找不到 Oracle JDBC 驱动,请检查 ojdbcX.jar 是否在 classpath 中。");
e.printStackTrace();
} catch (SQLException e) {
// 如果表已存在,会抛出 ORA-00955: name is already used 错误
// 我们可以在这里捕获并处理特定错误
if (e.getErrorCode() == 955) {
System.err.println("警告: 表 'employees' 已存在。");
} else {
System.err.println("数据库操作出错: " + e.getMessage());
e.printStackTrace();
}
} finally {
// --- 7. 关闭资源 (非常重要!) ---
// 使用 try-with-resources 是更现代、更安全的方式,但这里为了展示传统的关闭方式。
try {
if (stmt != null) stmt.close();
if (conn != null) conn.close();
System.out.println("数据库连接已关闭。");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
如何运行此代码
-
获取 Oracle JDBC 驱动:
- 你需要从 Oracle 官网下载 JDBC 驱动,通常文件名为
ojdbcX.jar(ojdbc8.jar,ojdbc11.jar)。 - 下载地址: Oracle JDBC Drivers
- 你需要从 Oracle 官网下载 JDBC 驱动,通常文件名为
-
设置环境:
- IDE (如 IntelliJ IDEA 或 Eclipse):
- 将下载的
ojdbcX.jar文件添加到项目的库中,在 IntelliJ 中,你可以右键项目 ->Open Module Settings->Libraries-> ->Java,然后选择 JAR 文件。
- 将下载的
- 命令行:
- 将
ojdbcX.jar和你的 Java 源文件放在同一个目录下。 - 编译:
javac -cp ".;ojdbc8.jar" OracleCreateTableExample.java(Windows) - 运行:
java -cp ".;ojdbc8.jar" OracleCreateTableExample(Windows) - (在 Linux/macOS 上,分号 需要改为冒号 )
- 将
- IDE (如 IntelliJ IDEA 或 Eclipse):
-
修改连接信息:
(图片来源网络,侵删)- 将代码中的
DB_URL,USER,PASS修改为你自己的数据库配置。
- 将代码中的
重要注意事项和最佳实践
使用 try-with-resources (推荐)
Java 7 引入了 try-with-resources 语句,它可以自动关闭实现了 AutoCloseable 接口(如 Connection, Statement)的资源,使代码更简洁、更安全,能有效避免资源泄漏。
重构后的代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class OracleCreateTableWithTryWithResources {
private static final String DB_URL = "jdbc:oracle:thin:@localhost:1521:XE";
private static final String USER = "your_username";
private static final String PASS = "your_password";
public static void main(String[] args) {
// try-with-resources 会自动关闭 conn 和 stmt
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement()) {
System.out.println("数据库连接成功!");
String sql = "CREATE TABLE employees (" +
"id NUMBER(10) PRIMARY KEY, " +
"first_name VARCHAR2(50) NOT NULL, " +
"last_name VARCHAR2(50) NOT NULL, " +
"email VARCHAR2(100) UNIQUE, " +
"hire_date DATE NOT NULL, " +
"salary NUMBER(8, 2)" +
")";
System.out.println("正在执行建表 SQL: " + sql);
stmt.executeUpdate(sql);
System.out.println("表 'employees' 创建成功!");
} catch (ClassNotFoundException e) {
System.err.println("错误: 找不到 Oracle JDBC 驱动。");
e.printStackTrace();
} catch (SQLException e) {
if (e.getErrorCode() == 955) { // ORA-00955
System.err.println("警告: 表 'employees' 已存在。");
} else {
System.err.println("数据库操作出错: " + e.getMessage());
e.printStackTrace();
}
}
// conn 和 stmt 在这里会自动关闭,无需在 finally 中手动关闭
}
}
处理 SQL 异常
- ORA-00955: name is already used: 当尝试创建一个已存在的表时,Oracle 会抛出此错误,代码中已经演示了如何通过
e.getErrorCode()来捕获和处理这个特定错误。 - ORA-01017: invalid username/password: 用户名或密码错误。
- ORA-12541: TNS:no listener: 数据库监听器未启动或端口/主机名配置错误。
使用 PreparedStatement (对于动态 SQL)
如果你的表结构或字段是动态生成的,或者 SQL 语句中包含变量,应该使用 PreparedStatement 而不是 Statement,它可以防止 SQL 注入攻击,并且对于需要重复执行的 SQL 语句,性能更好。
对于像 CREATE TABLE 这样结构固定的 SQL,直接使用 Statement 是简单且合适的。
数据库 URL 格式
thin驱动: 这是最常用的纯 Java 驱动。- 格式:
jdbc:oracle:thin:@<host>:<port>:<service_name> - 示例:
jdbc:oracle:thin:@mydbhost.example.com:1521:ORCLPDB1
- 格式:
oci驱动: 需要安装 Oracle 客户端,性能更好,但不是纯 Java 解决方案。- 格式:
jdbc:oracle:oci8:@<service_name>
- 格式:
请根据你的 Oracle 数据库网络配置选择正确的 URL 格式。XE 版本的默认 SID 是 XE,对于较新的 Oracle 数据库,更推荐使用服务名而不是 SID。
