Java41: 数据库五(Oracle)

2024-09-03 22:32
文章标签 java oracle 数据库 41

本文主要是介绍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 {@Testpublic 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;
declarea1 number(5) := 100;a2 number(5) := 100;a3 number(5) ;
beginif a1   >a2 thena3   :=a1+a2;elsif a1<a2 thena3   :=a2-a1;elsea3:=0;end if;dbms_output.put_line('a3='||a3);
end;
/


--循环
set serveroutput on;
declarev_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;
declarev_sum number(5) := 0;
begin
-- 在for循环中可以不用再declare中声明
for v_i in 1..100 loopv_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的实现

这篇关于Java41: 数据库五(Oracle)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134234

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听