Oracle 学习笔记

Oracle 学习笔记

1. 简介

甲骨文公司

甲骨文(Oracle)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部在美国加利福尼亚州的红木滩。1989 年正式进入进入中国市场。2013 年,甲骨文已超越IDM,成为继 Microsoft 后成为全球第二大软件公司。

image-20201016190329750

Oracle Database

我们这里所学习的 Oracle 并不是 Oracle 公司,而是 Oracle 公司旗下的产品 Oracle Database 。

Oracle Database,又名 Oracle RDBMS,或简称 Oracle。是甲骨文公司的一款关系型数据库管理系统,它是数据库领域一直是领先地位的产品。可以说 Oracle 数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好,使用方便,功能强,适用于各类大,中,小。微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。

2. 安装

  1. 安装前准备

    确定自己的 windows 版本,windows 家庭版无法安装 Oracle 企业版

    我的电脑 --> 右键 --> 属性 查看电脑的 windows 版本

    image-20201016172722785

    如果是家庭版,可以去官网购买升级到专业版,或者是去某宝去买升级的序列号,某宝会比较便宜,当然,最好支持正版!

    官网下载安装包(下载时间可能比较长,因为安装包比较大)

    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

    下载好后将这两个压缩包加压放在同一个文件夹内

  2. 安装 Oracle

    双击运行 setup.exe 安装程序

    image-20201016185856721

    :安装的过程中,可能会看到不同的警告,都点击 “是” 继续安装即可

    image-20201016190014248

    不需要勾选填写任何东西,直接 下一步

    image-20201016190123742

    连续两个都是默认选择,直接点击下一步

    image-20201016190206010

    image-20201016190242594

    配置数据库安装目录、版本、字符集以及管理口令(:安装目录不要有中文)

    image-20201016190655812

    点击完成

    image-20201016191607940

    然后就开始安装

    image-20201016191637505

    image-20201016191809271

    点击确定即可

    image-20201016191850732

    安装完成后在开始菜单查看

    image-20201016192030064

    win键+R,输入 services.msc 打开服务列表,会看到安装了 Oracle 11g 后,共有7个服务,我们主要打开 OracleOraDb11g_home1TNSListener 和 OracleServiceORCL 两个服务,其他都是非必须启动项

    image-20201016192248962

  3. 服务介绍

    • 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

image-20201016200550351

输入 D:\Code\tool\other\oracle\product\11.2.0\dbhome_1\BIN 进入该目录的 dos 窗口

image-20201016200634854

  1. 只连接,不登录

    sqlplus/nolog

    image-20201016200756492

  2. 使用 sys 账户登录

    sys/system 一般都是管理身份,用于管理 oracle 数据

    conn sys/root@orcl as sysdba;

    查看当前用户

    show user

    image-20201016202700901

  3. scott 账户登录

    默认 sys,system 都是没有加锁,可以直接登录修改 orcl 数据

    scott 普通用户,一般都是开发学习使用此账户,但是默认 scott 账户时加锁的,需要使用 sys 登录进行解锁操作!

    image-20201016202936543

    我们要使用普通用户学习,就需要进行解锁

    解锁命令如下:

    alter user scott account unlock # 解锁
    alter user scott account lock # 加锁

    重置 scott 密码

    alter user scott identified by 密码

3.2 客户端连接 Oracle

Plsql 和 Sqldeveloper 是两款 Oracle 的可视化软件

  1. plsql 工具

    官网链接:https://www.allroundautomations.com/products/pl-sql-developer/

    下载安装好后填写账号密码

    image-20201017084615840

    连接后界面如下图:

    image-20201017084714952

  2. sql developer

    下载链接:https://www.oracle.com/tools/downloads/sqldev-v192-downloads.html

    是用 Java 编写的一个图形界面链接 oracle 的工具,需要安装 jdk 环境,是免费的

    image-20201017085150724

3.3 scott 账户下表认识

登录 scott 账户后,查看他所拥有的表

scott 账户拥有 BONUS,DEPT,EMP,SALGRADE 4 张表

image-20201017085743950

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 数据库和数据库实例。

  1. 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)
  2. 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):数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

可能会觉得有点乱了,那么这一张图就可以理清楚了

image-20201017132752221

一个MySQL数据库由若干个实例构成,实例又由若干个用户,表空间等构成,表空间中使用数据文件(dbf、ora)进行存储。MySQL中允许有多个数据库,只有一个账号,Oracle 全局数据库只有一个,由若干个实例够成,有若干个账号。

4.2 Oracle 表空间创建

  1. 创建表空间

    -- 创建表空间
    create tablespace first_test -- 逻辑名
    datafile 'D:\Code\tool\other\oracle\tablespace\first_test.DBF' -- 物理文件路径
    size 10m autoextend on; -- size 表示初始容量,可以自动扩展容量
    
  2. 创建用户

    -- 创建用户
    create user xp_test identified by root -- 创建新的账号密码
    default tablespace first_test; -- 指定当前账号使用的表空间
    
  3. 授权 包括权限和角色,角色是权限的集合

    -- 授权 
    -- 查看权限和角色
    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);

    }

}
posted @ 2020-10-20 11:44  Windows_XP  阅读(281)  评论(0编辑  收藏  举报