事务是指作为单个逻辑工作单元执行的一组相关操作。这些操作要求全部完成或者全部不完成。使用事务是为了保证数据的安全有效。
事务有一下四个特点:(ACID)
原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。一致性(Consistence):事务完成时,要使所有所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障,也不应该丢失。自动开启于DML 之 insert delete update
rollback只能对未提交的数据撤销,已经Commit的数据是无法撤销的,因为commit之后已经持久化到数据库中。
前面的DDL(Data Definition Language 数据定义语言)用于操作对象和对象的属性。
DDL的主要语句(操作)
DML(Data Manipulation Language 数据操控语言)用于操作数据库对象中包含的数据,也就是说操作的单位是记录。
DML的主要语句(操作)
使用场景:
添加记录时需要满足一下条件:
类型长度兼容: 字段兼容值值满足约束:主键(唯一+非空) 非空(必填) 唯一(不重复) 默认(没有填写使用默认值) 检查(满足条件) 外键(参考主表主键列的值)个数必须相同: 指定列,个数顺序与列相同;没有指定,个数与表结构的列个数和顺序相同(null也得占位,没有默认值)添加数据:
insert into 表名values(和表结构顺序和个数和类型一致的数据可以手写也可以从别的表中获取的); insert into 表名(指定列名) values(和指定的列个数、顺序、类型一致的列数据)update为修改数据
update 表名 set 字段=值[,....] where 过滤行记录;要求:
记录存在类型长度兼容: 字段兼容值个数相同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:java database connectivity —> java与数据库的连接
java 制定标准,不同的数据库厂商实现接口即可。java 中提供的接口java.sql.*包下,常用接口如下:
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")Statement 是Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。执行静态SQL 语句并返回它所生成结果的对象。
创建:连接.Connection.createStatement() 执行:ddl -->execute(dd语句) --通常不会在代码中执行 dml -->executeUpdate(dml语句) select -->executeQuery(select)
特点:处理不变的静态的sql语句
优点:直接查看sql ,方便处理错误 缺点:性能不高拼接sql麻烦可能存在sql注入
PreparedStatement 接口继承了Statement,并与之在两方面有所不同:有人主张,在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。
由于PreparedStatement 对象已预编译过,所以其执行速度要快于Statement 对象。因此,多次执行的SQL 语句经常创建为PreparedStatement 对象,以提高效率。
创建:创建:连接.prepareStatement(sql) 执行:先填充参数再执行 ddl -->execute() dml -->executeUpdate() select -->executeQuery() 特点:处理不变的静态的sql语句、可变的sql语句、带? 的sql
优点:性能高,方便编写sql 不存在sql注入安全
缺点:不能直接打印sql语句不方便处理错误
释放资源的原则是先打开的后关闭,则我们的顺序一般为:结果集->处理块->连接
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(); } }