Oracle(一)

 

第一章ORACLE简介

1.1.什么是ORACLE

       ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或C/S体系结构的数据库之一。 

ORACLE通常应用于大型系统的数据库产品。

      ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。

ORACLE数据库具有以下特点:

(1)支持多用户、大事务量的事务处理

(2)数据安全性和完整性控制

(3)支持分布式数据处理

(4)可移植性

 

1.2.ORACLE体系结构

1.数据库

Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。

2.实例

一个Oracle实例(Oracle Instance)有一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)组成。一个数据库可以有n个实例。

3.数据文件(dbf

 数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才行。

4.表空间

       表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。
       每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。

 注:表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。

 由于oracle的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!

   

5.用户

用户是在表空间下建立的。用户登陆后只能看到和操作自己的表,  ORACLE的用户与MYSQL的数据库类似,每建立一个应用需要创建一个用户。

 

 

 

第二章ORACLE安装与配置

2.1.VMware挂载windows server 2003

打开“资源”文件夹中的windows2003文件夹,双击扩展名为vmx的文件即可将windows2003系统挂载到VMware中

 

2.2.网络配置

1.创建虚拟网卡

VMware 中选择菜单“编辑”--“虚拟网络编辑器”

 

弹出的窗口中,点击“添加网络”按钮,名称为VMnet2 ,确定

 

设置为仅主机方式,并设定子网IP为192.168.80.0

 

2.设定虚拟操作系统的网络网卡

右键点击虚拟操作系统,选择“设置”菜单项,弹出以下窗口

点击网络适配器,选择自定义,VMnet2

3.设定虚拟操作系统的IP地址

在虚拟机的操作系统中设定IP地址为192.168.80.10 

 

设置本地的操作系统的虚拟网卡VMnet2的IP为192.168.80.6

(与虚拟机中的操作系统的IP地址处于同一IP网段)

 

在本地操作系统打开命令行,用ping命令测试网络是否连接成功

 

2.3.安装ORACLE数据库

将“资源”文件夹ORACLE安装包解压拷贝到虚拟机的系统中

并双击解压目录下的setup.exe,出现安装界面,如下:

 

输入口令和确认口令,如:igeek,点击下一步,出现如下进度条,

注:此口令即是管理员密码。

 

点击“下一步”,出现“概要”界面,点击“安装”。

出现安装进度条,等待安装完成,如下图:

安装完成后,自动运行配置向导,如下图,等待其完成:

 

完成后,出现“口令管理”界面,如下图:

点击“确定”,如下图:

 

安装结束,点击“退出”。

 

此时可以命令提示符下进行测试安装结果

输入:sqlplus system/igeek

igeek为你安装时输入的密码

 

2.4.远程连接ORACLE数据库

instantclient客户端

将“资源”文件夹中的instantclient_12_1 拷贝到D盘根目录

进入命令提示符,进入该目录,输入如下命令连接远程的ORACLE

 

SQL Developer界面工具使用

(1)解压资源文件 sqldeveloper-4.0.zip

(2)点击运行sqldeveloper.exe

(3)配置SQL Developer JDK home

(4)点击ok运行

(5)连接右键 新建连接

(6)点击连接

 

第三章 项目案例:《自来水公司收费系统》

3.1.项目介绍、需求分析及表结构设计

北京市自来水公司为更好地对自来水收费进行规范化管理,决定委托极客营程序员开发《自来水公司收费系统》。考虑到自来水业务数量庞大,数据并发量高,决定数据库采用ORACLE数据库。主要功能包括:

  1. 、基础信息管理:
  1. 业主类型设置
  2. 价格设置
  3. 区域设置
  4. 收费员设置
  5. 地址设置
  1. 业主信息管理:

(1)业主信息维护

(2)业主信息查询

  1. 收费管理:

(1)抄表登记

(2)收费登记

(3)收费记录查询

(4)欠费用户清单

4、统计分析:

(1)收费日报单

(2)收费月报表

.......

 

表结构设计

1.业主类型表(T_OWNERTYPE

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

NAME

VARCHAR2(30)

类型名称

2.价格表(T_PRICETABLE

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

PRICE

NUMBER(10,2)

价格

OWNERTYPEID

NUMBER

业主类型ID

MINNUM

NUMBER(10,2)

区间数开始值

MAXNUM

NUMBER

 

区间数截止值

 

3.区域表(T_AREA

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

NAME

VARCHAR2(30)

区域名称

 

4.收费员表(T_OPERATOR

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

NAME

VARCHAR2(30)

操作员名称

 

5.地址表(T_ADDRESS

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

NAME

VARCHAR2(30)

地址名称

AREAID

NUMBER

区域ID

OPERATORID

NUMBER

操作员ID

 

6.业主表(T_OWNERS

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

NAME

VARCHAR2(30)

业主名称

ADDRESSID

NUMBER

地址ID

HOUSENUMBER

VARCHAR2(30)

门牌号

WATERMETER

VARCHAR2(30)

水表编号

ADDDATE

DATE

登记日期

OWNERTYPEID

NUMBER

业主类型ID

 

 

7.收费台账(T_ACCOUNT

字段名

类型(位数)

是否必填

说明

ID

NUMBER

主键

OWNERID

NUMBER

业主编号

OWNERTYPEID

NUMBER

业主类型

AREAID

NUMBER

所在区域

YEAR

CHAR(4)

账务年份

MONTH

CHAR(2)

账务月份

NUM0

NUMBER

 

上月累计数

NUM1

NUMBER

 

本月累计数

USENUM

NUMBER

 

本月使用数

METERUSERID

NUMBER

 

抄表员

METERDATE

DATE

 

抄表日期

MONEY

NUMBER(10,2)

 

应缴金额

ISFEE

CHAR(1)

是否缴费

FEEDATE

DATE

 

缴费日期

FEEUSERID

NUMBER

 

收费员

上述7张表的物理模型如下:

 

3.2.创建表空间

create tablespace waterboss

datafile 'c:\waterboss.dbf'

size 100m

autoextend on

next 50m

解释:

waterboss为表空间名称

datafile 用于设置物理文件名称

size 用于设置表空间的初始大小

autoextend on  用于设置自动增长,如果存储量超过初始大小,则开始自动扩容

next 用于设置扩容的空间大小

 

3.3.创建用户,用户赋权

create user wateruser

identified by igeek

default tablespace waterboss

wateruser为创建的用户名

identified by 用于设置用户的密码

default tablesapce  用于指定默认表空间名称

grant dba to wateruser

给用户wateruser赋予DBA权限后即可登录

 

第四章 表的创建、修改与删除

4.1.创建表

语法:

CREATE TABLE 表名称(

  字段名 类型(长度) primary key,

  字段名 类型(长度) not null,

  .......

);

   数据类型:

1. 字符型

(1)CHAR :  固定长度的字符类型,最多存储2000个字节

(2)VARCHAR2  :可变长度的字符类型,最多存储4000个字节

(3)LONG : 大文本类型。最大可以存储2个G

2.数值型

NUMBER : 数值类型 

例如:NUMBER(5)   最大可以存的数为99999   

      NUMBER(5,2)  最大可以存的数为999.99  

3.日期型

(1)DATE:日期时间型,精确到秒 

(2)TIMESTAMP:精确到秒的小数点后9位

4.二进制型(大数据类型)

(1)CLOB : 存储字符,最大可以存4个G

(2)BLOB:存储图像、声音、视频等二进制数据,最多可以存4个G

实例:

创建业主表

create table t_owners(

id number primary key,

name varchar2(30) not null,

addressid number not null,

housenumber varchar2(30) not null,

watermeter varchar2(30) not null,

adddate date not null,

ownertypeid number not null

);

其它表的创建见资料“自来水收费系统建表语句.sql”

 

4.2.修改表、删除表

1. 增加字段语法:

Alter table表名称 add(列名1 类型 [DEFAULT 默认值],列名1 类型 [DEFAULT 默认值]...)

为业主表增加两个字段,语句:

--追加字段

ALTER TABLE T_OWNERS ADD

(

  REMARK VARCHAR2(20),

  OUTDATE DATE

)

2. 修改字段语法:

ALTER TABLE 表名称 MODIFY(列名1 类型 [DEFAULT 默认值],列名1 类型 [DEFAULT 默认值]...)

修改两个字段的类型,语句:

--修改字段

ALTER TABLE T_OWNERS MODIFY

(

REMARK CHAR(20),

OUTDATE TIMESTAMP

)

  1. 修改字段名语法:

ALTER TABLE 表名称 RENAME COLUMN 原列名 TO 新列名

语句:

ALTER TABLE T_OWNERS RENAME COLUMN OUTDATE TO EXITDATE

4. 删除字段名

--删除一个字段

ALTER TABLE 表名称 DROP COLUMN 列名

--删除多个字段

ALTER TABLE 表名称 DROP (列名1,列名2...)

语句:

--删除字段

ALTER TABLE T_OWNERS DROP COLUMN REMARK

5. 删除表

语法:

DROP TABLE 表名称

 

第五章 数据增删改

1. 插入数据

语法:

INSERT  INTO表名[(列名1,列名2,...)]VALUES(值1,值2,...)

 

执行INSERT后一定要再执行commit提交事务

向业主表插入数据:

insert into T_OWNERS VALUES (1,'张三丰',1,'2-2','5678',sysdate,1);

语句中的sysdate是系统变量用于获取当前日期,执行完

再点击下图的图标,此图标为commit,可持久保存数据

我们再次录入一条数据,语句如下:

insert into T_OWNERS VALUES (2,'赵大侃',1,'2-3','9876',sysdate,1);

commit;

2. 修改数据

语法:

UPDATE 表名 SET 列名1=值1,列名2=值2,....WHERE 修改条件;

执行UPDATE后一定要再执行commit提交事务

需求:将ID为1的业主的登记日期更改为三天前的日期

update T_OWNERS set adddate=adddate-3 where id=1;

commit;

3. 删除数据

语法1:

DELETE FROM 表名    WHERE       删除条件;

执行DELETE后一定要再执行commit提交事务

需求:删除业主ID为2的业主信息

delete from T_OWNERS where id=2;

commit;

语法2:

TRUNCATE  TABLE  表名称

问题:比较truncate与delete实现数据删除?

  1. delete删除的数据可以rollback
  2. delete删除可能产生碎片,并且不释放空间
  3. truncate是先摧毁表结构,再重构表结构

 

第六章JDBC连接ORACLE

开发步骤:

1: 创建java工程waterboss

2: 导入jar

3: 编写BaseDao负责加载驱动

4: 业主增删改代码编写

5: 测试运行

【第一步】创建java工程

 

【第二步】导入jar

在下图目录中可以找到驱动包ORACLE的JDBC驱动包,拷贝到工程即可使用

建立lib文件夹, 将ojdbc14.jar拷贝到此文件夹, 然后右键 add build path

【第三步】编写BaseDao

我们通常编写BaseDao负责加载驱动,获取数据库连接,关闭资源,代码如下:

package com.igeek.waterboss.dao;

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class BaseDao {

 

   //加载驱动

   static{

      try {

         Class.forName("oracle.jdbc.driver.OracleDriver");

      } catch (ClassNotFoundException e) {

         e.printStackTrace();

      }    

   }

 

 

   public static Connection getConnection() throws SQLException {

      return DriverManager.getConnection("jdbc:oracle:thin:@192.168.12.25:1521:orcl",

                                  "wateruser", "igeek");

     

   }

 

 

   public static void closeAll(ResultSet rs, Statement stmt, Connection conn) {

      //关闭结果集

      if(rs!=null){

         try {

            rs.close();

         } catch (SQLException e) {          

            e.printStackTrace();

         }

      }

      //关闭执行对象

      if(stmt!=null){

         try {

            stmt.close();

         } catch (SQLException e) {          

            e.printStackTrace();

         }

      }

      //关闭执行对象

      if(conn!=null){

         try {

            conn.close();

         } catch (SQLException e) {          

            e.printStackTrace();

         }

      }

   }

 

}

 

JDBC驱动为: 

oracle.jdbc.OracleDriver oracle.jdbc.oracle.OracleDriver

 

连接字符串( 瘦连接 ):

jdbc:oracle:thin:@虚拟机的IP:1521:orcl

【第四步】业主增删改代码编写

1.创建实体类

package com.igeek.waterboss.entity;

 

import java.sql.Date;

 

public class Owners {

 

   private Long id;         //编号

   private String name;     //业主名称

   private Long addressid;     //地址编号

   private String housenumber; //门牌号

   private String watermeter//水表编号

   private Date adddate;    //登记日期

   private Long ownertypeid;   //业主类型ID

  

   /**

    * @return the id

    */

   public Long getId() {

      return id;

   }

   /**

    * @param id the id to set

    */

   public void setId(Long id) {

      this.id = id;

   }

   /**

    * @return the name

    */

   public String getName() {

      return name;

   }

   /**

    * @param name the name to set

    */

   public void setName(String name) {

      this.name = name;

   }

   /**

    * @return the addressid

    */

   public Long getAddressid() {

      return addressid;

   }

   /**

    * @param addressid the addressid to set

    */

   public void setAddressid(Long addressid) {

      this.addressid = addressid;

   }

   /**

    * @return the housenumber

    */

   public String getHousenumber() {

      return housenumber;

   }

   /**

    * @param housenumber the housenumber to set

    */

   public void setHousenumber(String housenumber) {

      this.housenumber = housenumber;

   }

   /**

    * @return the watermeter

    */

   public String getWatermeter() {

      return watermeter;

   }

   /**

    * @param watermeter the watermeter to set

    */

   public void setWatermeter(String watermeter) {

      this.watermeter = watermeter;

   }

   /**

    * @return the adddate

    */

   public Date getAdddate() {

      return adddate;

   }

   /**

    * @param adddate the adddate to set

    */

   public void setAdddate(Date adddate) {

      this.adddate = adddate;

   }

   /**

    * @return the ownertypeid

    */

   public Long getOwnertypeid() {

      return ownertypeid;

   }

   /**

    * @param ownertypeid the ownertypeid to set

    */

   public void setOwnertypeid(Long ownertypeid) {

      this.ownertypeid = ownertypeid;

   }

 

  

}

 

 

  1. 创建OwnersDao类实现增删改

 

package com.igeek.waterboss.dao;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

 

import com.igeek.waterboss.entity.Owners;

 

 

public class OwnersDao {

  

   /** 

   * @Title: add 

   * @Description: 新增业主

   * @param owners   

   */

   public void add(Owners owners) {

      Connection conn = null;

      PreparedStatement stmt = null;

      try {

         conn = BaseDao.getConnection();

         stmt = conn.prepareStatement("insert into T_OWNERS values(?,?,?,?,?,?,?)");

         stmt.setLong(1, owners.getId());

         stmt.setString(2, owners.getName());

         stmt.setLong(3, owners.getAddressid());

         stmt.setString(4, owners.getHousenumber());

         stmt.setString(5, owners.getWatermeter());

         stmt.setDate(6, owners.getAdddate());

         stmt.setLong(7, owners.getOwnertypeid());

         stmt.execute();

      } catch (SQLException e) {

         e.printStackTrace();

      } finally {

         BaseDao.closeAll(null, stmt, conn);

      }

   }

 

   /** 

   * @Title: update 

   * @Description: 修改业主

   * @param owners   

   */

   public void update(Owners owners) {

      Connection conn = null;

      PreparedStatement stmt = null;

      try {

         conn = BaseDao.getConnection();

         stmt = conn.prepareStatement("update T_OWNERS set name=?, addressid=?, housenumber=?, " +

                                     "watermeter=?, adddate=?, ownertypeid=? where id=?");

         stmt.setString(1, owners.getName());

         stmt.setLong(2, owners.getAddressid());

         stmt.setString(3, owners.getHousenumber());

         stmt.setString(4, owners.getWatermeter());

         stmt.setDate(5, owners.getAdddate());

         stmt.setLong(6, owners.getOwnertypeid());

         stmt.setLong(7, owners.getId());

         stmt.execute();

      } catch (SQLException e) {

         e.printStackTrace();

      } finally {

         BaseDao.closeAll(null, stmt, conn);

      }

   }

 

   /** 

   * @Title: delete 

   * @Description: 删除业主

   * @param id   

   */

   public void delete(Long id) {

      Connection conn = null;

      PreparedStatement stmt = null;

      try {

         conn = BaseDao.getConnection();

         stmt = conn.prepareStatement("delete from T_OWNERS where id=?");

         stmt.setLong(1, id);

         stmt.execute();

      } catch (SQLException e) {

         e.printStackTrace();

      } finally {

         BaseDao.closeAll(null, stmt, conn);

      }

   }

 

}

 

【第五步】测试运行

加入JUnit4 lib,创建Source Folder的test测试

package com.igeek.waterboss.entity;

 

import java.sql.Date;

 

import org.junit.Test;

 

import com.igeek.waterboss.dao.OwnersDao;

 

public class OwnersTest {

 

   /** 

   * @Title: testOwnersAdd 

   * @Description: 新增业主    

   */

   @Test

   public void testOwnersAdd() {

      Owners owners = new Owners();

      owners.setId(1L);

      owners.setName("张三丰");

      owners.setAddressid(1L);

      owners.setHousenumber("202");

      owners.setWatermeter("33448");

      owners.setAdddate(Date.valueOf("2012-01-01"));

      owners.setOwnertypeid(1L);

     

      OwnersDao dao = new OwnersDao();

      dao.add(owners);

   }

  

   /** 

   * @Title: testOwnersUpdate 

   * @Description: 修改业主    

   */

   @Test

   public void testOwnersUpdate() {

      Owners owners = new Owners();

      owners.setId(1L);

      owners.setName("张六丰");

      owners.setAddressid(1L);

      owners.setHousenumber("202");

      owners.setWatermeter("33448");

      owners.setAdddate(Date.valueOf("2012-01-01"));

      owners.setOwnertypeid(1L);

     

      OwnersDao dao = new OwnersDao();

      dao.update(owners);

   }

  

   /** 

   * @Title: testOwnersDelete 

   * @Description: 删除业主    

   */

   @Test

   public void testOwnersDelete() {

      long id = 1L;

      OwnersDao dao = new OwnersDao();

      dao.delete(id);

   }

  

}

 

 

第七章 数据导出与导入

 

       当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库该处理称为数据库恢复,而要进行数据库的恢复必须要有数据库的备份工作。

 

7.1.整库导出与导入

整库导出命令

exp system/igeek full=y

添加参数full=y 就是整库导出

执行命令后会在当前目录下生成一个叫EXPDAT.DMP,此文件为备份文件。

如果想指定备份文件的名称,则添加file参数即可,命令如下

exp system/igeek file=文件名 full=y

整库导入命令

imp system/igeek full=y

此命令如果不指定file参数,则默认用备份文件EXPDAT.DMP 进行导入

如果指定file参数,则按照file指定的备份文件进行恢复

imp system/igeek full=y file=water.dmp

远程导出的命令:  (当前环境下的oracle客户端和远程oralc服务端版本一致)

Exp system/igeek123@192.168.80.10:1521/orcl full=y

 

7.2.按用户、表导出与导入

按用户导出

exp system/igeek owner=wateruser file=wateruser.dmp

按用户导入

imp system/igeek  file=wateruser.dmp fromuser=wateruser

按表导出

exp wateruser/igeek file=a.dmp tables=t_account,t_area

用tables参数指定需要导出的表,如果有多个表用逗号分割即可

按表导入

imp wateruser/igeek file=a.dmp tables=t_account,t_area

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值