oracle jdbc 处理块 预处理块-爱代码爱编程
DML
DML(Data Manipulation Language 数据操控语言)用于操作数据库对象中包含的数据,也就是说操
作的单位是记录。
insert
添加记录时需要满足一下条件
类型 长度 兼容: 字段 兼容值
值满足约束 :主键 (唯一+非空) 非空(必填) 唯一(不重复 ) 默认(没有填写使用默认值) 检查(满足条件)
外键(参考主表主键列的值)
个数必须相同: 指定列,个数顺序与列相同;没有指定,个数与表结构的列个数和顺序相同 (null也
得占位,没有默认值)
update
要求:
1. 记录存在
2. 类型 长度 兼容: 字段 兼容值
3. 个数相同
delect
delete [from] 表名 where 过滤行记录
说明:
1. delete 可以删除指定部分记录,删除全部记录
2. 记录上存在主外键关联时, 删除存在关联的主表的记录时,注意 参考外键约束, 约束强制不让删除
先删除从表 再删除主表
截断数据
事务
定义:事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。
特点:
1. 原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
2. 一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事
务进行的所有数据修改,必须在所有相关的表中得到反映。
3. 隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
4. 持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢
失。
Oracle 默认的隔离级别是 read committed。
Oracle 支持上述四种隔离级别中的两种:read committed 和 serializable。除此之外, Oralce 中还定义
Read only 和 Read write 隔离级别。
Read only:事务中不能有任何修改数据库中数据的操作语句,是 Serializable 的一个子集。
Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用。
丢失更新:两个事务同时存储, 一个存储 100 , 一个存储 200,最终可能至存储了 200 或者 100,那
另一个的更新就没成功,即结果不为预想的 300
脏读:事务 T1 更新了一行数据,还没有提交所做的修改,T2 读取更新后的数据,T1回滚,T2 读取的数
据无效,这种数据称为脏读数据。
不可重复读:事务 T1 读取一行数据,T2 修改了 T1 刚刚读取的记录,T1 再次查询,发现与第一次读取
的记录不相同,称为不可重复读。
幻读:事务 T1 读取一条带 WHERE 条件的语句,返回结果集,T2 插入一条新纪录,恰好也是 T1 的
WHERE 条件,T1 再次查询,结果集中又看到 T2 的记录,新纪录就叫做幻读。
事务的开启:
自动开启于 DML 之 insert delete update
事务的结束:
1. 成功
正常执行完成的 DDL 语句:create、alter、drop
正常执行完 DCL 语句 GRANT、REVOKE
正常退出的 SQLPlus 或者 SQL Developer 等客户端
如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
手动提交 :使用 commit
2. 失败
rollback ,手动回滚
非法退出 意外的断电
rollback 只能对未提交的数据撤销,已经 Commit 的数据是无法撤销的,因为 commit 之后已经持久化到数据库中。
DDL
DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,像:表、视图等等,DDL 对这些对象和属性的管理和定义具体表现在 create、drop 和 alter 上。特别注意:DDL 操作的“对象”的概念,”对象“包括对象及对象的属性,而且对象最小也比记录大个层次。以表举例:create 创建数据表,alter 可以更改该表的字段,drop 可以删除这个表,从这里我们可以看到,DDL 所站的高度,他不会对具体的数据进行操作。
设计表
前提: 设计表首先应该按需遵循三范式
1. 确定表名
2. 确定字段名 类型 +约束(主键 外键 非空 默 检查认 唯一)
主键: 唯一标识一条记录(唯一并且非空)
唯一: 唯一
非空:不能为空默认: 当没给值时使用给定一个默认值
外键:参考其他表(自己)的某个(某些)字段
检查:自定义的规则
创建表
表名必须唯一,如果存在 ,必须删除
创建表(追加创建约束+指定名称)
--删除 (先删除从表 再删除主表 ;同时删除约束) drop table tb_txt cascade constraints; drop table tb_user cascade constraints; 表名 tb_user 主键 userid 字段名 中文 类型 为空 默认值 其他说明 userid 流水号 number(5) 否 主键 username 用户名 varchar2(30) 否 长度在4-20 userpwd 密码 varchar2(20) 否 长度在4-18 age 年龄 number(3) 18 大于>=18 gender 性别 char(2) 男 男or 女 email 邮箱 varchar2(30) 唯一 regtime 注册日期 date sysdate create table tb_user( userid number(5), username varchar2(30) , userpwd varchar2(20) , age number(3) , gender char(2) , email varchar2(30), regtime date default(sysdate) ); --追加约束 alter table tb_user add constraint pk_user_id primary key (userid); alter table tb_user add constraint ck_user_name check(length(username)between 4 and 20) ; alter table tb_user add constraint ck_user_pwd check(length(userpwd) between 4 and 18); alter table tb_user add constraint ck_user_age check(age>=18); alter table tb_user add constraint ck_user_gender check(gender in('男','女')); alter table tb_user add constraint uq_user_email unique(email); --非空与默认 alter table tb_user modify (username constraint nn_user_name not null); alter table tb_user modify (userpwd constraint nn_user_pwd not null); alter table tb_user modify (age default(18)); alter table tb_user modify (gender default('男')); --加入注释 comment on table tb_user is '用户表'; comment on column tb_user.userid is '流水号,主键'; comment on column tb_user.username is '用户名'; comment on column tb_user.userpwd is '密码'; comment on column tb_user.age is '年龄'; comment on column tb_user.gender is '性别'; comment on column tb_user.email is '邮箱'; comment on column tb_user.regtime is '注册日期'; 表名 tb_txt 主键 txtid 字段名 中文 类型 为空 默认值 其他说明 txtid 流水号 number(10) 否 主键 title 标题 varchar2(32) 否 长度在4-30 txt 正文 varchar2(1024) pubtime 发布时间 date sysdate userid 发布人 number(5) 外键,参考tb_user的userid列 create table tb_txt( txtid number(10), title varchar2(32), txt varchar2(1024), pubtime date, userid number(5) ); --追加约束 alter table tb_txt add constraint pk_txt_id primary key(txtid); alter table tb_txt add constraint ck_txt_id check(length(title)>=4 and length(title)<=30); --三种级联删除规则 alter table tb_txt add constraint fk_txt_ref_user_id foreign key(userid) references tb_user(userid); alter table tb_txt add constraint fk_txt_ref_user_id foreign key(userid) references tb_user(userid) on delete cascade ; alter table tb_txt add constraint fk_txt_ref_user_id foreign key(userid) references tb_user(userid) on delete set null; --注意非空 默认 alter table tb_txt modify (title constraint nn_txt_title not null) ; alter table tb_txt modify (pubtime default(sysdate)); --注释 comment on table tb_txt is '文章表'; comment on column tb_txt.txtid is '流水号,主键'; comment on column tb_txt.title is '标题'; comment on column tb_txt.txt is '正文'; comment on column tb_txt.pubtime is '发布时间'; comment on column tb_txt.userid is '发布人,外键,参考tb_user的userid列';
已有表中拷贝结构
删除表
修改表结构
1. 修改表名 :rename to
2. 修改列名: alter table 表名 rename column to
3. 修改类型: alter table 表名 modify(字段 类型)
4. 修改约束: 先删除 后添加
5. 添加列: alter table 表名 add 字段 类型
6. 删除列:alter table 表名 drop column 字段
约束
在 oracle中所有的一切都是对象, 约束也是一个个的对象,除了能创建约束我们还能对约束进行一些其他的操作
查看某个用户的约束
查看表的约束
查看 字段名+约束
约束的禁用与启用
删除约束
修改约束
JDBC
角色分类
服务器 (db)
接收 sq
执行 sql
返回结果
客户端 (java)
接收数据
组装sql
发送SQL(与数据库建立联系)
分析结果
面向接口编程
1、java 制定标准 ,不同的数据库厂商实现 接口即可。java 中提供的接口 java.sql.* 包下,常用接口如下
2、oracle 厂商实现接口 (jar)
F:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar视安装路径而定
JDBC步骤
连接
准备工作:
1.引入驱动包
2.构建路径build path
3.测试用户是否正确登录
建立连接:
连接字符串
驱动: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@db 服务器地址:端口:实例
连接 url->jdbc:oracle:thin:@localhost:1521:XE
用户名: SCOTT
密码: TIGER
编写测试类
加载驱动
硬编码: new oracle.jdbc.driver.OracleDriver();
软编码: class.forName("oracle.jdbc.driver.OracleDriver")
建立连接
处理块
静态处理块Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数的简单 SQL 语句。
执行静态 SQL 语句并返回它所生成结果的对象。
创建 :
连接.Connection.createStatement()
执行 :
ddl -->execute(dd语句) -- 通常不会在代码中执行
dml -->executeUpdate(dml语句)
select -->executeQuery(select)
特点 :
处理 不变的静态的 sql 语句
优点: 直接查看sql ,方便处理错误
缺点:性能不高 拼接 sql 麻烦 可能存在 sql 注入
预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,并与之在两方面有所不同:有人主张,在 JDBC 应用中,
如果你已经是稍有水平开发者,你就应该始终以 PreparedStatement 代替 Statement.也就是说,在任
何时候都不要使用 Statement。
优点:
1. 由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement对象。因此,多次
执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
2. 防止SQL注入问题
创建:
创建:连接.prepareStatement(sql)
执行:
存在? ,先填充参数再执行
ddl -->execute()
dml -->executeUpdate()
select -->executeQuery()
特点:
处理 不变的静态的 sql 语句 |可变的 sql 语句 带 ? 的 sql
优点:性能高,方便编写sql 不存在sql注入 安全
缺点:不能直接打印sql语句 不方便处理错误
分析
执行完SQL 语句后可能成功也可能失败,如果成功,有数据则我们很大一部分情况是需要获取查询的结果。数据就是一切
ddl:没有异常就是成功
dml: 结果>0就是成功
select:分析结果集
对于 select 的结果集进行分析,类似于迭代器, 先判断(移动)再获取
next()
getXxx(索引|列名|别名)
释放资源
释放资源的原则是 先打开的后关闭, 则我们的顺序一般为: 结果集->处理块->连接