千家信息网

Java41: 数据库五(Oracle)

发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,数据库设计:三范式(OLD)列的值唯一,不能有重复的列值属性完全依赖于主键必须满足第一范式必须有主键其他列必须完全依赖于主键属性不依赖于其他非主属性(第二的加强)必须满足第二范式去除传递依赖(在特定的
千家信息网最后更新 2025年11月06日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;declareage number(3) := 100;sal number(8) := 100;agesal number(9);beginagesal := 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
set serveroutput on;declarev_empno EMP.EMPNO% TYPE;v_ename EMP.ENAME% TYPE;cursor v_emp_cursor is select empno,ename from emp order by ename;beginopen 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;beginopen v_dept_cursor;loopfetch 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 beginsum := 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的实现

视图 查询 游标 数据 效率 序列 索引 循环 参数 属性 条件 范式 设计 数据库 复杂 一行 关键 关键字 变量 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器安全区 网络安全攻防行业研究 nas网络服务器硬盘 无人直升机机载飞控软件开发 银之守墓人游戏服务器怎么关闭 软件开发及编程 黑客进攻与网络安全的关系 传奇4哪个服务器人最少 软件开发项目验收确认单 最有资质的游戏软件开发公司 株洲哪里有软件开发服务 学完数据库掌握了什么知识 成游网络技术有限公司招聘 海南综合软件开发定制价格 和平精英怎么看服务器等级 软件服务器的种类 浙江嵌入式软件开发服务 网络安全 北航 ios软件开发难度 流行病学公共数据库 创建一个数据库表的基本操作 青浦区信息软件开发品质保障 数据库中引用宿主语言的程序变量 软件开发设计维修学校 注册的域名如何解析到服务器 天谕服务器查询 企业级应用软件开发案例 维护管理机房服务器 圆心科技互联网医院运营特色 web服务器安全部署文档
0