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語句代碼的可讀性更好,所有要替換的參數使用占位符,占位符是?問號
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控制事務模擬轉賬代碼:
執行代碼后數據庫信息:
我們先還原數據庫的數據,都為1000元:
然后在代碼中制造一個異常:
執行發現數據庫中的數據沒有任何變化,控制臺爆出異常
然后查詢數據庫發現數據并沒有發生改變
所以我們發現當代碼執行中出現異常,進行了事務回滾.
總結
以上是生活随笔為你收集整理的JDBC的入门案列以及JDBC的对事务的管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter Web:Shadow R
- 下一篇: JDBC连接池C3P0,druid