Oracle
一、事务
事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。
事务有一下四个特点:(ACID)
原子性(Atomic)
:事务中所有数据的修改,要么全部执行,要么全部不执行。一致性(Consistence
):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。隔离性(Isolation)
:事务应该在另一个事务对数据的修改前或者修改后进行访问。持久性(Durability)
:保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。
1.事务的开启
自动开启于DML 之 insert delete update
2.事务的结束
1)成功
- 正常执行完成的DDL语句:create、alter、drop
- 正常执行完DCL语句GRANT、REVOKE
- 正常退出的SQLPlus或者SQL Developer等客户端
- 如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
- 手动提交:使用commit
2)失败
- ollback,手动回滚
- 非法退出意外的断电
rollback只能对未提交的数据撤销,已经Commit的数据是无法撤销的,因为commit之后已经持久化到数据库中。
二、DML
前面的DDL(Data Definition Language 数据定义语言)
用于操作对象和对象的属性。
DDL的主要语句(操作)
DML(Data Manipulation Language 数据操控语言)
用于操作数据库对象中包含的数据,也就是说操作的单位是记录。
DML的主要语句(操作)
使用场景:
1.insert
insert into 表名[(字段列表)] values(值列表);--添加记录
添加记录时需要满足一下条件:
- 类型长度兼容: 字段兼容值
- 值满足约束:主键(唯一+非空) 非空(必填) 唯一(不重复) 默认(没有填写使用默认值) 检查(满足条件) 外键(参考主表主键列的值)
- 个数必须相同: 指定列,个数顺序与列相同;没有指定,个数与表结构的列个数和顺序相同(null也得占位,没有默认值)
添加数据:
insert into 表名values(和表结构顺序和个数和类型一致的数据可以手写也可以从别的表中获取的);
insert into 表名(指定列名) values(和指定的列个数、顺序、类型一致的列数据)
1)创建序列:一般为一张表准备一个序列
create sequence seq_user_id increment by 1 start with 1 ;
create sequence seq_txt_id increment by 1 start with 1 ;
2)添加所有列
--没有列|所有列所有字段,没有默认值,非空可以使用null占位
insert into tb_user values (seq_user_id.nextval,'test','test123',null,'女',null,sysdate);
3)添加指定列
--指定所有列
insert into tb_user(username,userid,userpwd,gender,age,email,regtime) values ('shsxt',seq_user_id.nextval,'verygood','男',27,'bjsxt@qq.com.cn',sysdate);
--指定部分列(非空列和默认值列可以选填, 必填项|主键列必须指定,没有指定列如果存在默认值,使用默认值填充,否则null填充)
insert into tb_user(username,userid,userpwd) values ('shsh',seq_user_id.nextval,'shanghai');
commit;--提交事务
4)添加外键
--添加同时查询:使用一条sql 查询外键,直接添加(少用,外键只有一个值,多个值运行错误)一条sql搞定
insert into tb_txt(txtid,title,userid) values(seq_txt_id.nextval,'iphone6来了',(select userid from tb_user where username='穷屌丝男'));
5)添加时间
--添加时间
insert into tb_user(username,userid,userpwd,age,regtime) values ('java程序猿',seq_user_id.nextval,'bjsxt',20,to_date('2014-10-31','yyyy-mm-dd'));
commit;
6)从已有表中添加数据
select * from emp_his;
insert into emp_his(empno,ename,job) select empno,ename,job from emp where sal>2000;
rollback;--事务回滚
select * from emp_his;
insert into emp_his select empno, ename, job, mgr, hiredate, sal , comm, deptno from emp where deptno=20;
2.update
update为修改数据
update 表名 set 字段=值[,....] where 过滤行记录;
要求:
- 记录存在
- 类型长度兼容: 字段兼容值
- 个数相同
1)手动更改字段值
select * from tb_user;
--重置所有人员的密码8888
update tb_user set userpwd=8888 where 1=1;
rollback;
--修改shsxt的密码和年龄
update tb_user set userpwd='good',age=29 where username='shsxt' and userpwd='verygood';
commit;
2)从表中获取
--了解将用户名与密码对换
update tb_user set(username,userpwd)=(select userpwd,username from tb_user where userid=6) where userid=6;
--select 只能返回一行数据:
update tb_user set(username,userpwd)=(select userpwd,username from tb_user ) where userid=6;
3.delete
delete删除数据
delete [from] 表名 where 过滤行记录
说明:
- delete 可以删除指定部分记录,删除全部记录
- 记录上存在主外键关联时,删除存在关联的主表的记录时,注意参考外键约束,约束强制不让删除先删除从表再删除主表
--删除全部数据
delete from tb_user where 1=1;
--删除指定数据
delete from tb_user where userid<10;
--主外键关联时,注意参考约束,约束强制不让删除
--先删除从表再删除主表
delete from tb_txt where 1=1;
delete from tb_user where 1=1;
commit;
截断数据与删除数据区别truncate 与delete 区别:
- truncate -->ddl ,不涉及事务,就不能回滚,delete -->dml ,涉及事务,可以回滚
- truncate 截断所有的数据delete 可以删除全部或者部分记录
- truncate从结构上检查是否存在主外键,如果存在,不让删除
- delete 从记录上检查是否存在主外键,如果存在,按参考外键约束进行删除
三、JDBC
jdbc:java database connectivity —> java与数据库的连接
1.面向接口编程
java 制定标准,不同的数据库厂商实现接口即可。java 中提供的接口java.sql.*包下,常用接口如下:
2.jdbc步骤
3.连接
1)准备工作
- 引入驱动包
- 构建路径build path
- 测试用户是否正确登录
2)建立连接
1.连接字符串
驱动:oracle.jdbc.driver.OracleDriver
url:jdbc:oracle:thin:@db服务器地址:端口:实例
连接url–>jdbc:oracle:thin:@localhost:1521:orcl
用户名与密码: scott tiger
2.编写测试类
加载驱动
- 硬编码: new oracle.jdbc.driver.OracleDriver();
- 软编码: class.forName(“oracle.jdbc.driver.OracleDriver”);
建立连接:
Connection con =DriverManager.getConnection("jdbc:oracle:thin:@locahost:1521:orcl","SCOTT","TIGER")
4.处理块
1)静态处理块Statement
Statement 是Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。执行静态SQL 语句并返回它所生成结果的对象。
创建
:连接.Connection.createStatement()
执行
:ddl -->execute(dd语句) --通常不会在代码中执行
dml -->executeUpdate(dml语句)
select -->executeQuery(select)
特点
:处理不变的静态的sql语句
优点:直接查看sql ,方便处理错误
缺点:性能不高拼接sql麻烦可能存在sql注入
2)预处理块PreparedStatement
PreparedStatement 接口继承了Statement,并与之在两方面有所不同:有人主张,在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。
由于PreparedStatement 对象已预编译过,所以其执行速度要快于Statement 对象。因此,多次执行的SQL 语句经常创建为PreparedStatement 对象,以提高效率。
创建
:创建:连接.prepareStatement(sql)
执行
:先填充参数再执行
ddl -->execute()
dml -->executeUpdate()
select -->executeQuery()
特点
:处理不变的静态的sql语句、可变的sql语句、带? 的sql
优点:性能高,方便编写sql 不存在sql注入安全
缺点:不能直接打印sql语句不方便处理错误
5.释放资源
释放资源的原则是先打开的后关闭,则我们的顺序一般为:结果集->处理块->连接
public class Jdbc001 {
public static void main(String[] args) throws Exception{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接
// 服务器地址, 端口,实例
String url = "jdbc:oracle:thin:@localhost:1521:XE";
// 用户名
String user = "SCOTT";
//密码
String password = "TIGER";
Connection conn = DriverManager.getConnection(url,user,password);
//3.定义sql语句
String sql = "select * from emp";
//4.获取可以发送sql的工具
Statement statement = conn.createStatement();
//5.执行sql语句
ResultSet rs = statement.executeQuery(sql);
//6.查询 获取数据
/* rs.next();
String name = rs.getString("ename");
System.out.println(name);*/
//获取所有ename
while(rs.next()){
String name = rs.getString(2);
System.out.println(name);
}
//7.释放资源(先开后关)
rs.close();
statement.close();
conn.close();
}
}