Oracle->安装->DDL(表操作)->DML(数据操作)->JDBC连接oracle

目录

1、Oracle数据库的安装(Windows版)

 2、Oracle的体系结构

3、安装配置PLSQL Developer(可视化工具) 和远程连接Oracle

4、使用OraCle

常用数据类型:

在用户下创建表:

表的创建、修改、删除

数据增删改查

JDBC连接Oracle

修改的方法和添加相同,不同的地方在于sql语句。

删除数据,也是sql语句不同,其他都相同。

数据的导出与导入

(1)整库的导入导出

(二)按用户名称导出导入

(三)按表导出导入


Oracle和MySQL相比有什么异同,最直观的一点在于MySQL是开源的,Oracle是收费的。

 Orale具有以下特点:

  • 支持多用户、大事务量的事务处理
  • 数据安全性和完整性控制
  • 支持分布式数据处理
  • 可移植性

1、Oracle数据库的安装(Windows版)

   安装在虚拟机中,首先要对虚拟机中的系统进行网络配置、一般有三种模式:

  • 桥接模式:本地的计算机和虚拟机中的计算机处于同一个局域网,需要有外部网络环境(插网线)
  • NAT模式:虚拟机中的计算机和本机共享一个IP地址(本机不能和虚拟机中的计算计通信)
  • 仅主机模式:本地的计算机和虚拟机中的计算机用一根网线连接

准备好Oracle数据库安装包:

274d5887b17d47a09161b02d02dc080d.png

点击下一步、然后安装即可,全自动安装。

安装完成连接Oracle数据库:

4580ced1c7974127a08ddab5e6955b28.png

 连接成功,执行select * from tabs; 可以查看所有的表。

ddbbf485a5244a12aee9657118c6c35c.png

 退出:quit

 2、Oracle的体系结构

1、数据库

        Oracle中的数据库和其他数据库不同,其他的数据库可以创建多个数据库,而oracle一个操作系统中只有一个数据库,可以看做Oracle只有一个数据库。而且Oracle数据库是数据的物理存储(包括数据文件ORA或者DBF、控制文件、联机日志、参数文件等)。

2、实例

        Oracle数据库实例是Oracle数据库运行时的实体,是操作系统进程和内存结构的集合。也就是说一个Oracle实例由一系列的后台进程和内存结构组成,一个数据库可以有n个实例。

3、数据文件

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

4、表空间

        表空间是Oracle对物理数据上相关数据文件的逻辑映射。

77ee6a6cfa37456882e3d8207fc7c9d4.png

5、段

        段是一个逻辑数据存储单元,可以包含单个表、索引或其他对象。

6、区

        区是分配给段的物理存储单元,通常包含多个数据块。

7、块

        块是Oracle数据库中最小的物理存储单元,通常包含多条记录。

8、用户

        Oracle中的用户和MySQL中的用户不同,MySQL中的用户登录之后可以看到所有的数据库。而Oracle中存在多个用户、每一个用户对应一个应用,用户是在表空间下建立的。用户登陆后只能看到和操作自己的表, ORACLE 的用户与 MYSQL 的数据库类似,每建立一个应用需要创建一个用户。在用户下面创建表。

afcd9d9c825f437aabaf76775be521f9.png

3、安装配置PLSQL Developer(可视化工具) 和远程连接Oracle

  • 远程连接Oracle数据库

        需要使用工具:instantclient

                         659c586956f0412a9b4c96d2a188f6bd.png

         在cmd中进入到改文件目录中,执行如下命令(注意是在本机中操作,从本机连接虚拟机中的Oracle数据库):

51f19362af3e489d95f97d5820066970.png

 即可远程连接到Oracle数据库。

  • 图形可视化界面工具

        Oracle本身没有可视化界面,需要使用第三放工具:PLSQL Developer,下载该工具进行安装即可(注意安装目录不能带有空格或者中文)。

安装完成之后,打开软件如图,对该软件进行配置:

7df0d3f555f84442a12a9cc7405e45dc.png

 68cf7183e65647518de0d737458b105e.png

 这样就可以使用这个图形化工具进行远程连接。

接下来继续配置

5c5e77c6b0874ac2b0318639b0aa6cd8.png

 复制到本机的任一目录下即可,然后用记事本打开该文件,对该文件进行修改配置:

b88454a64a724407ad564995dcf6f2f8.png

344c4b09c18e4a3c8a813754a3ab38b3.png

 然后在本机配置环境变量:

480842c342534a08941cfad27297040c.png

18aae744a229458f8be318a42c0ae8f8.png

 然后打开PLSQL Developer软件,输入用户、密码等信息即可远程连接到Oracle数据库:

                b48ae6f2aec940c2988f64aaae472b01.png

7bbaf1f17ae34c19a13a4c475892477e.png

 处理中文乱码问题:

9f5803fe5755487d941e8ad7b7c07b2f.png

 打开SQL Window,在这个界面输入SQL语句:

select userenv('language') from dual

cf33ce14113943a2a61b2f0b1e2ce71a.png

点击F8执行SQL:

b3527fbf5ba1484d9e7109f0963d6103.png

得到这个结果 ,复制这个结果,在本机配置环境变量:

6880def2e90744f0a5591899c5ef0944.png

 配置完环境变量,重启PLSQL Developer生效。

4、使用OraCle

  • 创建表空间
create dataspace 表空间名称
datafile '数据文件存放位置及名称'
size 数据文件大小
autoextend on 
size 每次扩容的大小

0d82fa6812eb47379a81ad89180c39bc.png

 执行成功之后能够在虚拟机中看到数据文件

3a65344256b747b4a65d44bc7730f902.png

 或者在PLSQL Developer右侧看见该数据文件

6b547aaa3beb449394e346d6335f4929.png

  •  创建用户

         注:一个表空间下,可以创建多个用户

create user 用户名称
identified by  用户密码
default tablespace 指定该用户属于哪一个表空间

8d11565127904c76a0811b84e90dd0eb.png

 执行之后再右侧能够看到创建的用户:

651bc04d93e244ff9a41f82935e9554f.png

 然后用刚刚创建的用户去进行登录

e85f6aed0f0648d080452c04e2c4c409.png

出现该错误是因为刚刚创建的用户不具有创建会话的权限,也就是说它啥也不能干,这也是oracle安全性高的体现,可以具化每一个用户的功能。

所以接下要通过system用户给wateruser用户赋权:

grant dba to 要赋予权限的用户名称

ac983dbb057c4d7094b8acf29d69525e.png

 之后我们就可以使用wateruser用户进行登录

22279b76682c4080a075523df116600f.png

 建表之前的步骤已经完成,下面就可以进行建表

  • 创建表

语法:

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
)

33215a2876324acfbf58323a307acdf7.png

 可以在右侧看见表已经创建成功。

表的创建、修改、删除

(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找到。

4b4d18eab63b4492869994344014e2b7.png

 把这个jar包复制出来

7cfa989771654c7182511fc633dd14f8.png

 创建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));
    }
}

查询数据库中是否有该条记录

a2bc398951194c24a99bc25433f56276.png

 可以看到数据已经插入到数据库中。

修改的方法和添加相同,不同的地方在于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));

    }
}

d297be34e86c484db35141f9cee887d4.png

 可以看到数据修改成功。

删除数据,也是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);
        }
    }

测试

          5d8c0a908fe04985a4eca298fa502a80.png

 结果

3b0d5ffc8bc3415b9622cda9988a0718.png

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