Oracle->安装->DDL(表操作)->DML(数据操作)->JDBC连接oracle
目录
3、安装配置PLSQL Developer(可视化工具) 和远程连接Oracle
Oracle和MySQL相比有什么异同,最直观的一点在于MySQL是开源的,Oracle是收费的。
Orale具有以下特点:
- 支持多用户、大事务量的事务处理
- 数据安全性和完整性控制
- 支持分布式数据处理
- 可移植性
1、Oracle数据库的安装(Windows版)
安装在虚拟机中,首先要对虚拟机中的系统进行网络配置、一般有三种模式:
- 桥接模式:本地的计算机和虚拟机中的计算机处于同一个局域网,需要有外部网络环境(插网线)
- NAT模式:虚拟机中的计算机和本机共享一个IP地址(本机不能和虚拟机中的计算计通信)
- 仅主机模式:本地的计算机和虚拟机中的计算机用一根网线连接
准备好Oracle数据库安装包:
点击下一步、然后安装即可,全自动安装。
安装完成连接Oracle数据库:
连接成功,执行select * from tabs; 可以查看所有的表。
退出:quit
2、Oracle的体系结构
1、数据库
Oracle中的数据库和其他数据库不同,其他的数据库可以创建多个数据库,而oracle一个操作系统中只有一个数据库,可以看做Oracle只有一个数据库。而且Oracle数据库是数据的物理存储(包括数据文件ORA或者DBF、控制文件、联机日志、参数文件等)。
2、实例
Oracle数据库实例是Oracle数据库运行时的实体,是操作系统进程和内存结构的集合。也就是说一个Oracle实例由一系列的后台进程和内存结构组成,一个数据库可以有n个实例。
3、数据文件
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,数据实体是在某一个或者多个数据文件中,而一个表空间可以有多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后、就不能删除这个文件,而想要删除某个数据文件,要先删除这个数据文件所属于的表空间才行。
4、表空间
表空间是Oracle对物理数据上相关数据文件的逻辑映射。
5、段
段是一个逻辑数据存储单元,可以包含单个表、索引或其他对象。
6、区
区是分配给段的物理存储单元,通常包含多个数据块。
7、块
块是Oracle数据库中最小的物理存储单元,通常包含多条记录。
8、用户
Oracle中的用户和MySQL中的用户不同,MySQL中的用户登录之后可以看到所有的数据库。而Oracle中存在多个用户、每一个用户对应一个应用,用户是在表空间下建立的。用户登陆后只能看到和操作自己的表, ORACLE 的用户与 MYSQL 的数据库类似,每建立一个应用需要创建一个用户。在用户下面创建表。
3、安装配置PLSQL Developer(可视化工具) 和远程连接Oracle
- 远程连接Oracle数据库
需要使用工具:instantclient
在cmd中进入到改文件目录中,执行如下命令(注意是在本机中操作,从本机连接虚拟机中的Oracle数据库):
即可远程连接到Oracle数据库。
- 图形可视化界面工具
Oracle本身没有可视化界面,需要使用第三放工具:PLSQL Developer,下载该工具进行安装即可(注意安装目录不能带有空格或者中文)。
安装完成之后,打开软件如图,对该软件进行配置:
这样就可以使用这个图形化工具进行远程连接。
接下来继续配置
复制到本机的任一目录下即可,然后用记事本打开该文件,对该文件进行修改配置:
然后在本机配置环境变量:
然后打开PLSQL Developer软件,输入用户、密码等信息即可远程连接到Oracle数据库:
处理中文乱码问题:
打开SQL Window,在这个界面输入SQL语句:
select userenv('language') from dual
点击F8执行SQL:
得到这个结果 ,复制这个结果,在本机配置环境变量:
配置完环境变量,重启PLSQL Developer生效。
4、使用OraCle
- 创建表空间
create dataspace 表空间名称
datafile '数据文件存放位置及名称'
size 数据文件大小
autoextend on
size 每次扩容的大小
执行成功之后能够在虚拟机中看到数据文件
或者在PLSQL Developer右侧看见该数据文件
- 创建用户
注:一个表空间下,可以创建多个用户
create user 用户名称
identified by 用户密码
default tablespace 指定该用户属于哪一个表空间
执行之后再右侧能够看到创建的用户:
然后用刚刚创建的用户去进行登录
出现该错误是因为刚刚创建的用户不具有创建会话的权限,也就是说它啥也不能干,这也是oracle安全性高的体现,可以具化每一个用户的功能。
所以接下要通过system用户给wateruser用户赋权:
grant dba to 要赋予权限的用户名称
之后我们就可以使用wateruser用户进行登录
建表之前的步骤已经完成,下面就可以进行建表
- 创建表
语法:
create table 表名称(
字段1 类型(长度) primary key,
字段2 类型(长度),
......
)
常用数据类型:
- 字符型
- CHAR:固定长度的字符类型,最多存储2000个字节(会用空格代替多余的空间)
- VARCHAR2:可变长度的字符类型,最多存储4000个字节
- LONG:打文本类型,最大可存储2个G,MySQL中的long是数字,Oracle中的long是文本(类似MySQL中的text类型)
- 数值型
- NUMBER:数值类型
- 例如:NUMBER(5) 最大可存储的数为99999
- NUMBER(5,2) 最大可存储的数为999.99
- 日期型
- DATE:日期类型,精确到秒
- TIMESTAMP:精确到秒的小数点后9位
- 二进制
- CLOB:存储字符,最大可以存4个G(C相遇与char(字符))
- BLOB:存储图像、声音、视频等二进制数据,最多可以存4个G(B可以理解为byte)
实例:
在用户下创建表:
--创建业主表
create table T_OWNERS(
ID NUMBER(5) PRIMARY KEY,
NAME VARCHAR2(30),
ADDRESSID NUMBER,
HOUSENUMBER VARCHAR2(30),
WATERMETER VARCHAR2(30),
ADDDATE DATE,
OWNERTYEID NUMBER
)
可以在右侧看见表已经创建成功。
表的创建、修改、删除
(1)增加字段:
ALTER TABLE 表名称 ADD(列名 1 类型 [DEFAULT 默认值],列名 1 类型
[DEFAULT 默认值]...)
--增加字段
alter table T_OWNERS add (
remake varchar2(20),
outdate date
);
(2)修改字段
ALTER TABLE 表名称 MODIFY(列名 1 类型 [DEFAULT 默认值],列名 1 类型
[DEFAULT 默认值]...)
--修改字段
alter table T_OWNERS modify(
remake char(20),
outdate timestamp
);
(3)修改原字段名称
ALTER TABLE 表名称 RENAME COLUMN 原列名 TO 新列名
--修改原字段名称
alter table T_OWNERS rename column outdate to outs;
(4)删除字段名
--删除一个字段
ALTER TABLE 表名称 DROP COLUMN 列名
--删除多个字段
ALTER TABLE 表名称 DROP (列名 1,列名 2...)
--删除字段
alter table T_OWNERS drop column outs;
(5)删除表
drop table 表名称
数据增删改查
(1)插入数据
INSERT INTO 表名[(列名 1,列名 2,...)]VALUES(值 1,值 2,...)
--插入数据
insert into T_OWNERS values (
1,'张三丰',1,'2-2','5678',sysdate,1
);
commit;
执行完插入语句,需要commit提交一下,sysdate是获取当前日期。
(2)修改数据
UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,....WHERE 修改条件;
--修改数据
update T_OWNERS set ADDDATE=ADDDATE-3 where id=1;
commit;
修改完数据,也需要commit。
(3)删除数据
语法一:
DELETE FROM 表名 WHERE 删除条件;
--删除id为2的业主信息
delete from T_OWNERS where id=2;
commit;
删除也需要comit
语法二:
TRUNCATE TABLE 表名称
truncate和delete相比较
- delete删除的数据可以rollback回来
- delete删除可能产生碎片,并且不释放空间
- truncate是先摧毁表结构,再重构表结构
JDBC连接Oracle
创建工程、引入连接Oracle的JDBCjar包,在oracle的安装目录中key找到。
把这个jar包复制出来
创建java工程,将jar包放入lib文件夹下,点击右键,选择add as library。
然后开始编写获取连接的类
package com.dong.oracetext.dao;
import java.sql.*;
/**
* 基本数据访问类(获取数据库连接、 关闭资源)
*/
public class BaseDao {
static{
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取数据库连接
public static Connection getConnection() throws SQLException {
//oracle存在胖连接 和瘦连接,我们使用的是瘦连接
//getConnection的三参数分别是Oracle的连接Url,用户,密码,注意表在哪个用户下,就连接哪一个用户
return DriverManager.getConnection("jdbc:oracle:thin:@192.168.80.3:1521:orcl","wateruser","oracle");
}
/**
* 关闭资源
* @param rs
* @param stmt
* @param conn
*/
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();
}
}
}
}
针对某一个表进行增删改查
首先创建表对应的实体类
package com.dong.oracetext.pojo;
import java.time.LocalDateTime;
import java.util.Date;
/**
* Owners表
*/
public class Owners {
private Long id;
private String name;
private Long addressid;
private String housenumber;
private String watermeter;
private Date adddata;
private Long ownertyeid;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getAddressid() {
return addressid;
}
public void setAddressid(Long addressid) {
this.addressid = addressid;
}
public String getHousenumber() {
return housenumber;
}
public void setHousenumber(String housenumber) {
this.housenumber = housenumber;
}
public String getWatermeter() {
return watermeter;
}
public void setWatermeter(String watermeter) {
this.watermeter = watermeter;
}
public Date getAdddata() {
return adddata;
}
public void setAdddata(Date adddata) {
this.adddata = adddata;
}
public Long getOwnertyeid() {
return ownertyeid;
}
public void setOwnertyeid(Long ownertyeid) {
this.ownertyeid = ownertyeid;
}
}
创建操作表的DAO类
package com.dong.oracetext.dao;
import com.dong.oracetext.pojo.Owners;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
public class OwnersDao {
/**
* 添加数据
* @param owners
*/
public static void add(Owners owners) {
//1.获取数据库连接
Connection conn = null;
//2.获取数据执行预处理对象
PreparedStatement pstame=null;
try {
conn=BaseDao.getConnection();
//3.占位符填充sql
pstame=conn.prepareStatement("insert into T_OWNERS values(?,?,?,?,?,?,?)");
//4.设置占位符的值
pstame.setLong(1,owners.getId());
pstame.setString(2,owners.getName());
pstame.setLong(3,owners.getAddressid());
pstame.setString(4,owners.getHousenumber());
pstame.setString(5,owners.getWatermeter());
pstame.setDate(6,new Date(owners.getAdddata().getTime()));
pstame.setLong(7,owners.getOwnertyeid());
//5.执行
pstame.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeAll(null,pstame,conn);
}
}
}
测试能否插入数据
import com.dong.oracetext.dao.OwnersDao;
import com.dong.oracetext.pojo.Owners;
import java.util.Date;
public class Text1 {
public static void main(String[] args) {
OwnersDao.add(new Owners(9L,"张三",45L,"1-1","345",new Date(),1L));
}
}
查询数据库中是否有该条记录
可以看到数据已经插入到数据库中。
修改的方法和添加相同,不同的地方在于sql语句。
/**
* 修改数据
* @param owners
*/
public static void update(Owners owners) {
//1.获取数据库连接
Connection conn = null;
//2.获取数据执行预处理对象
PreparedStatement pstame=null;
try {
conn=BaseDao.getConnection();
//3.占位符填充sql
pstame=conn.prepareStatement("update T_OWNERS set " +
"name=?,addressid=?,housenumber=?,watermeter=?,adddate=?,ownertyeid=? where id=?");
//4.设置占位符的值
pstame.setString(1,owners.getName());
pstame.setLong(2,owners.getAddressid());
pstame.setString(3,owners.getHousenumber());
pstame.setString(4,owners.getWatermeter());
pstame.setDate(5,new Date(owners.getAdddata().getTime()));
pstame.setLong(6,owners.getOwnertyeid());
pstame.setLong(7,owners.getId());
//5.执行
pstame.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeAll(null,pstame,conn);
}
}
测试修改
import com.dong.oracetext.dao.OwnersDao;
import com.dong.oracetext.pojo.Owners;
import java.util.Date;
public class Text1 {
public static void main(String[] args) {
// OwnersDao.add(new Owners(9L,"张三",45L,"1-1","345",new Date(),1L));
OwnersDao.update(new Owners(9L,"lisi",45L,"1-1","345",new Date(),1L));
}
}
可以看到数据修改成功。
删除数据,也是sql语句不同,其他都相同。
/**
* 删除数据
* @param id
*/
public static void delete( Long id) {
//1.获取数据库连接
Connection conn = null;
//2.获取数据执行预处理对象
PreparedStatement pstame=null;
try {
conn=BaseDao.getConnection();
//3.占位符填充sql
pstame=conn.prepareStatement("delete from T_OWNERS where id=? ");
//4.设置占位符的值
pstame.setLong(1,id);
//5.执行
pstame.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeAll(null,pstame,conn);
}
}
测试
结果
id为1 的数据已经被删除。
数据的导出与导入
(1)整库的导入导出
命令:
exp sytem/oracle full=y
参数full=y就是整库导出,执行命令后,会在当前文件夹下生成一个EXPDAT.DMP,此文件为备份文件,如果想要指定该文件的名称,需要添加参数file=文件名。
exp sytem/oracle file=文件名 full=y
数据库整库导入
命令:
imp system/oracle full=y
此命令使用默认的备份文件EXPDAT.DMP导入,如果指定了备份文件,则
import system/oreacle file=文件名 full=y
(二)按用户名称导出导入
按用户导出
exp system/oracle owener=wateruser file=water.dmp
按用户导入
imp system/oracle file=water.dmp fromuser=wateruser
(三)按表导出导入
按表导出
exp wateruser/oracle file=a.dmp tables=t1,t2
tables指定要导出的表,如果有多张表则用逗号隔开
按表导入
imp wateruser/oracle file=a.dmp tables=t1,t2