第一章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)业主信息维护
(2)业主信息查询
- 收费管理:
(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 ) |
- 修改字段名语法:
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实现数据删除?
- delete删除的数据可以rollback
- delete删除可能产生碎片,并且不释放空间
- 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; }
}
|
- 创建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 |