JDBC、Transaction

###jdbc程序###

一、搭建实验环境 :
1、在mysql中创建一个库,并创建user表和插入表的数据。
2、新建一个Java工程,并导入数据驱动。
二、编写程序,在程序中加载数据库驱动
Driver driver = new Driver();
DriverManager.registerDriver(driver);
//由于driver里面有个静态代码块,它把DriverManager.registerDriver(new Driver());执行了
//所以可以简化 用反射来调用
Class.forName(“com.mysql.jdbc.Driver”);

三、建立连接(Connection)
//url,username,password,可以通过properties(硬编码)来获得
Connection conn = DriverManager.getConnection(url,username,password);
四、创建用于向数据库发送SQL的Statement对象,并发送sql

String sql = "select * from user where name = ? and password = ?";

Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//由于可能出现数据库注入问题,所以一般使用
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
ResultSet resultSet = preparedStatement.executeQuery();

五、从代表结果集的ResultSet中取出数据,打印到命令行窗口
//对sql查询结果的封装。内部有一个游标,初始时,指向第一行数据之前,在查询数据之前必须先调用一下next方法。
//提供get方法可以用来获取相应的数据。

六、断开与数据库的连接,并释放相关资源
conn statement resultSet
//这三个都是资源,得释放 .close();

###jdbc优化###
二、三、六可以合并成一个JdbcUtil类,直接调用类的方法来实现

###jdbc重要的对象and方法

conn.createStatement():创建向数据库发送sql的statement对象。
conn.preparedStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。

statement.executeQuery(String sql) :用于向数据发送查询语句。
statement.executeUpdate(String sql):用于向数据库发送insert、update或delete语句

resultSet.getString();//根据数据类型转换表来确定get后面的类型

###批处理###

Statement.addBatch(sql)
Statement.executeBatch()//方法:执行批处理命令
Statement.clearBatch()//方法:清除批处理命令


事务

###什么是事务
一组操作,要么全部成功,要么全部不成功。

之前直接执行一条sql语句,有事务,事务自动提交。
若想让多条sql语句同时成功或失败,必须将这些sql语句放在同一个事务内

###事务的使用

//数据库操作事务

start transaction //开启事务设置事务不自动提交
rollback //使事务回滚到开启事务时的状态
commit//提交事务,保存更改

//JDBC控制事务

connection.setAutoCommit(false)//设置事务不自动提交
connection.rollback()//使事务回滚到开始状态
connection.commit()//提交事务,保存更改
//设置事务回滚点
Savepoint sp = connection.setSavepiont();
connection.rollback(sp);
connection.commit();//到回滚点后必须提交

###事务的特性

//A:原子性
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
//C:一致性
双方进行转账,开始使双方各1k,他们之间无论怎样转账,最终加起来都会是2k
//I:隔离性
多个事务并发访问数据库,每个事务之间都不会受到其他事务影响
//D:持久性
事务一旦提交,它的影响是永久的,不可撤销

###隔离性

#隔离性做不好的影响

//脏读
	一个事务读取到了另一个事务未提交的数据
//不可重复读
	一个事务读取到了另一个事务提交的数据(这个事务开始查询是一个值,再次查询又是一个值)
//虚读(幻读)
	一个事务读取到了另一个事务新增的数据

#针对安全问题,数据库提供的隔离级别

read uncommitted 最低级别,所有问题都无法避免
read committed 可避免脏读
repeatable read 可避免脏读,不可重复读(在mysql中也可以避免虚读)
serializable 无法并发访问数据库

#事务隔离设置语句
	//修改之后,另一方命令行需重新连接
select @@transaction_isolation;
set global/session transaction isolation level read uncommitted;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章