以 Windows 10 操作系統(tǒng)為例
場景介紹
- 簡單來說爆哑,12c 以上版本一個 CDB 容器對應多個 PDB 數(shù)據(jù)庫服務
- JDBC 實際上操作的是 CDB 容器中的某個 PDB 服務
- 因此 JDBC 連接 12c 的方式和 11g 也略有不同
- 想了解更多 CDB 和 PDB 的知識可自行查閱
- 本文主要講述如何用 JDBC 連接并操作 12c 以上版本的 Oracle 數(shù)據(jù)庫
一、獲取 PDB 容器名稱和服務名稱
- (1) 在 PowerShell 或者 cmd 中以超級管理員的身份進入 CDB 容器
sqlplus / as sysdba
- 如果連接成功,顯示結(jié)果如下
- 接下來的操作都在
SQL>
命令行進行
PS C:\> sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
連接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
- (2) 查看 PDB 容器名稱
select name from v$pdbs;
- PDB 容器名稱為
ORCLPDB
SQL> select name from v$pdbs;
NAME
--------------------------------------------------------------------------------
PDB$SEED
ORCLPDB
- (3) 查看 PDB 服務名稱
select name, pdb from v$services;
- 可以看到步驟 (3) 獲得的
ORCLPDB
容器對應的服務名稱是orclpdb
SQL> select name, pdb from v$services;
NAME
--------------------------------------------------------------------------------
PDB
--------------------------------------------------------------------------------
SYS$USERS
CDB$ROOT
orclpdb
ORCLPDB
二扫步、配置服務器連接信息
- 修改 tnsname.ora 文件
- 文件路徑
$Oracle_home\network\admin\tnsname.ora
- 其中開頭的
ORCLPDB
就是步驟 一、(2) 獲取的 PDB 容器名稱 -
SERVICE_NAME = orclpdb
中的orclpdb
就是步驟 一匈子、(3) 獲取的 PDB 服務名稱
- 文件路徑
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb)
)
)
三河胎、創(chuàng)建 scott 用戶
- (1) 將會話從 CDB 容器轉(zhuǎn)到配置好的 PCB 容器
alter session set container = ORCLPDB;
- PDB 名稱 ORCLPDB 是從步驟 一、(2) 中獲取的
SQL> alter session set container = ORCLPDB;
會話已更改
- (2) 使用 sys 用戶旬牲,以超級管理員的身份連接到 PCB 數(shù)據(jù)庫
conn sys/change_on_install@orclpdb as sysdba
- 其中 sys 的密碼如果沒有設置過仿粹,默認是
change_on_install
SQL> conn sys/change_on_install@orclpdb as sysdba;
已連接搁吓。
- (3) 創(chuàng)建 scott 用戶
create user scott identified by tiger;
- 其中 scott 和 tiger 分別是用戶名和密碼
SQL> create user scott identified by tiger;
用戶已創(chuàng)建原茅。
- (4) 為 scott 用戶授權(quán)
-
grant connect,resource to scott;
- 擁有 connect 權(quán)限的用戶可以登錄Oracle
- 擁有 resource 權(quán)限的用戶可以創(chuàng)建實體
-
grant unlimited tablespace to scott;
- 分配表空間配額,在配額使用范圍內(nèi)創(chuàng)建表
-
SQL> grant connect,resource to scott;
授權(quán)成功堕仔。
SQL> grant unlimited tablespace to scott;
授權(quán)成功擂橘。
- (5) 使用 scott 用戶連接 PDB 數(shù)據(jù)庫
conn scott/tiger@orclpdb
SQL> conn scott/tiger@orclpdb;
已連接。
四摩骨、使用 JDBC 操作 PDB 數(shù)據(jù)庫里的表
- (1) 在 scott 用戶下通贞,新建一張表用于測試
create table student(id number, name varchar2(20));
SQL> create table student(id number, name varchar2(20));
表已創(chuàng)建朗若。
- (2) 用 JDBC 程序操作新建的表
- 根據(jù) Oracle 和 JDK 版本,下載對應的 ojdbc.jar
- 本例中使用的版本是 Oracle 19c(19.3)昌罩,JDK1.8
- 對應的 ojdbc 版本 ojdbc8.jar
- 下載地址
- 詳細代碼和注釋如下
import java.sql.*;
/**
* 測試 JDBC 連接 Oracle 數(shù)據(jù)庫
*
* 版本信息:
* JDK1.8
* Oracle 19c(19.3)
* ojdbc8.jar
*
* @author admin
*/
public class TestJDBC {
public static void main(String[] args) {
try {
// 反射方式加載數(shù)據(jù)庫驅(qū)動
Class.forName("oracle.jdbc.OracleDriver");
// 數(shù)據(jù)庫連接 url
// 注意:連接 CDB 時哭懈,端口號 1521 后是冒號 ":",如 xxx:1521:ORCL
// 連接 PDB 時茎用,端口號 1521 后是斜杠 "/"遣总,如 xxx:1521/ORCLPDB
String url = "jdbc:oracle:thin:@127.0.0.1:1521/ORCLPDB";
// 用戶名和密碼
String userName = "scott";
String password = "tiger";
// 創(chuàng)建連接
Connection connection = DriverManager.getConnection(url, userName, password);
// 創(chuàng)建 Statement 對象
Statement statement = connection.createStatement();
// 編寫插入 sql 語句
String sql = "insert into student values(1, 'Tom')";
// 執(zhí)行插入語句并獲取結(jié)果
int count = statement.executeUpdate(sql);
// 執(zhí)行正確后的打印結(jié)果
// 插入條數(shù): 1
System.out.println("插入條數(shù): " + count);
// 編寫查詢 sql 語句
sql = "select * from student where id=1";
// 執(zhí)行查詢語句并獲取結(jié)果
ResultSet resultSet = statement.executeQuery(sql);
// 遍歷并打印查詢結(jié)果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
// 執(zhí)行正確后的打印結(jié)果
// id=1, name=Tom
System.out.println("id=" + id + ", name=" + name);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
常見錯誤
- (1)
java.sql.SQLException: ORA-01017: 用戶名/口令無效; 登錄被拒絕
- 確認連接地址 url 中,端口號 1521 后是 PDB 地址轨功,不是 CDB 地址
- 如果連接到 CDB旭斥,CDB 中沒有創(chuàng)建相關的用戶,自然會提示用戶名/口令無效
- (2)
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
- 檢查連接地址 url 中古涧,端口號 1521 后是斜杠+PDB 地址
xx1521/ORCLPDB
垂券,不是冒號 - 如果是冒號,會根據(jù) PDB 的服務名稱羡滑,去 CDB 中查找同名的容器菇爪,因此報找不到 SID 錯誤
- 檢查連接地址 url 中古涧,端口號 1521 后是斜杠+PDB 地址
- (3)
No suitable driver found for jdbc:oracle:thin:@xxx.x.x.x:1521/xxxx
- 原因1:數(shù)據(jù)庫驅(qū)動版本不對,請檢查 Oracle 安裝版本柒昏、JDK 版本和 ojdbc.jar 是否匹配
- 原因2:url 連接書寫錯誤娄帖,如
jdbc:oracle:thin:@xxx.x.x.x:1521/xxxx
中寫錯了符號等,也會出現(xiàn)這個錯誤
參考資料
- Oracle12c中scott用戶的創(chuàng)建方法
- Oracle 12c JDBC方式連接PDB數(shù)據(jù)庫
- 解析grant connect, resource to user語句
- JDBC 原理及使用 Statement 訪問數(shù)據(jù)庫
- DT 課堂顏群的《JavaWeb視頻教程》第 13 課
- https://www.bilibili.com/video/BV18s411u7EH?p=13