摘要:由來與描述沒有前開發者想操作數據庫,必須需要了解每個數據庫對應的數據庫驅動程序,由于每個數據庫驅動程序的都不同,所以當需要遷移數據庫時,根本不平滑,需要大量修改與重寫有了后公司也知道問題之后,就提出一種約束規范,讓所有數據庫廠商都按照這個規
JDBC由來與描述
沒有JDBC前
開發者想操作數據庫,必須需要了解每個數據庫對應的數據庫驅動程序API,由于每個數據庫驅動程序的API都不同,所以當需要遷移數據庫時,根本不平滑,需要大量修改與重寫
有了JDBC后
Sum公司也知道問題之后,就提出一種約束 —— JDBC規范,讓所有數據庫廠商都按照這個JDBC規范來開發數據庫驅動程序,以便于Java程序能用統一方式操作不同的數據庫,數據庫遷移變成可行
JDBC描述
JDBC是一種Java web的規范,需要具體開發者(數據庫廠商)來實現JDBC常用四大API
DriverManager
作用: 1、注冊驅動 Class.forName("com.jdbc.mysql.Driver"); 2、獲取連接 Connection conn = DriverManager.getConnection();
Connection
作用: 1、創建執行SQL語句的對象(3種) Statement createStatement() // 執行SQL語句 PreparedStatement prepareStatement() // 預編譯SQL并執行 CallableStatement prepareCall() // 執行SQL存儲過程 2、進行事務管理 setAutoCommit(boolean b) commit() rollback()
Statement
作用: 1、執行SQL語句 boolean execute(String sql) // 執行SQL語句,執行select就返回true,否則返回false ResultSet executeQuery(String sql) // 執行SQL中的select語句 int executeUpdate(String sql) // 執行SQL中的insert/update/delete語句 2、執行批量SQL語句 addBatch(String sql) // 添加到批量處理 executeBatch() // 執行批量處理 clearBatch() // 清空批量處理
ResultSet
(select語句)查詢結果的集合 作用:獲取到查詢的結果 next() //判斷是否有下一條數據 getXXX() //根據數據類型獲取查詢記錄的數據 getObject() //通用獲取數據方法JDBC資源釋放
釋放原則:晚創建,早釋放;資源稀有,不釋放很快會阻塞
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from user"); rs.close(); stmt.close(); conn.close();JDBC CURD操作
增加
Connection conn = null; Statement stmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 獲取執行SQL語句對象 stmt = conn.createStatement(); // 編寫SQL String sql = "insert into user values ("xiaomin","女人",12)"; // 執行SQL語句 int i = stmt.executeUpdate(sql); if(i > 0){ System.out.println("插入成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(stmt != null){ try{ stmt .close(); }catch(SQLException e){ e.printStackTrace(); }finally{ stmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
更新
Connection conn = null; Statement stmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 獲取執行SQL語句對象 stmt = conn.createStatement(); // 編寫SQL String sql = "update user set name = "wt""; // 執行SQL語句 int i = stmt.executeUpdate(sql); if(i > 0){ System.out.println("更新成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(stmt != null){ try{ stmt .close(); }catch(SQLException e){ e.printStackTrace(); }finally{ stmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
刪除
Connection conn = null; Statement stmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 獲取執行SQL語句對象 stmt = conn.createStatement(); // 編寫SQL String sql = "delete from user where id = 3"; // 執行SQL語句 int i = stmt.executeUpdate(sql); if(i > 0){ System.out.println("刪除成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(stmt != null){ try{ stmt .close(); }catch(SQLException e){ e.printStackTrace(); }finally{ stmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
查詢
Connection conn = null; Statement stmt = null; ResultSet rs = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 獲取執行SQL語句對象 stmt = conn.createStatement(); // 編寫SQL String sql = "select * from user"; // 執行SQL語句 rs = stmt.executeQuery(sql); if(rs.next()){ System.out.print(rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); }finally{ if(rs != null){ try{ rs .close(); }catch(SQLException e){ e.printStackTrace(); }finally{ rs = null; } } if(stmt != null){ try{ stmt .close(); }catch(SQLException e){ e.printStackTrace(); }finally{ stmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }JDBC SQL注入解決方案
開發時,使用 PreparedStatement對象 取代 Statement對象 來執行SQL,有效避免SQL注入
增加
Connection conn = null; PreparedStatement pstmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 編寫SQL String sql = "insert into user values (?,?,?)"; // 獲取執行SQL語句對象 pstmt = conn.preparedStatement(sql); // 設置參數 pstmt.setString(1, "qqq"); pstmt.setString(2, "bbb"); pstmt.setString(3, "ccc"); // 執行SQL語句 int i = pstmt.executeUpdate(); if(i > 0){ System.out.println("插入成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ pstmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
更新
Connection conn = null; PreparedStatement pstmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 編寫SQL String sql = "update user set name = ?, age = ?, pwd = ? where id = ?"; // 獲取執行SQL語句對象 pstmt = conn.preparedStatement(sql); // 設置參數 pstmt.setString(1, "wt"); pstmt.setString(2, 15); pstmt.setString(3, "basdcx"); pstmt.setString(4, 10); // 執行SQL語句 int i = pstmt.executeUpdate(); if(i > 0){ System.out.println("更新成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ pstmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
刪除
Connection conn = null; PreparedStatement pstmt = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 編寫SQL String sql = "delete from user where id = ?"; // 獲取執行SQL語句對象 pstmt = conn.preparedStatement(sql); // 設置參數 pstmt.setString(1, 16); // 執行SQL語句 int i = pstmt.executeUpdate(); if(i > 0){ System.out.println("刪除成功!"); } }catch(Exception e){ e.printStackTrace(); }finally{ if(pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ pstmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }
查詢
Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try{ // 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲得連接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/myDB","root","root"); // 編寫SQL String sql = "select * from user where sex = ?"; // 獲取執行SQL語句對象 pstmt = conn.preparedStatement(sql); // 設置參數 pstmt.setString(1, "男"); // 執行SQL語句 rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); }finally{ if(rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ rs = null; } } if(pstmt != null){ try{ pstmt.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ pstmt = null; } } if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); }finally{ conn = null; } } }連接池(數據源)JDBC優化技術
數據庫連接頻繁創建與消耗,在資源使用上是一種浪費
常用連接池
C3P0、HikariCP、Druid、Tomcat、Dbcp
用法(以C3P0為例)
ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 只需一個對象 // 獲取連接 Connection conn = dataSource.getConnection();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72313.html
摘要:通過這個驅動程序,我們就能夠兩個數據類型的相互轉化了。和和方法可以將特定的類型轉換為特定的數據類型。和可以將幾乎任何數據類型映射到數據類型。時間與日期類型類映射到類型,和類分別映射到和數據類型。 概述 我們知道Java的數據類型和數據庫中的類型并不是一一對應的,我們在使用JDBC在與數據庫進行交互的時候,比如我們向數據庫中插入一條數據,或者從數據庫中查詢一個數據,為什么我們能夠正常的讀...
摘要:知識點總結概要知識點總結簡介為開發者使用數據庫提供了統一的編程接口,它由一組類和接口組成主要在包中。跟蹤可用的驅動程序,并在數據庫和相應的驅動程序之間建立連接。接口與特定數據庫的連接會話,在連接上下文中執行語句并返回結果。 Java知識點總結(JDBC-概要) @(Java知識點總結)[Java, JDBC] 簡介 JDBC(Java Database Connection)為Java...
摘要:軟件開發體系架構兩層架構傳統的客戶服務器系統僅只簡單地基于兩層體系來構建,即客戶端前臺和企業信息系統后臺,沒有任何中間件,業務邏輯層與表示層或數據層混在一起。 showImg(https://segmentfault.com/img/remote/1460000007090113); 理想的建筑師應該既是文學家又是數字家,他還應通曉歷史,熱衷于哲學研究,精通音樂,懂得醫藥知識,具有法學...
閱讀 3763·2023-04-25 20:00
閱讀 3116·2021-09-22 15:09
閱讀 512·2021-08-25 09:40
閱讀 3420·2021-07-26 23:38
閱讀 2209·2019-08-30 15:53
閱讀 1100·2019-08-30 13:46
閱讀 2792·2019-08-29 16:44
閱讀 2049·2019-08-29 15:32