我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java41: 数据库五(Oracle)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java41: 数据库五(Oracle)

数据库设计:

    三范式(OLD)

        列的值唯一,不能有重复的列值

        属性完全依赖于主键

            必须满足第一范式

            必须有主键

            其他列必须完全依赖于主键

        属性不依赖于其他非主属性(第二的加强)

            必须满足第二范式

            去除传递依赖

            (在特定的场合,对效率的考虑 如:专门做冗余的时候,不要遵守第三)



Oracle 序列

   可以通过序列来生成主键  一般的一个序列为一个表服务,也可以多个

    创建序列

        create sequence 序列名 start with 数值 incremet by 数值

                    |    不写 都是 1        |

    删除序列

        drop sequence 序列名


    通过伪列 nextval  获取下一个值

 

select seq_stu.nextval from dual;

   

    

    获取当前值 currval

        

select seq_stu.currval from dual;



create sequence seq_stu start with 100 incremet by5;


select seq_stu.nextval from dual;


insert into stu (id) values(seq_stu.nextval);




完整:

create table stu(
  s_id number(10),
  s_name varchar2(50),
  constraint s_pk primary key(s_id)
)
create sequence Seq_stu start with 100 increment by 5;

select * from stu;
package jdbc;

public class Stu {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;

public class StuDAO {
	private static final String SQL = "insert into stu(s_id,s_name) values(seq_stu.nextval,?)";
	public void save(Stu stu) throws Exception{
		Connection con = null;
		try{
			con = DBUtils.getConnection();
			PreparedStatement stmt = con.prepareStatement(SQL);
			stmt.setString(1,stu.getName());
			stmt.executeUpdate();		
		}catch(Exception e){
			throw e;
		}finally{
			if(con != null){
				con.close();
			}
		}
		
	}
}
package jdbc;

import static org.junit.Assert.*;

import org.junit.Test;

public class TestStuDAO {

	@Test
	public void test() throws Exception {
		StuDAO s = new StuDAO();
		Stu ss = new Stu();
		ss.setName("lmdtx");
		s.save(ss);
	}

}


       ER图(开源社区有真相)

        找你喜欢的或者公司习惯的(工具) 实在不行a4纸

        研究业务需求

        设计绘制E-R关系图

    设计文档

        该写啥就写啥



user_tables 是oracle中表  想要查看所有的表  就可以查看这个表  就好了

select * from user_tables;




索引 Index

    为了提升查询效率

    二叉树;hash

    经常要根据某个列进行查询,;选取的列不超过总数的10%

    基于这个列的查询效率高

    占用空间,插入时效率低

    主键默认创建索引

    索引和表  放在不同的表空间,这样效率更高

创建,删除

create index i_stu_name on stu(name);
drop index i_stu_name;
select * from user_indexes;
--查询所有的索引




视图 View

方便权限划分

简化复杂查询


    就是一段sql 查询出来的结果,想一个表,但是不是表

创建视图要有权限


grant create view to scott;


--创建视图
create view stu_view as select id,name,sex from stu;
drop view stu_view  删除



对view 可以DQL

对简单view 可以DML

create view v_emp_1 as select empno,ename,job from emp;

select * from v_emp_1;


insert into emp (empno,ename,job) values(7333,'LMDTX','CEO');


select * from v_emp_1 where empno=7333;


insert into v_emp_1 values(7777,'lmdtx','CTO')


select * from emp where empno=7777;

create view v_emp_dept as select * from emp inner join dept using(deptno);
 
 
 
--视图的聚合函数部分需要使用别名
create view v_emp_avg_sal as select job,avg(sal) from emp group by job order by avg(sal) ;


create view v_emp_dept as select deptno,dname,empno,ename,job from emp inner join dept using(deptno);

select * from v_emp_dept;
--不能插入了
insert into v_emp_dept values(10,'ACCOUNTING ',7111,'DSY','CTO');


--没有约束的时候
create view v_emp_sal2 as select * from emp where sal >1500;
--可以插入,但是有问题,在 sal>1500 中插入 sal 是1000的
insert into v_emp_sal2(empno,ename,sal) values(7474,'dsy',1000);
select * from emp where empno=7474;



--条件检查约束 可以插件数据是否可以通过该视图插入(是否符合该视图的查询条件)
create view v_emp_sal3 as select * from emp where sal >1500 with check option constraint check_v_emp_sal_1;
--就不能插入了  
insert into v_emp_sal3(empno,ename,sal) values(6000,'dsy',1000);

--只读视图
create view v_emp_sal3 as select * from emp where sal >1500 with check read only check_v_emp_sal_2;

简单view

复杂view

检查view

只读view



外键约束

 不是有外键就要添加外键约束

--建表建外键
create table emp2(
  id number(11),
  name varchar2(20) not null,
  sal number(12,2) not null,
  deptid number(4),
  constraint pk_emp2 primary key(id),
  constraint fk_emp2 foreign key(deptid) references dept(id)
);
--主键
create table dept(
  id number(4),
  name varchar2(20) not null,
  constraint pk_dept2 primary key(id)
);

--在表中添加外键约束
alter table service add constraint fk_service_account foreign key(account_id) references account(id);

--删除外键约束
alter table service drop constraint fk_service_account;


水平分割


垂直分割







存储过程

运行在数据库内部对数据进行操作的一段程序

    oracle 中用PL/SQ 或者ProC


PL/SQL块 


declare 

--变量的声明

age number(3) := 100;

sal number(8);

agesal number(9);

--开始

begin

--程序

 c := age+sal;

 dbms_output.put_line();

--结束

end

/

set serveroutput on;
declare
age number(3) := 100;
sal number(8) := 100;
agesal number(9);
begin
agesal := age+sal;
dbms_output.put_line('agesal='||agesal);
end;
/


--if判断
set serveroutput on;
declare
  a1 number(5) := 100;
  a2 number(5) := 100;
  a3 number(5) ;
begin
  if a1   >a2 then
    a3   :=a1+a2;
  elsif a1<a2 then
    a3   :=a2-a1;
  else
    a3:=0;
  end if;
  dbms_output.put_line('a3='||a3);
end;
/


--循环
set serveroutput on;
declare
  v_i number(5) := 1;
  v_sum number(5) := 0;
begin
loop
v_sum := v_sum+v_i;
v_i :=v_i+1;
exit when v_i>100;
end loop;
dbms_output.put_line('sum='||v_sum);
end;
/
--for 循环
set serveroutput on;
declare
  v_sum number(5) := 0;
begin
-- 在for循环中可以不用再declare中声明
for v_i in 1..100 loop
 v_sum := v_sum+v_i;
end loop
dbms_output.put_line('sum='||v_sum);
end;
/


cursor 游标

set serveroutput on;
declare
--声明变量为表中列的类型
--通过%type 取emp表中empno的类型
v_empno EMP.EMPNO% TYPE;
v_ename EMP.ENAME% TYPE;
--声明一个游标
-- 关键字   游标名   关键字      结果集合
cursor v_emp_cursor is select empno,ename from emp order by ename;
begin
--从游标中获取数据
  --打开游标
open v_emp_cursor;
--取一行 取出以后,游标下移一行
fetch v_emp_cursor into v_empno, v_ename;
dbms_output.put_line(v_empno||','||v_ename);
 --关闭游标
close v_emp_cursor;
end;
/
set serveroutput on;
declare
v_empno EMP.EMPNO% TYPE;
v_ename EMP.ENAME% TYPE;
cursor v_emp_cursor is select empno,ename from emp order by ename;
begin
open v_emp_cursor;
loop--循环
fetch v_emp_cursor into v_empno, v_ename;
exit when v_emp_cursor%notfound;--使用%notfound  作为退出条件
dbms_output.put_line(v_empno||','||v_ename);
end loop;
close v_emp_cursor;
end;
/


rowtype


set serveroutput on;
declare
--定义一个结构体
v_dept dept%rowtype;
cursor v_dept_cursor is select deptno,dname,loc from dept;
begin
open v_dept_cursor;
loop
fetch v_dept_cursor into v_dept;
exit when v_dept_cursor%notfound;
dbms_output.put_line(v_dept.deptno||','||v_dept.dname||','||v_dept.loc);
end loop;
end;
/



简单的

create or replace procedure jisuanqi(a in number,b in number,sum out number,sub out number)
as 
begin
sum := a+b;
sub := a-b;
end;
/
package other;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;

import online.zongxuan.netctoss.utils.DBUtils;

public class TestCallProcedure {
	public static void main(String[] args) throws Exception{
		Connection con = DBUtils.getConnection();
		//创建可调用的Statement 就是可以调用存储过程
		CallableStatement ctmt = con.prepareCall("call jisuanqi(?,?,?,?)");
		//设置输入参数
		ctmt.setInt(1, 200);
		ctmt.setInt(2, 100);
		//注册输出参数
		ctmt.registerOutParameter(3, Types.INTEGER);
		ctmt.registerOutParameter(4, Types.INTEGER);
		ctmt.execute();
		System.out.println(ctmt.getInt(3));
		//获取第二个输出(也就是设置的第四个参数)
		//ctmt.getInt(2);
		System.out.println(ctmt.getInt(4));
		con.close();
	}
}




DAO 


    1、EJB(死难用)

        2、Hibernate(沿袭EJB但是好用,自动的生成sql,效率不高)

            3、MyBatis(更轻量,自己写sql)


导入MyBatis

填写定义的配置文件(xml)

编写实体类

定义DAO(定义接口)

定义和DAO接口对应的SQL语句(xml)

    在配置文件中引用该xml

调用MyBatis 的apt 获得DAO的实现

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java41: 数据库五(Oracle)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

图数据库Neo4j学习五渲染图数据库neo4jd3

文章目录 1.现成的工具2.Neo4j JavaScript Driver3.neovis4.neo4jd34.1neo4jd3和neovis对比4.2获取neo4jd34.3neo4jd3的数据结构4.4Spring data n
2023-08-30

MySQL数据库(五)插入操作

前提要述:参考书籍《MySQL必知必会》《MySQL必知必会》是先讲了查询,但是没有记录就无法查询,所以先将如何添加数据。表已经知道怎么创建了,随便创两张。5.1 插入数据MySQL使用 INSERT来插入(或添加)行(记录)到数据库表中。插入可用以下几种方式
MySQL数据库(五)插入操作
2016-04-14
2024-04-02

【数据库】Oracle -

码农的成长   首页   新随笔   新文章         管理 【数据库】Oracle -- 一文了解Oracle数据库开发知识地图 1.Oracle数据库安装1.1.整合PL/SQL Developer软件1.点击Tools—>Prefere
【数据库】Oracle -
2015-06-06

【数据库_06】Oracle

二、数据库操作1. 创建表空间CREATE TABLESPACE "FIRSTDEMO"DATAFILE  "C:/oracle/firstdemo" SIZE 100M AUTOEXTEND ON NEXT 10M2. 创建用户CREATE USER "sc
【数据库_06】Oracle
2017-03-10

oracle数据库如何备份数据库

oracle 提供多种备份方法来保护数据库完整性,包括全备份、增量备份、差异备份和归档日志备份。最佳备份类型取决于数据库大小、恢复目标和可用资源。rman(恢复管理器)是 oracle 的内置备份和恢复工具,它简化了备份和恢复过程,并提供了
oracle数据库如何备份数据库
2024-04-19

WEB数据库管理平台kb-dms:数据源配置【五】

名称数据源的一个名称,用于方便标记和区分数据源。类型类型分为mysql/sqlserver所属团队数据源所属的团队,方便用户按团队查询数据源和数据库。负责人数据源的负责可以对数据源信息进行编辑。激活激活后数据源可见,取消激活数据源将在前端不可见,用户无法查询连
WEB数据库管理平台kb-dms:数据源配置【五】
2018-12-26

oracle数据库数据存在哪

oracle 数据库数据存储位置:数据文件:存储实际数据块。重做日志文件:记录对数据文件的更改,用于崩溃后恢复数据。控制文件:存储数据库结构和数据文件位置信息。临时表格空间:存储临时数据,用于执行查询和更新。持久表格空间:存储表和索引等永久
oracle数据库数据存在哪
2024-04-19

编程热搜

目录