欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC与Oracle的碰撞

程序员文章站 2022-03-13 14:50:17
...

JDBC与Oracle的碰撞:

1、Oracle介绍:

1、手动启动服务(二种方式):
1、win+r services.msc 打开服务管理界面
OracleServiceORCL、OracleOraDb10g_home2TNSListener
2、右击计算机–>管理–>服务
机房操作
1、启动服务:实例(OracleServiceOrcl)、监听(…Listner)
2、因为系统会还原,所以每次需删除监听、本地net服务,然后再添加
(1)、Oracle-Oracle10g_home1->配置和移植工具->Net Configuration Assistant->
先删除再添加(监听程序配置、本地Net服务名配置)
(2)、添加本地Net服务名配置需设置:
服务名:ORCL
主机名: 127.0.0.1
其它都是默认就行
3、登录
机房默认:
scott
accp
ORCL
Normal

2、orale数据库真正存放数据的是数据文件(data files),Oracle表空间(tablespaces)实际上是一个逻辑的概念。
在一个房间里面可以存储很多箱子,箱子里面可以存储物品!
表空间可以看成是房间,箱子可看成是数据文件,物品可以看成表。用户指定表空间也就是你希望把属于这个用户的表放在那个房间(表)里面。
sys change_on_install
system manager
scott tiger
3、建表空间
–具有dba角色的管理员操作
create tablespace testSpace
datafile ‘D:\testSpace.dbf’
size 10m
autoextend on
next 2m maxsize 1024m

–建用户
create user feng identified by “123456”
default tablespace testSpace;

–授予权限
grant connect,resource to feng;

–建表
create table student
(
stuId number not null,
stuName nvarchar2(20),
stuHeight number(3,2),
stuAddress nvarchar2(30),
stuBorndate date
)
create table score
(
id number not null,
score number,
stuId number
)
create table ADMIN
(
ID NUMBER,
USERID nVARCHAR2(20),
USERPWD nVARCHAR2(21)
)
//存储整数或浮点类型使用number

//修改字段 右击表名–>Edit
//修改数据 右击表名–>Edit data

4、***sequence
是用来在多用户环境下产生唯一整数的数据库对象,用来产生顺序生成数字,这可用于自动生成主键值,并有协调多行或者多表的主键操作。没有sequence,顺充序的值只能靠编写程序来生成。
create sequence seq_student_stuId
start with 1
increment by 1

insert into student values(seq_student_stuId.nextval,‘峰哥’,1.88,‘湖南长沙’,sysdate)

–sysdate 系统当前日期

insert into student values(seq_student_stuId.nextval,‘峰哥’,1.88,‘湖南长沙’,to_date(‘1995-8-6’,‘yyyy-mm-dd’))

to_date(‘2015-6-8 22:10:20’,‘yyyy-mm-dd HH24:mi:ss’)
1)、sign()
当指定数值表达式的值为正、负或0时,分别返回1、-1、0。
select sign(stuid) from student;
select sign(first-second) from score

select sign(-11) from dual
2)、nvl函数
nvl(expr1,expr2) --如果expr1是null,则返回expr2,否则返回expr1.

3)、round(四舍五入)、trunc(没有四舍五入)保留二位小数
select round(3333.446,2) from dual;
select trunc(3333.446,2) from dual;

4)、case end、decode

select
case
when score<60 then ‘不及格’
when score>=60 and score<=80 then ‘良好’
else ‘优秀’
end,
decode(sign(score-60),-1,‘不及格’,(decode(sign(score-80),-1,‘良好’,‘优秀’)))
from score

case end、decode用法比较:
1.DECODE 是Oracle特有的;

2.CASE WHEN 是Oracle, SQL Server,MySQL 都可用;

3.DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断;CASE可用于=,>=,<,<=,<>,is null,is not null 等的判断;

4.DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活。

5)、伪列
查询第5条到第10条数据
select * from (select rownum rn,student.* from student) where rn>4 and rn<=10;

5、数据导入导出
1、用pl/sql导出、导入表
导出:Tools–>Export Tables–>选中路径并点击Export按钮
导入:Tools–>Import Tables–>选中导出的路径并点击Import按钮
2、用doc命令导出、导入数据库对象(表、***、存储过程等)
见文件夹

//安装Oracle注意事项
1、安装目录需要为空、不能有中文、空格
2、设置密码不能全是数字

//登录权限不够解决方案:
管理员登录进去–>User–>找到对应的用户–>Edit–>去掉Account Locked并设置密码

//笔记本装pl/sql一般没问题,如果登录不进去:
方式1、监听程序配置、本地Net服务名配置,先删除再新建
方式2、使用Oracle重新建一个数据库

NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则

1、NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。

2、而VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个。


2、数据库操作(连接):

1、加数据库驱动
右击项目-->Build path-->Add External Archivs...

2、
Connection conn=null;
try {
	//加载驱动类
	Class.forName("oracle.jdbc.driver.OracleDriver");
	//DriverManager是负责驱动管理器,它能建条河流
	//那么建河要知道建河的规则,和这条河连到哪里去
	//jdbc数据库协议,oracle单指oracle数据库协议,这样就知道开河的规则
	//127.0.0.1是指数据库在哪里,1521哪个端口进去,huarui具体找那个数据库
	conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:huarui", "jiangyaping",
			"123456");
	System.out.println(conn);
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}catch(SQLException e){
	e.printStackTrace();
}finally{
	if(conn!=null){
		try {
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



--添加约束
--1非空约束
alter table student
modify stuname not null
--2默认值
alter table student
modify stuaddress default '湖南长沙';
--3主键 PK_列名
alter table student
add constraint PK_stuid primary key(stuid);
--4检查约束 CK_列名
alter table student
add constraint CK_stuemail check(stuemail like '%@%');
--5外键 FK_列名
create table Scores
(
sid number,
Score number,
stuId number
);
alter table Scores
add constraint FK_stuId foreign key(stuId)  references student(stuid)

--提交事务
insert into Scores values(1,80,1);
commit;

--事务保存点
savepoint p1;
delete from scores where sid=1;
savepoint p2;
delete from scores where sid=2;
rollback to p2;


--复制表(不复制约束)
create table student2
as
select * from student where 1=2;
--多行插入
insert into student2
select * from student
--修改表结构
alter table Scores
add(subjectId number);

alter table Scores
drop column subjectId;

alter table Scores
drop constraint FK_stuId;

--指定列
select sid from Scores;    --0.046
--注意:指定列的效率高于查所有列
select sid from Scores;    --0.078

--去掉重复项
select distinct * from Scores;

--伪列:并没实际存放在表中,只供查询
--rownum
--限制返回行数
select rownum,Scores.* from Scores where rownum<=5;

--连接操作符  ||
select stuname||stuage,stuid+stuage from student;   --加号 仅用于数学运算

--排序 order by stuage desc

--多表连接
select * from student inner join scores on  student.stuid=scores.stuid

--笛卡尔集
select * from student,scores where student.stuid=1

--多列子查询
select * from student where (stuname,stuage) in
(select stuname,stuage from student where stuname='阿峰');--如果只有一行in可以改为=

--分页查询
--查询学生信息,每5条一页
--第1页
select rownum,student.* from student where rownum<=5;
--第2页
select * from (select rownum rn,student.* from student) where rn>5 and rn<=10;
--操作符
select * from student where stuname not like 'S%';
select * from student where stuname not in('SMITH','SCOTT');
select * from student where stuname is not null;

--集合操作符
select deptno from emp
union all                  --有多少条记录就显示多少
select deptno from dept

select stuid from student
union                      --去掉重复的记录
select stuid from scores

select stuid from student
intersect
select stuid from scores
--减集
select stuid from student
minus
select stuid from scores

运行快捷方式:F8
--具有dba角色的管理员操作
--建表空间
create tablespace stuSpace
datafile 'D:\Oracle\stuSpace.dbf'
size 10M
autoextend on
next 2M maxsize 1024M;
--建用户
create user lisi identified by "123456" --只有数字要加“”
default tablespace stuSpace;
--授予权限
grant connect to lisi;     --  最基本的二种权限,例如登录就需要这个权限
grant resource to lisi;    --  最基本的二种权限     
grant dba to lisi;
--从dba_sys_privs里可以查看权限
--select grantee,privilege from dba_sys_privs  where grantee='RESOURCE' --注意一定要是大写的,oracle中的数据是区分大小写的


create table STUDENT
(
  STUID      NUMBER not null,
  STUNAME    VARCHAR2(20),
  STUAGE     NUMBER,
  STUHEIGHT  NUMBER(3,2),
  STUEMAIL   VARCHAR2(20),
  STUADDRESS VARCHAR2(30),
  STUBorndate date
)

1)、自动编号:每个表的自动增长列都要先写一个***。
学生表学号:
create sequence seq_student_stuid
start with 1
increment by 1

2)、增、删、改、查
增加:insert into student(stuid,stuname,stuage,stuheight,stuemail,stuaddress,STUBorndate)
 values(seq_student_stuid.nextval,'阿峰',18,1.88,'[email protected]','湖南长沙',to_date(to_char
(sysdate,'yyyy-mm-dd HH24:mi:ss'),'yyyy-mm-dd HH24:mi:ss'));
//系统日期:      select sysdate from dual;
//上面可以简化为  select to_date('2015-8-6','yyyy-mm-dd HH24:mi:ss') from dual;
//注意:在java中添加日期到数据库中类型为date的字段时,只需写to_date(?,'yyyy-mm-dd HH24:mi:ss')    
 //24小时制的转换方式

修改:update student set stuname=stuname||',您好' where stuid=1;

3)、表导入、导出(见文件夹)