JDBC實現--保姆級教程~

本來以為寫過一個使用python與數據庫連接的文章,但是今天突然發現沒有,那就直接寫Java與數據庫連接的吧。當然如果大家有需要可以告訴我,有時間的話也可以寫一個的pymysql的使用的。

數據庫有很多種,接下來我就以MySQL為例來進行講解了,當然Java與其他數據庫的連接也同樣是這幾步,因為他們都有同一個接口,見下

一.注冊驅動

就是確定要使用哪個數據庫

1.1下載驅動包

如果有對應jar包的就可以跳過這一步了

對應的地址在這里:MySQL驅動包下載地址

當然一般不建議使用最新版,舊版可以在Archives中找到

下載完成之后,解壓

1.2添加jar包

打開解壓過的文件,并找到上面標注的jar包

1.一般是可以直接放到你Java項目中的lib目錄里面(如果找不到可以直接進行下面的第二步)

2.還需要在開發工具里把該 JAR 包添加到項目的類路徑,這樣 Java 虛擬機運行時才能找到它。

接下來需要在項目結構的模塊中添加對應的jar包

直接在文件中找到之前你解壓完成后,文件里對應的jar包就好了

1.3編寫代碼
// 1.注冊驅動(確定要使用哪個數據庫)
Class.forName("com.mysql.jdbc.Driver"); // 加載Driver類--在mysql5的驅動包之后,其實也可以省略// DriverManager.registerDriver(new com.mysql.jdbc.Driver());    也可以這樣,但是會有點顯得多此一舉(會重復注冊兩次)

二.連接數據庫

就是要獲取到一個數據庫連接對象

// 2.連接數據庫(獲取到一個數據庫連接對象)
final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";    // :前可看作協議,數據庫不同,協議不同
final String NAME = "root";    // 你數據庫的用戶名
final String PASSWORD = "1234";    // 你數據庫的密碼Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD);

其實Connection與MySQL的事務也有關系,在這里我也就不過多贅述了,如果想繼續擴充可以自己去查找資料,或在評論區滴我,后續有需要的我可以補充上噢

三.編寫sql語句

一般建議先保證語句正確之后,再直接復制到代碼中

這個也就不多說了,舉個栗子

// 3.編寫sql語句
String sql = "select * from tb_user;";

四.把sql語句發送給數據庫

4.1實踐

數據庫執行sql代碼,并返回執行結果

// 4.把sql語句發送給數據庫(數據庫執行sql代碼,并返回執行結果)
Statement stmt = conn.createStatement();    // 基于數據庫連接對象,創建一個操作數據庫的對象// ①使用sql查找時
ResultSet rs = stmt.executeQuery(sql);  // 把sql代碼發給數據庫// ②使用sql進行增刪改操作時
int row = stmt.executeUpdate(sql);    // 執行DML,DDL語句
// 執行DML語句時,執行后返回受影響行數    受影響行數為0表示增刪改沒有成功
// 執行DDL語句時,執行后返回0表示成功

4.2sql注入風險

但是使用Statement會有sql注入風險

例如,如果在上一步的password是這樣的:

// 3.編寫sql語句
String username = "aaa";
String password = "aaa' or 1=1-- ";// sql語句拼接時記得加空格(這里的?表示一個占位符)
String sql = "select * from tb_user where username = ? and password = ?;";

那么在使用Statement執行結果時,是一定會成功的,這時候對于數據庫中的數據來說,就不是很安全了,所以在這個時候就有了PreparedStatement。而他其實也是Statement的一個子接口。

// 4.把sql語句發送給數據庫(數據庫執行sql代碼,并返回執行結果)
// 創建預編譯對象PreparedStatement pstmt = conn.prepareStatement(sql);    // 基于數據庫連接對象,創建一個操作數據庫的對象// 給sql語句中的占位符賦值
pstmt.setString(1,username);
pstmt.setString(2,password);ResultSet rs = pstmt.executeQuery();  // 這里就不需要再傳遞內容了

其實PreparedStatement的作用也就相當于把敏感字符進行了一個轉義,像'和--都把他們變成了字符串,而不是sql語句本身

一般來說建議使用:PreparedStatement,防止出錯

五.處理sql的執行結果

注意區分查找和增刪改其他操作的書寫。

// 5.處理sql的執行結果(查詢)
while(rs.next()){System.out.print(rs.getInt("id")+"\t");System.out.print(rs.getString("username")+"\t");System.out.println(rs.getString("password")+"\t");
}// 如果是增刪改操作,就可以直接判斷受影響的行數是多少來判斷是否執行成功了
if(row > 0){System.out.println("數據操作成功");
}else{System.out.println("數據操作失敗");
}

使用步驟:

1.游標向下移動一行,并判斷該行是由有數據:next()

2.獲取數據:getxxx(參數)

要注意,

1.獲取到的數據是什么,就是get什么,例如說int-getInt,varchar-getString

2.而getxxx里面的參數,不管他之前的名字是什么,結果集上是什么就用什么來查詢

因為在idea中返回的結果,是根據mysql中的執行結果來返回的

六.釋放資源

斷開和數據庫的連接

// 6.釋放資源(斷開和數據庫的連接)
rs.close();
stmt.close();    // 注意是pstmt還是stmt
conn.close();

就把所有打開的都關閉就是了,誰和誰的都不一樣,關閉的順序與你書寫的順序相反

就像我下面整體的代碼,開啟連接的順序是:conn,stmt,rs。所以關閉的順序就是rs,stmt,conn。

總:代碼示例

下面代碼我都是使用了@Test注解,大家也可以直接修改為main函數

基礎代碼:

package JDBC;import org.junit.Test;import java.sql.*;public class JbdcQuickStart {@Testpublic void quickStartTest() throws ClassNotFoundException, SQLException {
//        1.注冊驅動(確定要使用哪個數據庫)Class.forName("com.mysql.jdbc.Driver"); // 加載Driver類--在mysql5的驅動包之后,其實也可以省略
//        DriverManager.registerDriver(new com.mysql.jdbc.Driver());    也可以這樣,但是會有點顯得多此一舉(會重復注冊兩次)//        2.連接數據庫(獲取到一個數據庫連接對象)String url = "jdbc:mysql://127.0.0.1:3306/demo1";   // :前可看作協議Connection conn = DriverManager.getConnection(url,"root","1234");//        3.編寫sql語句String sql = "select * from tb_user;";//        4.把sql語句發送給數據庫(數據庫執行sql代碼,并返回執行結果)Statement stmt = conn.createStatement();    // 基于數據庫連接對象,創建一個操作數據庫的對象ResultSet rs = stmt.executeQuery(sql);  // 把sql代碼發給數據庫
//        5.處理sql的執行結果while(rs.next()){System.out.print(rs.getInt("id")+"\t");System.out.print(rs.getString("username")+"\t");System.out.println(rs.getString("password")+"\t");}//        6.釋放資源(斷開和數據庫的連接)rs.close();stmt.close();conn.close();}
}

防止sql注入代碼:
?

package JDBC;import org.junit.Test;import java.sql.*;public class SQL注入demo {//    使用PerparedStatement解決SQL注入問題@Testpublic void loginTest() throws ClassNotFoundException, SQLException {//        1.注冊驅動(確定要使用哪個數據庫)Class.forName("com.mysql.jdbc.Driver");//        2.連接數據庫(獲取到一個數據庫連接對象)final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";final String NAME = "root";final String PASSWORD = "1234";Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD);//        3.編寫sql語句String username = "aaa";String password = "aaa' or 1=1-- ";//        sql語句拼接時記得加空格
//        String sql = "select * from tb_user "+"where username = '小花' and password = '12345';";String sql = "select * from tb_user where username = ? and password = ?;";//        4.把sql語句發送給數據庫(數據庫執行sql代碼,并返回執行結果)
//        創建預編譯對象PreparedStatement pstmt = conn.prepareStatement(sql);    // 基于數據庫連接對象,創建一個操作數據庫的對象//        給sql語句中的占位符賦值pstmt.setString(1,username);pstmt.setString(2,password);ResultSet rs = pstmt.executeQuery();  // 這里就不需要再傳遞內容了
//        5.處理sql的執行結果if (rs.next()) {String strname = rs.getString("username");String pwd = rs.getString("password");System.out.println("歡迎" + username + "登錄");} else {System.out.println("登錄失敗!");}//        6.釋放資源(斷開和數據庫的連接)rs.close();pstmt.close();conn.close();}
}

附加

其實我們對比代碼可以發現,不管是什么操作,有幾個步驟其實是不會改變的

這時候我們就可以把相似的代碼合成一個包,以方便我們調用

接下來就直接給代碼了

package JDBC.JDBC工具類的使用;/** 編寫工具類:*   1.私有構造方法*   2.提供靜態方法* */import java.sql.*;public class JdbcUtil {private static final String DRIVER = "com.mysql.jdbc.Driver";//    數據庫連接參數(這是固定上了,按理說我感覺可以讓他到時候自己設置)private static final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";private static final String NAME = "root";private static final String PASSWORD = "1234";
//    private static final String URL = "";
//    private static final String NAME = "";
//    private static final String PASSWORD = "";// 注冊驅動(僅需1次)static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}// 數據庫連接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, NAME, PASSWORD);}// 釋放資源(重載)public static void close(Connection conn, Statement stmt) {close(conn,stmt,null);  // 方法重用}public static void close(Connection conn, Statement stmt, ResultSet rs) {try {if (rs != null) {rs.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (stmt != null) {stmt.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (conn != null) {conn.close();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

總體就是這樣啦,如果有什么問題可以隨時在評論區提問噢~~~

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

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

相關文章

Ubuntu18.04搭建samda服務器

一.什么是Samba服務器? Samba服務器是一種基于開源協議實現的網絡共享服務軟件,主要用于在不同操作系統(如Windows、Linux、Unix)之間實現文件和打印機共享功能。其核心目標是解決跨平臺資源共享的兼容性問題,尤其是在…

《分詞算法大揭秘:BPE、BBPE、WordPiece、ULM常見方法介紹》

分詞算法是自然語言處理(NLP)中的一個重要預處理步驟,它將文本分割成更小的單元(如單詞、子詞或字符)。以下是幾種常見的分詞算法:Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后臺常用功能

最近些日子研究Wordpress,做些簡單的筆記。 怎么安裝Wordpress,怎么進的后臺,這些咱就不嘮了哈,網上到處是教程。 目錄 1,Wordpress的后臺 1-1, Posts(投稿) 1-2,Media(媒體) 1-3&#xf…

R8周:RNN實現阿爾茨海默病診斷

🍨 本文為🔗365天深度學習訓練營中的學習記錄博客 🍖 原作者:K同學啊 一、前期準備 1.設置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python練習題

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 不要害怕失敗,失敗可能成為我們前進的動力! 二、練習題 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9組成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

機器人強化學習入門學習筆記(二)

基于上一篇的《機器人強化學習入門學習筆記》,在基于 MuJoCo 的仿真強化學習訓練中,除了 PPO(Proximal Policy Optimization)之外,還有多個主流強化學習算法可用于訓練機器人直行或其他復雜動作。 ?? 一、常見強化學習算法對比(可用于 MuJoCo) 算法類型特點適合場景PP…

用 DuckDB 高效分析 JSON 數據:從入門到實戰

解析 JSON 文件進行分析常常充滿挑戰。無論你是在處理 API 響應、日志文件,還是應用數據,如果沒有合適的工具,分析 JSON 都會非常耗時。 借助 DuckDB,你可以直接用 SQL 查詢復雜的 JSON 文件,無需編寫復雜的解析代碼或…

從貼牌到品牌:出海官網如何讓中國制造“貴”起來?

在全球經濟一體化的當下,中美關稅戰如同一記重錘,給國際貿易格局帶來了巨大震蕩。自貿易摩擦爆發以來,雙方多次調整關稅政策,涉及的商品種類不斷增多,稅率持續攀升,眾多中國企業的出口業務遭受重創&#xf…

react-13react中外部css引入以及style內聯樣式(動態className與動態style)

1. 外部css文件 - 普通引入 1.1 創建一個 CSS 文件,MyComponent.css。 /* MyComponent.css */ .my-class {color: red;font-size: 20px; } 1.2 組件中import引入 import React from react; import ./MyComponent.css; // 引入 CSS 文件function MyComponent() {r…

n8n 與智能體構建:開發自動化 AI 作業的基礎平臺

n8n 是一款開源的自動化流程構建平臺,通過其模塊化節點系統,開發者可以快速實現跨平臺的任務編排、數據集成與智能交互。當 n8n 與大型語言模型(LLM)結合時,就能構建出具備感知、推理、執行能力的 AI 智能體&#xff0…

14.Spring Boot 3.1.5 集成 Spring Security 進行訪問控制

14.Spring Boot 3.1.5 集成 Spring Security 進行訪問控制 Spring Security 是一個強大且高度可定制的認證和訪問控制框架,專為基于 Spring 的應用程序設計。它為基于 Java EE 的企業應用程序提供了全面的安全解決方案,包括 Web 應用程序安全和方法級安…

Linux學習筆記(二):Linux權限管理

文章目錄 一、Linux下用戶的分類1. Linux下用戶分為兩類:2. 這兩類用戶如何進行切換呢?3. 短暫提權 二、何為權限1. 什么是權限2. Linux的文件后綴意義 三、修改權限1. 設置文件的訪問權限——chmod2. 修改文件擁有者——chown3. 修改文件所屬組——chgr…

學習alpha,第2個alpha

alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符從左到右 ts_corr: Pearson 相關度量兩個變量之間的線性關系。當變量呈正態分布且關系呈線性時,它最有效。 ts_corr(vwap, close, 20)是一個計算時間序列相…

Paddle Serving|部署一個自己的OCR識別服務器

前言 之前使用C部署了自己的OCR識別服務器,Socket網絡傳輸部分是自己寫的,回過頭來一看,自己犯傻了,PaddleOCR本來就有自己的OCR服務器項目,叫PaddleServing,這里記錄一下部署過程。 1 下載依賴環境 1.1 …

React Native【詳解】搭建開發環境,創建項目,啟動項目

下載安裝 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若無 npx 則安裝 npm install -g npx創建項目 npx create-expo-applatestRN_demo 為自定義的項目名稱 下載安裝 Python 2.7 下載安裝 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…

NVIDIA Halos:智能汽車革命中的全棧式安全系統

高級輔助駕駛行業正面臨一個尷尬的"安全悖論"——傳感器數量翻倍的同時,事故率曲線卻遲遲不見明顯下降。究其原因,當前行業普遍存在三大技術困局: 碎片化安全方案 傳統方案就像"打補丁",激光雷達廠商只管點云…

數據資產管理與AI融合:物聯網時代的新征程

一、引言 在當今數字化浪潮席卷全球的時代,數據資產已成為企業和組織的核心競爭力之一。隨著物聯網(IoT)技術的飛速發展,海量的數據如潮水般涌來,如何高效地管理和利用這些數據資產成為了亟待解決的問題。與此同時&am…

MySQL 表的內外連接

文章目錄 表的內外連接(重點)內連接外連接左外連接右外連接 表的內外連接(重點) 內連接 內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面學習的查詢都是內連接,也是在開發過程中使…

VTK 交互類介紹

基本概念 交互器(Interactor): 處理用戶輸入事件的基礎類 交互樣式(InteractorStyle): 定義具體的交互行為 Widgets: 可交互的UI組件,如滑塊、按鈕等 Picker: 用于選擇場景中的對象 常用交互類 類名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互樣式…

C語言動態庫與靜態庫編譯測試示例詳細介紹終結篇

C語言動態庫與靜態庫編譯鏈接時的詳細對比與示例 下面我將提供更詳細的示例,并通過對比表格清晰地展示靜態庫和動態庫的特性差異以及它們之間的各種鏈接關系。 ## 1. 靜態庫與動態庫特性對比 | 特性 | 靜態庫(.a/.lib) | 動態…