企業開發基礎-JDBC(SQL注入)

JDBC概論

1、JDBC是什么?
?? ?Java DataBase Connectivity(Java語言連接數據庫)

2、JDBC的本質是什么?
?? ?JDBC是SUN公司制定的一套接口(interface)
?? ??? ?java.sql.*; (這個軟件包下有很多接口。)

?? ?接口都有調用者和實現者。
?? ?面向接口調用、面向接口寫實現類,這都屬于面向接口編程。

?? ?為什么要面向接口編程?
?? ??? ?解耦合:降低程序的耦合度,提高程序的擴展力。
?? ??? ?多態機制就是非常典型的:面向抽象編程。(不要面向具體編程)
?? ??? ??? ?建議:
?? ??? ??? ??? ?Animal a = new Cat();
?? ??? ??? ??? ?Animal a = new Dog();
?? ??? ??? ??? ?// 喂養的方法
?? ??? ??? ??? ?public void feed(Animal a){ // 面向父類型編程。
?? ??? ??? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ?不建議:
?? ??? ??? ??? ?Dog d = new Dog();
?? ??? ??? ??? ?Cat c = new Cat();
?? ?
?? ?思考:為什么SUN制定一套JDBC接口呢?
?? ??? ?因為每一個數據庫的底層實現原理都不一樣。
?? ??? ?Oracle數據庫有自己的原理。0
?? ??? ?MySQL數據庫也有自己的原理。
?? ??? ?MS SqlServer數據庫也有自己的原理。
?? ??? ?....
?? ??? ?每一個數據庫產品都有自己獨特的實現原理。
?? ?
?? ?JDBC的本質到底是什么?
?? ??? ?一套接口。

3、JDBC開發前的準備工作,先從官網下載對應的驅動jar包,然后將其配置到環境變量classpath當中。

?? ?classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar

?? ?以上的配置是針對于文本編輯器的方式開發,使用IDEA工具的時候,不需要配置以上的環境變量。
?? ?IDEA有自己的配置方式。
?? ??

4、JDBC編程六步(需要背會)
?? ?
?? ?第一步:注冊驅動(作用:告訴Java程序,即將要連接的是哪個品牌的數據庫)

?? ?第二步:獲取連接(表示JVM的進程和數據庫進程之間的通道打開了,這屬于進程之間的通信,重量級的,使用完之后一定要關閉通道。)

?? ?第三步:獲取數據庫操作對象(專門執行sql語句的對象)

?? ?第四步:執行SQL語句(DQL DML....)

?? ?第五步:處理查詢結果集(只有當第四步執行的是select語句的時候,才有這第五步處理查詢結果集。)

?? ?第六步:釋放資源(使用完資源之后一定要關閉資源。Java和數據庫屬于進程間的通信,開啟之后一定要關閉。)

程序運行

DML語句

?
/*JDBC編程基礎六步
*/
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;public class JDBCTest01{public static void main(String[] args){Connection conn = null;Statement stmt = null;try{//1、注冊驅動Driver driver = new com.mysql.jdbc.Driver(); // 多態,父類型引用指向子類型對象。// Driver driver = new oracle.jdbc.driver.OracleDriver(); // oracle的驅動。DriverManager.registerDriver(driver);//2、獲取連接/*url:統一資源定位符(網絡中某個資源的絕對路徑)https://www.baidu.com/ 這就是URL。URL包括哪幾部分?協議IPPORT資源名http://182.61.200.7:80/index.htmlhttp:// 通信協議182.61.200.7 服務器IP地址80 服務器上軟件的端口index.html 是服務器上某個資源名jdbc:mysql://127.0.0.1:3306/bjpowernodejdbc:mysql:// 協議127.0.0.1 IP地址3306 mysql數據庫端口號bjpowernode 具體的數據庫實例名。說明:localhost和127.0.0.1都是本機IP地址。jdbc:mysql://192.168.151.27:3306/bjpowernode什么是通信協議,有什么用?通信協議是通信之前就提前定好的數據傳送格式。數據包具體怎么傳數據,格式提前定好的。oracle的URL:jdbc:oracle:thin:@localhost:1521:orcl*/String url = "jdbc:mysql://localhost:3306/bjpowernode";String user = "root";String password = "123456";conn = DriverManager.getConnection(url,user,password);// com.mysql.jdbc.JDBC4Connection@41cf53f9System.out.println("數據庫連接對象 = " + conn); //3、獲取數據庫操作對象(Statement專門執行sql語句的)stmt = conn.createStatement();//4、執行sqlString sql = "insert into dept(deptno,dname,loc) values(80,'人事部','廣州')";// 專門執行DML語句的(insert delete update)// 返回值是“影響數據庫中的記錄條數”int count = stmt.executeUpdate(sql); System.out.println(count == 1 ? "保存成功" : "保存失敗");//5、處理查詢結果集}catch(SQLException e){e.printStackTrace();}finally{//6、釋放資源// 為了保證資源一定釋放,在finally語句塊中關閉資源// 并且要遵循從小到大依次關閉// 分別對其try..catchtry{if(stmt != null){stmt.close();}}catch(SQLException e){e.printStackTrace();}try{if(conn != null){conn.close();}}catch(SQLException e){e.printStackTrace();}}}
}?

注冊驅動的另一種方式

/*注冊驅動的另一種方式(這種方式常用)
*/
import java.sql.*;public class JDBCTest03{public static void main(String[] args){try{//1、注冊驅動// 這是注冊驅動的第一種寫法。// DriverManager.registerDriver(new com.mysql.jdbc.Driver());// 注冊驅動的第二種方式:常用的。// 為什么這種方式常用?因為參數是一個字符串,字符串可以寫到xxx.properties文件中。// 以下方法不需要接收返回值,因為我們只想用它的類加載動作。Class.forName("com.mysql.jdbc.Driver");//2、獲取連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333");// com.mysql.jdbc.JDBC4Connection@41cf53f9System.out.println(conn);}catch(SQLException e){e.printStackTrace();}catch(ClassNotFoundException e){e.printStackTrace();}}
}

ResultSet

DQL語句需要Resultset,在JDBC中,ResultSet對象用于存儲和操作SQL查詢返回的結果集。當你執行一個SELECT查詢時,數據庫會返回一組符合查詢條件的記錄,這些記錄被存儲在一個ResultSet對象中。通過這個對象,你可以遍歷、檢索和修改結果集中的數據。getIntgetString方法是ResultSet接口提供的兩種常用方法,用于從當前行的指定列中檢索數據。這些方法允許你以不同的數據類型獲取查詢結果,參數為列的索引或列名。next方法用于將光標從當前位置移動到結果集的下一行。如果下一行存在,next方法會返回true;如果已經到達結果集的末尾,則返回false。這個方法在遍歷結果集的過程中非常重要,因為它控制著循環的進行,允許你逐行處理查詢結果。

DQL語句

/*處理查詢結果集(遍歷結果集。)
*/
import java.sql.*;public class JDBCTest05{public static void main(String[] args){Connection conn = null;Statement stmt = null;ResultSet rs = null;try{//1、注冊驅動Class.forName("com.mysql.jdbc.Driver");//2、獲取連接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333");//3、獲取數據庫操作對象stmt = conn.createStatement();//4、執行sqlString sql = "select empno as a,ename,sal from emp";// int executeUpdate(insert/delete/update)// ResultSet executeQuery(select)rs = stmt.executeQuery(sql); // 專門執行DQL語句的方法。//5、處理查詢結果集/*boolean flag1 = rs.next();//System.out.println(flag1); // trueif(flag1){// 光標指向的行有數據// 取數據// getString()方法的特點是:不管數據庫中的數據類型是什么,都以String的形式取出。String empno = rs.getString(1); // JDBC中所有下標從1開始。不是從0開始。String ename = rs.getString(2);String sal = rs.getString(3);System.out.println(empno + "," + ename + "," + sal);}flag1 = rs.next();if(flag1){// 以下程序的1 2 3 說的第幾列。String empno = rs.getString(1);String ename = rs.getString(2);String sal = rs.getString(3);System.out.println(empno + "," + ename + "," + sal);}*/while(rs.next()){/*String empno = rs.getString(1);String ename = rs.getString(2);String sal = rs.getString(3);System.out.println(empno + "," + ename + "," + sal);*//*// 這個不是以列的下標獲取,以列的名字獲取//String empno = rs.getString("empno");String empno = rs.getString("a"); // 重點注意:列名稱不是表中的列名稱,是查詢結果集的列名稱。String ename = rs.getString("ename");String sal = rs.getString("sal");System.out.println(empno + "," + ename + "," + sal);*/// 除了可以以String類型取出之外,還可以以特定的類型取出。/*int empno = rs.getInt(1);String ename = rs.getString(2);double sal = rs.getDouble(3);System.out.println(empno + "," + ename + "," + (sal + 100));*/int empno = rs.getInt("a");String ename = rs.getString("ename");double sal = rs.getDouble("sal");System.out.println(empno + "," + ename + "," + (sal + 200));}}catch(Exception e){e.printStackTrace();}finally{//6、釋放資源if(rs != null){try{rs.close();}catch(Exception e){e.printStackTrace();}}if(stmt != null){try{stmt.close();}catch(Exception e){e.printStackTrace();}}if(conn != null){try{conn.close();}catch(Exception e){e.printStackTrace();}}}}
}

SQL注入

什么是SQL注入?

SQL注入的核心是:用戶輸入的參數改變了SQL的語法結構。

如何解決SQL注入?

只要用戶提供的信息不參與SQL語句的編譯過程,問題就解決了。即使用戶提供的信息中含有SQL語句的關鍵字,但是沒有參與編譯,仍然不起作用。要想用戶信息不參與SQL語句的編譯,那么必須使用java.sql.PreparedStatement,PreparedStatement接口繼承了java.sql.Statement, PreparedStatement是屬于預編譯的數據庫操作對象。,原理是:預先對SQL語句的框架進行編譯,然后再給SQL語句傳“值”。Statement編譯一次,執行一次,PreparedStatement編譯一次,執行N次。

  • 明確sql語句的格式后,就不會改變了。剩余的內容都會認為是參數
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;/**什么情況下必須使用Statement呢?*      業務方面要求必須支持SQL注入的時候。*      Statement支持SQL注入,凡是業務方面要求是需要進行sql語句拼接的,必須使用Statement。*/
public class JDBCTest07 {public static void main(String[] args) {// 初始化一個界面Map<String,String> userLoginInfo = initUI();// 驗證用戶名和密碼boolean loginSuccess = login(userLoginInfo);// 最后輸出結果System.out.println(loginSuccess ? "true" : "false");}/*** 用戶登錄* @param userLoginInfo 用戶登錄信息* @return false表示失敗,true表示成功*/private static boolean login(Map<String, String> userLoginInfo) {// 打標記的意識boolean loginSuccess = false;// 單獨定義變量String loginName = userLoginInfo.get("loginName");String loginPwd = userLoginInfo.get("loginPwd");// JDBC代碼Connection conn = null;PreparedStatement ps = null; // 這里使用PreparedStatement(預編譯的數據庫操作對象)ResultSet rs = null;try {// 1、注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2、獲取連接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "333");// 3、獲取預編譯的數據庫操作對象// SQL語句的框子。其中一個?,表示一個占位符,一個?將來接收一個“值”,注意:占位符不能使用單引號括起來。String sql = "select * from student where loginName = ? and loginPwd = ?";// 程序執行到此處,會發送sql語句框子給DBMS,然后DBMS進行sql語句的預先編譯。ps = conn.prepareStatement(sql);// 給占位符?傳值(第1個問號下標是1,第2個問號下標是2,JDBC中所有下標從1開始。)ps.setString(1, loginName);ps.setString(2, loginPwd);// 4、執行sqlrs = ps.executeQuery();// 5、處理結果集if(rs.next()){// 登錄成功loginSuccess = true;}} catch (Exception e) {e.printStackTrace();} finally {// 6、釋放資源if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}return loginSuccess;}/*** 初始化用戶界面* @return 用戶輸入的用戶名和密碼等登錄信息*/private static Map<String, String> initUI() {Scanner s = new Scanner(System.in);System.out.print("用戶名:");String loginName = s.nextLine();System.out.print("密碼:");String loginPwd = s.nextLine();Map<String,String> userLoginInfo = new HashMap<>();userLoginInfo.put("loginName", loginName);userLoginInfo.put("loginPwd", loginPwd);return userLoginInfo;}
}

悲觀鎖(行級鎖)和樂觀鎖

悲觀鎖:事務必須排隊執行。數據鎖住了,不允許并發。(行級鎖:select后面添加forupdate)

樂觀鎖:支持并發,事務也不需要排隊,只不過需要一個版本號。

素材來源:動力節點杜聚賓老師。

 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11650.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[數據集][圖像分類]雜草分類數據集17509張9類別

數據集格式&#xff1a;僅僅包含jpg圖片&#xff0c;每個類別文件夾下面存放著對應圖片 圖片數量(jpg文件個數)&#xff1a;17509 分類類別數&#xff1a;9 類別名稱:["chineseapple","lantana","negatives","parkinsonia","part…

48-Qt控件詳解:Buttons Containers2

一 Group Box:組合框 #include "widget.h"#include<QGroupBox> #include<QRadioButton> #include<QPushButton> #include<QVBoxLayout>//可以在水平方向和垂直方向進行排列的控件&#xff0c;QHBoxLayout/QVBoxLayout #include <QGridLa…

vue2 el-tree樹形下拉框

由于element-vue2 中沒有el-tree-select組件&#xff0c;所以樹形下拉需要結合el-selet完成 <el-form-item label"上級部門&#xff1a;" prop"pidName"> <el-select ref"select" v-model"dialogForm.pidName" placeholder&…

Backend - 數據分析 Numpy

目錄 一、作用 二、基礎環境 &#xff08;一&#xff09;執行虛擬環境的終端命令 &#xff08;二&#xff09;代碼中導包 三、數組操作 &#xff08;一&#xff09;創建數組 1. 創建一維數組 &#xff08;1&#xff09;基本建立 &#xff08;2&#xff09;建立后&…

揚州知識付費系統招聘,你知道在線教育平臺推廣有什么技巧?

在線教育的模式有各種各樣&#xff0c;不管是哪種模式&#xff0c;在線教育的課程都有顛覆和創新性。互聯網在線教育課程可以要大家在家就可以利用碎片化時間學習&#xff0c;那在線教育平臺怎么推廣呢&#xff1f; 1、與校園和企業合作 在線教育平臺不僅能給校園的老師提供更好…

解決寶塔Nginx和phpMyAdmin配置端口沖突問題

問題描述 在對基于寶塔面板的 Nginx 配置文件進行端口修改時&#xff0c;我注意到 phpMyAdmin 的端口配置似乎也隨之發生了變化&#xff01; 解決方法 官方建議在處理 Nginx 配置時&#xff0c;應避免直接修改默認的配置文件&#xff0c;以確保系統的穩定性和簡化后續的維護…

大數據可視化實驗三——數據可視化工具使用

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1. 下載并安裝Tableau軟件.. 1 2. 使用HTML5繪制Canvas圖形.. 2 3. 使用HTML5編寫SVG 圖形... 5 4. 使用R 語言編寫可視化實例.. 7 四、總結與心得體會... 7 五、思考問題... 8 一、實驗目的 1&#xff…

C++-Linux工程管理

1 Makefile和CMake實踐 1.1 Makefile 參考 簡介&#xff1a; Makefile是一種用于自動化構建和管理程序的工具。它通常用于編譯源代碼、鏈接對象文件以生成可執行文件或庫文件。Makefile以文本文件的形式存在&#xff0c;其中包含了一系列規則和指令&#xff0c;用于描述程序的…

python數據分析——seaborn繪圖1

參考資料&#xff1a;活用pandas庫 matplotlib庫是python的和興繪圖工具&#xff0c;而seaborn基于matplotlib創建&#xff0c;它為繪制統計圖提供了更高級的接口&#xff0c;使得只用少量代碼就能生成更美觀、更復雜的可視化效果。 seaborn庫和pandas以及其他pydata庫&#xf…

Go 阻塞

阻塞 在Go語言中&#xff0c;阻塞通常指的是一個goroutine&#xff08;輕量級線程&#xff09;在等待另一個goroutine完成操作&#xff08;如I/O操作、channel通信等&#xff09;時&#xff0c;暫時停止執行的現象。Go語言提供了多種同步和通信機制&#xff0c;可以用于實現阻…

數據賦能(86)——數據要素:管理核心框架

數據管理的核心框架是一個綜合性的體系&#xff0c;旨在確保數據的有效利用、安全性以及合規性。這個框架主要包含了以下幾個關鍵組成部分&#xff1a; 數據治理策略與目標&#xff1a;明確數據管理的整體戰略和目標&#xff0c;包括數據價值的釋放、數據資產地位的確定、多元…

OpenHarmony 實戰開發——移植通信子系統

通信子系統目前涉及Wi-Fi和藍牙適配&#xff0c;廠商應當根據芯片自身情況進行適配。 移植指導 Wi-Fi編譯文件內容如下&#xff1a; 路徑&#xff1a;“foundation/communication/wifi_lite/BUILD.gn” group("wifi") {deps [ "$ohos_board_adapter_dir/ha…

C++基礎與深度解析 | 數組 | vector | string

文章目錄 一、數組1.一維數組2.多維數組 二、vector三、string 一、數組 1.一維數組 在C中&#xff0c;數組用于存儲具有相同類型和特定大小的元素集合。數組在內存中是連續存儲的&#xff0c;并且支持通過索引快速訪問元素。 數組的聲明&#xff1a; 數組的聲明指定了元素的…

前端人員如何理解進程和線程

進程和線程的概念&#xff1a; 進程和線程本質都是cpu工作過程的時間片。 進程可以理解為cpu在運行指令即加載保存上下文所要用的時間。也可以理解為一個應用程序運行的實例。 線程是進程中更小的單位&#xff0c;描述一段指令所需要的時間。 進程是資源分配的最小單位&#xf…

【數據結構】數組循環隊列的實現

隊列&#xff08;Queue&#xff09;是一種特殊的線性數據結構&#xff0c;它遵循FIFO&#xff08;First In First Out&#xff0c;先入先出&#xff09;的原則。隊列只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#…

MySQL中導出CSV格式數據 | Java處理CSV數據

1. 導出不帶表頭的CSV數據 SELECT dataid, recordfilename INTO OUTFILE /tmp/uk_callcenter_event3.csv FIELDS TERMINATED BY , LINES TERMINATED BY \n FROM table_name WHERE createtime > 2024-03-27 22:00:00 AND createtime < 2024-04-29 23:59:59 AND timehou…

使用selenium控制已經打開的瀏覽器,應該如何實現。

要使用Selenium控制一個已經打開的瀏覽器實例&#xff0c;你可以通過以下步驟實現&#xff0c;這里以Google Chrome瀏覽器為例&#xff1a; 步驟 1: 啟動Chrome瀏覽器并啟用遠程調試 首先&#xff0c;你需要以遠程調試模式啟動Chrome瀏覽器。這可以通過在命令行中使用特定參數來…

python下載及安裝

1、python下載地址&#xff1a; Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2、python安裝 &#xff08;1&#xff09; 直接點擊下載后的可執行文件.exe &#xff08;2&…

Spring Boot項目怎么集成Gitee登錄

一、背景 現在的越來越多的項目&#xff0c;需要集成第三方系統進行登錄。今天我們以Spring Boot項目集成Gitee為例&#xff0c;演示一下怎么使用Oauth2協議&#xff0c;集成第三方系統登錄。 不了解oauth2的&#xff0c;可以看我之前的文章。Ouath2是怎么實現在第三方應用認…

MySQL創建儲存過程函數

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 學號,createDate datetime DEFAULT NULL COMMENT 創建時間,modifyDate datetime DEFAULT NULL COMMENT 修改時間,userName varchar(30) NOT NULL COMMENT 學生名稱,pwd varchar(36) DEFAULT NULL COMME…