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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章