日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC的入门案列以及JDBC的对事务的管理

發布時間:2024/4/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC的入门案列以及JDBC的对事务的管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDBC的概念

Java數據庫連接,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規范客戶端程序如何來訪問數據庫的應用程序接口,提供了諸如查詢和更新數據庫中數據的方法。
JDBC本質上是一個接口,是一種規范.

這里我以Mysql數據庫為例子:
通俗來講就是使用Java代碼來訪問數據庫,對表進行增刪改查的操作.

入門案列HelloWorld

1.首先準備數據庫中數據 -- 創建hello表 CREATE TABLE hello(id INT,`name` VARCHAR(10) ); -- 添加數據 INSERT INTO hello VALUES(1,'hello'); INSERT INTO hello VALUES(2,'world');

2.導入jar包
https://mvnrepository.com/ 可以在這個maven網站去下載
mysql-connector-java-5.1.37-bin.jar

3.編寫java代碼

//第一個jdbc程序 public class HelloWorld {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*第一步:注冊驅動 -- 在sql5版本后,這個步奏可以省略,因為在jar包下有個Driver配置文件,已經幫我們注冊了本身沒在內存里面,需要加載才能使用,什么情況觸發類加載1.new2.使用靜態方法3.加載子類的時候,父類也會加載*/Class.forName("com.mysql.jdbc.Driver");/*第二步:獲取連接對象 -- 通過DriverManager的方法獲取jdbc:mysql 是一種協議和http類似 通過這個協議,就知道是jdbc和mysql的連接192.168.93.132 是安裝mysql的服務器的ip地址 3306 是對應的端口號,jdbc表示你要操作的那個庫,后面的是mysql用戶名密碼*/Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");/*第三步:獲取語句執行對象通過Connection對象獲取語句對象作用:封裝sql語句,執行sql語句1.DML:結果是影響的行數 int類型2.Dql:結果是resultSet 結果集*/Statement statement = connection.createStatement();/*第四步:獲取返回的結果集執行查詢語句,得到結果集對象作用:封裝mysql服務器響應的數據*/ResultSet resultSet = statement.executeQuery("select * from hello");/*循環打印每個結果resultSet.next()方法是返回一個Boolean的值,如果結果集中有下一行數據,就返回true*/while (resultSet.next()) {System.out.print(resultSet.getInt("id") + " " + resultSet.getString("name") + "\n");}//第五步:釋放資源statement.close();resultSet.close();connection.close();} }

4.執行結果

總結Jdbc入門案列

由上面的代碼得出jdbc的通用套路分為以下幾步1.通過類加載器注冊驅動-- 在sql5版本后,這個步奏可以省略,因為在jar包下有個Driver配置文件,已經幫我們注冊了2.獲取連接對象通過DriverManager.getConnection(參數詳見代碼);獲取到連接對象Connection3.通過連接對象得到執行語句對象通過connection.createStatement();得到Statement執行語句對象4.通過statement對象的以下兩個方法執行語句statement.executeQuery(sql語句);-->這是執行的是DQL語句,返回的是ResultSet結果集,這個結果集相當于List<Map<String,Object>>statement.executeUpdate(sql語句);-->這是執行的是DML語句,返回的是影響的行數

圖示:

解決SQL注入

從上面的入門案列中我們使用的執行語句對象是statement,這個對象在執行sql語句的時候是對sql語句進行字符串拼接,所以會存在sql注入風險
PreparedStatement
它的父接口是Statement,Prepared準備好的SQL語句。MySQL中的語句也是要編譯以后才執行,編譯是需要消耗時間的。
比父接口更強大的地方:
1.SQL語句會預先編譯,執行效率會更高。
2.解決SQL注入的問題,更安全
3.SQL語句代碼的可讀性更好,所有要替換的參數使用占位符,占位符是?問號

/*** 模擬登錄解決sql注入的問題,對入門案列的改造*/ public class LoginUser {public static void main(String[] args) throws ClassNotFoundException, SQLException {/*第一步:注冊驅動 -- 在sql5版本后,這個步奏可以省略,因為在jar包下有個Driver配置文件,已經幫我們注冊了*/Class.forName("com.mysql.jdbc.Driver");/*第二步:獲取連接對象 -- 通過DriverManager的方法獲取*/Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");/*第三步:獲取預編譯語句執行對象通過Connection對象獲取預編譯語句對象*///定義兩個字符串來模擬用戶傳遞的用戶名密碼,String username = "user";String password = "mima";//通過連接對象獲取預編譯語句對象PreparedStatement pst = connection.prepareStatement("select * from user where username=? and password=?");//傳遞參數:參數1表示語句中的第一個問號,2就是第二個問號pst.setString(1,username);pst.setString(2,password);//執行查詢方法,返回結果集ResultSet resultSet = pst.executeQuery();/*第四步:獲取返回的結果集執行查詢語句,得到結果集對象作用:封裝mysql服務器響應的數據*/while (resultSet.next()) {//如果查詢出有結果集,表示有這個用戶,就打印登錄成功System.out.println("登錄成功");}//第五步:釋放資源pst.close();resultSet.close();connection.close();} }

JDBC對事務的管理

通過連接對象中的方法來實現事務管理:注意事務管理的連接對象要是同一個

Connection接口中與事務有關的方法:

void setAutoCommit(boolean autoCommit) 設置事務的提交方式true 表示自動提交false 表示手動提交如果要開啟事務,設置為false
void commit() 提交事務
void rollback() 回滾事務

目標
使用JDBC來處理事務:實現銀行轉賬的操作

1.數據準備

-- 準備數據,創建賬戶表 CREATE TABLE `account` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) DEFAULT NULL, `money` DOUBLE DEFAULT NULL, PRIMARY KEY (`id`) );-- 添加數據 INSERT INTO account VALUES(NULL,'小付',1000),(NULL,'小花',1000);

表中的數據:

JDBC控制事務模擬轉賬代碼:

public class ZhuanZhang {public static void main(String[] args) throws Exception {//調用轉賬方法,讓A給B轉100元錢zhuanQian("小付","小花",900D,1100D);}/***假設2個人都是1000 元* @param nameA 轉錢的用戶* @param nameB 收錢的用戶* @param moneyA 模擬轉多少錢后更新表中的錢* @param moneyB 模擬收多少錢后更新表中的錢*/public static void zhuanQian(String nameA,String nameB,Double moneyA,Double moneyB){Connection connection = null;//獲取連接對象try {connection = DriverManager.getConnection("jdbc:mysql://192.168.93.132:3306/jdbc", "root", "root");} catch (SQLException throwables) {throwables.printStackTrace();}try {//開啟事務 false表示關閉自動提交事務connection.setAutoCommit(false);//得到預編譯語句對象,先執行減錢的一方PreparedStatement pstA = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstA.setDouble(1,moneyA);pstA.setString(2,nameA);pstA.executeUpdate();//得到預編譯對象,執行加錢的一方PreparedStatement pstB = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstB.setDouble(1,moneyB);pstB.setString(2,nameB);pstB.executeUpdate();//執行到這里說明都沒有問題就提交事務connection.commit();} catch (SQLException throwables) {//說明sql語句出現異常,就回滾事務,讓數據回到最初的時候try {connection.rollback();} catch (SQLException e) {e.printStackTrace();}throwables.printStackTrace();} finally {//釋放資源try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}} }

執行代碼后數據庫信息:

我們先還原數據庫的數據,都為1000元:
然后在代碼中制造一個異常:

//得到預編譯語句對象,先執行減錢的一方PreparedStatement pstA = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstA.setDouble(1,moneyA);pstA.setString(2,nameA);pstA.executeUpdate();//制造異常 制造一個通用異常int a = 1/0;//得到預編譯對象,執行加錢的一方PreparedStatement pstB = connection.prepareStatement("UPDATE account SET money = ? WHERE NAME = ?");pstB.setDouble(1,moneyB);pstB.setString(2,nameB);pstB.executeUpdate();

執行發現數據庫中的數據沒有任何變化,控制臺爆出異常

然后查詢數據庫發現數據并沒有發生改變

所以我們發現當代碼執行中出現異常,進行了事務回滾.

總結

以上是生活随笔為你收集整理的JDBC的入门案列以及JDBC的对事务的管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。