Oracle 学习笔记
Oracle 学习笔记
1. 简介
甲骨文公司
甲骨文(Oracle)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部在美国加利福尼亚州的红木滩。1989 年正式进入进入中国市场。2013 年,甲骨文已超越IDM,成为继 Microsoft 后成为全球第二大软件公司。
Oracle Database
我们这里所学习的 Oracle 并不是 Oracle 公司,而是 Oracle 公司旗下的产品 Oracle Database 。
Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系型数据库管理系统,它是数据库领域一直是领先地位的产品。可以说 Oracle 数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好,使用方便,功能强,适用于各类大,中,小。微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
2. 安装
-
安装前准备
确定自己的 windows 版本,windows 家庭版无法安装 Oracle 企业版
我的电脑 --> 右键 --> 属性 查看电脑的 windows 版本
如果是家庭版,可以去官网购买升级到专业版,或者是去某宝去买升级的序列号,某宝会比较便宜,当然,最好支持正版!
官网下载安装包(下载时间可能比较长,因为安装包比较大)
https://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_1of2.zip
https://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_2of2.zip下载好后将这两个压缩包加压放在同一个文件夹内
-
安装 Oracle
双击运行 setup.exe 安装程序
注:安装的过程中,可能会看到不同的警告,都点击 “是” 继续安装即可
不需要勾选填写任何东西,直接 下一步
连续两个都是默认选择,直接点击下一步
配置数据库安装目录、版本、字符集以及管理口令(注:安装目录不要有中文)
点击完成
然后就开始安装
点击确定即可
安装完成后在开始菜单查看
win键+R,输入 services.msc 打开服务列表,会看到安装了 Oracle 11g 后,共有7个服务,我们主要打开 OracleOraDb11g_home1TNSListener 和 OracleServiceORCL 两个服务,其他都是非必须启动项
-
服务介绍
-
Oracle ORCL VSS Writer Service: Oracle 卷映射 拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy)。它 可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统的系统性能。(非必须启动)
-
OracleDBConsoleorcl:Oracle 数据库控制台服务,orcl 是 Oracle 数据库的实例表示,默认的实例为 orcl。在运行 Enterprise Manager(企业管理器OEM)的时候,页面管理 oracle 数据库的时候,需要启动这个服务。(非必须启动项)
-
OracleJobSchedulerORCL:Oracle 作业调度(定时器 )服务,ORCL 是 Oracle 实例标识。(非必须启动项)
-
OracleMTSRecoveryService:服务端控制。该服务允许数据库充当一个微软事务服务器 MTS、COM/COM+对象和分布式环境下的事务的资源管理器。(非必须启动项)
-
OracleOraDb11g_home1ClrAgent:Oracle 数据库 .NET 扩展服务的一部分。(非必须启动项)
-
OracleOraDb11g_home1TNSListener:监听器服务,服务只有在数据库需要远程访问的时候才需要。需要客户端连接数据库的时候必须启动。(必须启动)
-
OracleServiceORCL:数据库服务(数据库实例),是 Oracle 核心服务。该服务是数据库启动的基础,只有该服务启动,Oracle 数据库才能正常启动。(必须启动)
那么在开发的时候到底需要启动哪些服务呢?
对新手来说,要是只用 Oracle 自带的 sqlplus 的话,只要启动 OracleServiceORCL 即可,要是使用 PL/SQL Developer 等第三方工具的话,OracleOraDb11g_home1TNSListener 服务也要开启。IracleDBConsoleorcl 是进入基于 web 的 EM 必须开启的,其余服务很少用。
注:ORCL 是数据库实例名,默认的数据库是 ORCL,你可以创建其他的,即 OracleService+数据库名
-
3. 连接 Oracle 数据库
3.1 使用 sqlplus
sqlplus 是 oracle 自带的操作数据库的工具。
\oracle\product\11.2.0\dbhome_1\BIN
输入 D:\Code\tool\other\oracle\product\11.2.0\dbhome_1\BIN 进入该目录的 dos 窗口
-
只连接,不登录
sqlplus/nolog
-
使用 sys 账户登录
sys/system 一般都是管理身份,用于管理 oracle 数据
conn sys/root@orcl as sysdba;
查看当前用户
show user
-
scott 账户登录
默认 sys,system 都是没有加锁,可以直接登录修改 orcl 数据
scott 普通用户,一般都是开发学习使用此账户,但是默认 scott 账户时加锁的,需要使用 sys 登录进行解锁操作!
我们要使用普通用户学习,就需要进行解锁
解锁命令如下:
alter user scott account unlock # 解锁
alter user scott account lock # 加锁重置 scott 密码
alter user scott identified by 密码
3.2 客户端连接 Oracle
Plsql 和 Sqldeveloper 是两款 Oracle 的可视化软件
-
plsql 工具
官网链接:https://www.allroundautomations.com/products/pl-sql-developer/
下载安装好后填写账号密码
连接后界面如下图:
-
sql developer
下载链接:https://www.oracle.com/tools/downloads/sqldev-v192-downloads.html
是用 Java 编写的一个图形界面链接 oracle 的工具,需要安装 jdk 环境,是免费的
3.3 scott 账户下表认识
登录 scott 账户后,查看他所拥有的表
scott 账户拥有 BONUS,DEPT,EMP,SALGRADE 4 张表
Emp 雇员表
字段名 | 字段表示 |
---|---|
Empno | 雇员工号 |
Ename | 雇员名字 |
Job | 工作。(秘书、销售、经历、分析员、保管) |
Mgr(Manager) | 经理的工号 |
Hiredate | 雇佣日期 |
Sal(Salary) | 工资 |
Deptno | 所属部门号 |
Dept 部门表
字段名 | 字段表示 |
---|---|
Deptno | 部门号 |
Dname | 部门名字 |
Loc | 地址 |
Salgrade 一个公司是有等级制度,用此表表示一个工资的等级
字段名 | 字段表示 |
---|---|
Grade | 等级 |
losal | 最低工资 |
hisal | 最高工资 |
Bonus 奖金表,表示一个雇员的工资及奖金
字段名 | 字段表示 |
---|---|
Ename | 雇员名字 |
job | 工作 |
sal | 工资 |
comm | 津贴 |
4. Oracle 数据库重要概念
完整的 Oracle 数据库通常由两部分组成:Oracle 数据库和数据库实例。
- 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)
- Oracle 数据库实例则是一组 Oracle 后台进程/线程以及在服务器分配的共享内存区(Oracle官方文档中给出的概念)
在启动 Orcale 数据库服务时,实际上是在服务器的内存中创建一个 Oracle 实例(即在服务器内存中 分配共享内存并创建相关的后台内存)。然后由这个 Oracle 数据库实例来访问和控制磁盘中的数据文件。 Oracle 有一个很大的内容块,称为全局区(SGA)
4.1 重要概念
-
数据库:Oracle 数据库是数据的物理存储,这就包括:数据文件ORA或者BDF、控制文件、联机日志、参数文件。其实 Oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作 Oracle 就只有一个大数据库。
-
全局数据库名:就是一个数据库的标识,在安装时就要想好了,以后一般不修改,修改起来也麻烦,因为数据库一旦安装,数据库名就写进了控制文件,数据库表,很多地方都会用到这个数据库名
-
全局数据库:一般只有一个全局数据库
-
实例:一个 Oracle实例 (Oracle Instance)有一些的后台进程(Background Processes)和内存结构(Memory Structures)组成。一个数据库可以有n个实例
-
用户:用户是在实例下建立的。不同实例可以建相同名字的用户。
-
表空间:表空间是 Oracle 对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射,一个数据库在逻辑上背分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system标空间)。每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间
-
数据文件(dbf、ora):数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。
可能会觉得有点乱了,那么这一张图就可以理清楚了
一个MySQL数据库由若干个实例构成,实例又由若干个用户,表空间等构成,表空间中使用数据文件(dbf、ora)进行存储。MySQL中允许有多个数据库,只有一个账号,Oracle 全局数据库只有一个,由若干个实例够成,有若干个账号。
4.2 Oracle 表空间创建
-
创建表空间
-- 创建表空间 create tablespace first_test -- 逻辑名 datafile 'D:\Code\tool\other\oracle\tablespace\first_test.DBF' -- 物理文件路径 size 10m autoextend on; -- size 表示初始容量,可以自动扩展容量
-
创建用户
-- 创建用户 create user xp_test identified by root -- 创建新的账号密码 default tablespace first_test; -- 指定当前账号使用的表空间
-
授权 包括权限和角色,角色是权限的集合
-- 授权 -- 查看权限和角色 select * from role_sys_privs where role = 'RESOURCE'; select * from role_sys_privs where role = 'CONNECT'; -- 授权 xp_test 账号 grant resource,connect to xp_test;
5. Oracle 中数据类型及SQL语法
5.1 Oracle 中数据库字段类型
-
数值类型:number(n,m) (n:长度,m:精度,若没有精度则为整数)
-
字符型:
- char(固定长度)
- varchar(可变长度) varchar2(10) 表示存储10个字母,5个汉字
- nvarchar(双字节存储) nvarchar(10) 表示存储10个字母,10个汉字
- varchar2 (可变长度)把空格视为 null,比如 varchar2(10) -->'abc '为3个长度,varchar(10) -->'abc '为5个长度
- nvarchar2 (可变长度)
-
日期类型
-
date yyyy-mm-dd
-
datetime yyyy-mm-dd hh:mi:ss
-
timestamp yyyy-mm-dd hh:mi:ss.ssssss
-
-
大对象
- Lob 最大可以存储4G
- BLob Binary 存储二进制数据
- CLob Char 存储大文本 text
5.2 SQL 语法
建表语句
和 MySQL 差不多,但在建表时无法设置自增(generated as identity 可以在建表时实现自增,但并没有怎么使用过,网上大部分博客都是使用触发器实现主键自增)
-- 创建item表
create table item(
item_id number(2) primary key,
item_name nvarchar2(50) not null,
item_desc nvarchar2(150) not null,
createtime date not null
)
-- 查看是否成功创建
select * from item;
查看当前时间
在 MySQL 中查看当前时间使用 now(),但 Oracle 中并没有这个函数,而是使用 sysdate 查看当前时间
-- 查看当前时间
-- sysdate 相当于mysql 的 now()
-- dual : 伪表
-- 在 MySQL 中允许 select now();来查看当前时间,但是 Oracle 并不支持 select sysdate;来查看当前时间,并且 select 必须跟着 from,而 Oracle 中提供了伪表来让我们凑齐语法
select sysdate from dual;
插入数据
注:在 Oracle 中,增删改语句需要手动commit才能真正执行该操作!!!
-- 插入数据
insert into item values(1,'小米手机10','米ui牛逼',sysdate);
-- 提交修改操作
commit;
序列
-- 创建序列,默认以1开始,然后以1递增
create sequence seq_01;
-- nextval : 如果序列没有初始化,则进行初始化,并附上初始值,否则执行 +1 操作
-- 如果没有先使用 nextval 进行初始化,使用curral 查看当前序列的值会报错
select seq_01.nextval from dual;
-- 查看当前序列的值
select seq_01.currval from dual;
-- start with x x为序列初始的值
-- increment by x x为序列递增的值
create sequence seq_02
start with 2
increment by 1
-- 删除序列
drop sequence seq_01;
主键自增
手动自增
-- 创建主键自增的序列
create sequence seq_item_id;
-- 手动使用序列的 nextval
insert into item(item_id,item_name,item_desc,createtime) values(seq_item_id.nextval,'小米10手机','MI-UI牛逼',sysdate);
commit;
select into
select into 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档。
select 修改后的数据 into 表中被修改值的字段或变量名 from 表
-- 从数据库中查询出值后赋值给 v_num 变量
declare
v_num integer;
begin
-- v_num:= 10;
select item_id into v_num from item where item_id = 1;
dbms_output.put_line(v_num);
end;
使用触发器自增
create or replace trigger item_pk_item_id -- 创建触发器 item_pk_item_id
before insert on item -- 触发条件,在执行插入操作时触发该触发器
for each row -- 对每一行都检测是否触发
begin -- 触发器开始
select seq_item_id.nextval into :new.item_id from dual; -- 触发器主体内容,这里是将序列seq_item_id增加后的值替换 item_id
end; -- 触发器结束
-- 插入数据触发器
insert into item(item_name,item_desc,createtime) values ('小米10手机','MI-UI牛逼',sysdate);
-- 查询是否成功触发触发器
select * from item;
常用函数
to_date
to_date 第二个参数为字符串的格式
Year:
yy two digits 两位年 显示值:07
yyy three digits 三位年 显示值:007
yyyy four digits 四位年 显示值:2007
Month:
mm number 两位月 显示值:11
mon abbreviated 字符集表示 显示值:11月,若是英文版,显示nov
month spelled out 字符集表示 显示值:11月,若是英文版,显示november
Day:
dd number 当月第几天 显示值:02
ddd number 当年第几天 显示值:02
dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示fri
day spelled out 当周第几天全写 显示值:星期五,若是英文版,显示friday
ddspth spelled out, ordinal twelfth
Hour:
hh two digits 12小时进制 显示值:01
hh24 two digits 24小时进制 显示值:13
Minute:
mi two digits 60进制 显示值:45
Second:
ss two digits 60进制 显示值:25
其它
Q digit 季度 显示值:4
WW digit 当年第几周 显示值:44
W digit 当月第几周 显示值:1
-- 将字符串转换成日期格式
select to_date('2020-09-09','yyyy-mm-dd') from dual;
to_char
这篇博客已经讲得很全面了:https://www.cnblogs.com/aipan/p/7941917.html
-- to_char 将任意类型转换成字符串
-- 若是时间格式,可以指定转成字符串后的格式
-- hh24 以24小时计时
-- hh12 以12小时计时
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
-- 显示该日期是周几,结果为1-7,由于外国是从周日开始算新的一周的,所以 1 其实是周日
select to_char(sysdate,'d') from dual;
to_number
to_number(varchar2 or char,’format model’)
其中 to_number 函数的格式如下:
9 代表一个数字
0 强迫0显示
$ 显示美元符号
L 强制显示一个当地的货币符号
. 显示一个小数点
, 显示一个千位分隔符
-- to_number 如果能够转换成数值类型,则转换,否则报错
select to_number('123') from dual; -- 正确,查询结果为 123
select to_number('123a') from dual; -- 报错
select to_number(sysdate) from dual; -- 报错
分页
伪列
-- 伪列可以从表中查询,但不能插入、更新和删除它们的值
-- rownum 是伪列中的一种,是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数
-- 对比下面两条 SQL 语句的 查询结果
-- 发现第二个查询语句多了一列有顺序的序号
select * from emp;
select rownum,emp.* from emp;
-- 查询伪列小于5的数据
select rownum,emp.* from emp where rownum<5;
-- 如果要使用大于号,则需要使用子查询
-- 原因是 当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件(如下条SQL语句条件为 rownum>10),会被删除,接着取下条
-- 下条的rownum还会是1,又被删除,依次类推,便没有了数据。
-- select rownum,emp.* from emp where rownum>10;
-- 查询伪列大于10的数据
select * from (select rownum rn,emp.* from emp) where rn>10;
通过伪列进行分页
-- 分页 pageNum 页码,pageSize 每页最大显示数
-- 分页公式:select e.* from (select rownum rn,emp.* from emp where rownum <= pageNum*pageSize) e where rn > (pageNum-1)*pageSize
-- 每页最大显示5条数据,显示第二页的数据
select e.* from (select rownum rn,emp.* from emp where rownum <= 10) e where rn > 5
5.3 PLSQL 编程
PLSQL 是 Oracle 对 SQL 语言的过程化拓展,指在 SQL 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语句具有过程处理能力。
把 SQL 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。
PL/SQL(Procedure Language/SQL)
PL : Procedure 过程化 Language 语言
判断和循环语句
if if...else...
for loop...
SQL:Structured Query Language 语言
DML TCL
PLSQL 语句块中不能直接使用 DDL 语句
基本语法
语法:
declare
-- 声明变量,游标等
begin
--(语句块的主体,必须)
exception
-- (异常处理)
end;
注 :plsq 中给变量赋值是 := 而不是 =
-- declare
-- 定义一些变量
-- begin
-- 逻辑 if。。。
-- end
-- 赋值是使用 := 进行赋值,不能缺少 :
declare
age integer:=2; -- 给变量赋值是 :=
begin
dbms_output.put_line(age);
end;
定义变量的位置可以不在 declare 到 begin 中间
-- 定义变量的时候
-- 1.可以在声明变量的同时进行赋值
-- 2.可以先声明变量,后赋值
-- 3.可以先赋初始值,后续再重新赋值
-- 输出语句 dbms_output.put_line();
-- 拼接字符串,需要使用 || 进行拼接,不是加号 + !!!
-- 先声明变量,后赋值
declare
age integer;
begin
age:=18; -- 先声明变量后赋值
dbms_output.put_line('张三的年龄是:'||age);
end;
-- 先赋初始值,后续再继续赋值
declare
age integer:=1; -- 先赋初始值
begin
age:= 10; -- 后续重新赋值
dbms_output.put_line('李四的年龄是:'||age);
end;
if 判断
if 判断的语法为:
if 条件
then 结果
elsif 条件
then 结果
else
结果
end if; 结束
declare
age integer:=10;
begin
if age > 20 then
dbms_output.put_line('你成年了');
end if;
end;
再来个比较完整的例子
-- 分数判断
-- 90 分以上,输出优秀,80-90分,输出良好,70-80分,输出一般,其他情况输出差
declare
score integer:=0;
begin
if score>90 then
dbms_output.put_line('优秀');
elsif score > 80 then
dbms_output.put_line('良好');
elsif score >70 then
dbms_output.put_line('一般');
else
dbms_output.put_line('差');
end if;
end;
case 分支
case 分支语法为:
case 变量
when 条件
then 结果
else
结果
end case;
案例
-- switch case
-- case 需要判断的值
-- when 条件 then 结果
-- end case;
declare
grade nvarchar2(5):='C';
begin
case grade
when 'A' then dbms_output.put_line('优秀');
when 'B' then dbms_output.put_line('良好');
when 'C' then dbms_output.put_line('一般');
else
dbms_output.put_line('差');
end case;
end;
loop 循环
loop 循环语法:
declare
i integer:=1;
begin
loop
if 条件 then exit; -- exit; 表示结束循环
循环代码块
end loop;
end;
示例
-- loop 循环
-- 使用 if 来判断结束条件,exit 是结束循环
declare
i integer:=1;
total integer:=0;
begin
loop
if i>100 then exit;
end if;
total:=total+i;
i:=i+1; -- 控制循环
end loop;
dbms_output.put_line('总数:'||total);
end;
-- 求1-100的偶数合
-- mod(取模) i%2 --> i mod 2
declare
total integer:=0;
i integer:=1;
begin
loop
if i > 100 then exit;
else
if i mod 2 = 0 then total:=total+i;
end if;
i:=i+1;
end if;
end loop;
dbms_output.put_line('总数:'||total);
end;
while 循环
loop 循环语法:
declare
i integer:=1;
begin
while 条件 loop
循环代码块
end loop;
end;
示例
-- while 循环
declare
i integer:=1;
total integer :=0;
begin
while i<=100 loop
total := total + i;
i := i+1;
end loop;
dbms_output.put_line(total);
end
for 循环
for 循环语法:
for i in 循环次数 loop
循环代码块
end loop;
示例
-- for循环
declare
begin
for i in 1..100 loop -- 1..100 表示从1到100
dbms_output.put_line('循环了'||i||'次');
end loop;
end;
异常
exception
处理异常的代码块
示例
-- 异常 exception
declare
e_num integer:= 0;
begin
select item_id into e_num from item;
exception
when TOO_MANY_ROWS then dbms_output.put_line('返回了多行数据异常');
end;
异常错误说明如下:
错误号 | 异常错误信息 | 说明 |
---|---|---|
ORA-0001 | Dup_val_on_index | 违反了唯一性限制 |
ORA-0051 | Timeout-on-resource | 再等待资源时发生超时 |
ORA-0061 | Transaction-backed-out | 由于发生死锁事务被撤销 |
ORA-1001 | Invalid-CURSOR | 试图使用一个无效的游标 |
ORA-1012 | Not-logged-on | 没有连接到ORACLE |
ORA-1017 | Login-denied | 无效的用户名/口令 |
ORA-1403 | No_data_found | SELECT INTO 没有找到数据 |
ORA-1422 | Too_many_rows | SELECT INTO 返回多行 |
ORA-1476 | Zero-divide | 试图被零除 |
ORA-1722 | Invalid-NUMBER | 转换一个数字失败 |
ORA-6500 | Storage-error | 内存不够引发的内部错误 |
ORA-6501 | Program-error | 内部错误 |
ORA-6502 | Value-error | 转换或阶段错误 |
ORA-6504 | Rowtype-mismatch | 宿主游标变量与 PL/SQL 变量有不兼容行类型 |
ORA-6511 | CURSOR-already-OPEN | 试图打开一个已处于打开状态的游标 |
ORA-6530 | Access-INTO-null | 视图为 null 对象的属性赋值 |
ORA-6531 | Collection-is-null | 视图将 Exists 以外的集合(collection)方法应用于一个 null pl/sql 表上或varray上 |
ORA-6532 | Subscript-outside-limit | 对嵌套或varray索引的引用超出声明范围以外 |
ORA-6533 | Subscript-beyound-count | 对嵌套或varray索引的引用大于集合中元素个数 |
6. JDBC 连接Oracle
创建一个新的 Maven 工程项目
导入依赖
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0-atlassian-hosted</version>
</dependency>
</dependencies>
根据之前的 item 表创建实体类
public class Item {
private Integer item_id;
private String item_name;
private String item_desc;
private Date createtime;
public Item() {
}
public Item(Integer item_id, String item_name, String item_desc, Date createtime) {
this.item_id = item_id;
this.item_name = item_name;
this.item_desc = item_desc;
this.createtime = createtime;
}
public Integer getItem_id() {
return item_id;
}
public void setItem_id(Integer item_id) {
this.item_id = item_id;
}
public String getItem_name() {
return item_name;
}
public void setItem_name(String item_name) {
this.item_name = item_name;
}
public String getItem_desc() {
return item_desc;
}
public void setItem_desc(String item_desc) {
this.item_desc = item_desc;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
@Override
public String toString() {
return "Item{" +
"item_id=" + item_id +
", item_name='" + item_name + '\'' +
", item_desc='" + item_desc + '\'' +
", createtime=" + createtime +
'}';
}
}
使用 JDBC 连接 Oracle
public class TestDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
// url 连接地址
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
// 登录账号
String username = "scott";
// 登录密码
String password = "root";
// 连接 Oracle 并获取连接对象
Connection conn = DriverManager.getConnection(url, username, password);
// 检测是否成功连接
System.out.println(conn);
// 查询
String querrySql = "select * from ITEM";
PreparedStatement ppstm = conn.prepareStatement(querrySql);
ResultSet rs = ppstm.executeQuery();
while (rs.next()){
Item item = new Item();
item.setItem_id(rs.getInt("item_id"));
item.setItem_name(rs.getString("item_name"));
item.setItem_desc(rs.getString("item_desc"));
item.setCreatetime(rs.getDate("createtime"));
System.out.println(item);
}
// 增加
String addSql="insert into item(item_name,item_desc,CREATETIME) values (?,?,?)";
ppstm = conn.prepareStatement(addSql);
ppstm.setString(1,"红米手机");
ppstm.setString(2,"好用");
ppstm.setDate(3,new Date(System.currentTimeMillis()));
int addRow = ppstm.executeUpdate();
System.out.println("影响行数:"+addRow);
// 修改
String updateSql = "update ITEM set ITEM_NAME=?,ITEM_DESC=? where ITEM_ID=?";
ppstm = conn.prepareStatement(updateSql);
ppstm.setString(1,"红米手机2");
ppstm.setString(2,"非常好用");
ppstm.setInt(3,3);
int updateRow = ppstm.executeUpdate();
System.out.println("影响行数:"+updateRow);
// 删除
String deleteSql = "delete from ITEM where ITEM_ID = ?";
ppstm = conn.prepareStatement(deleteSql);
ppstm.setInt(1,3);
int deleteRow = ppstm.executeUpdate();
System.out.println("影响行数:"+deleteRow);
}
}