小白學習java第15天:JDBC

1.數據庫驅動

想一下我們之前是怎么操作數據庫,是不是使用SQL語句對其mysql數據庫管理系統,然后管理系統在進行數據庫(硬盤文件里面的)進行操作。那么我現在想使用應用程序對其數據庫進行操作,應該怎么辦呢?

那么數據庫驅動就是搭建在應用程序和數據庫之間的橋梁!!!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

2.JDBC

根據上面的圖可以知道,不同的數據庫就需要使用不同的數據庫驅動進行操作,適合麻煩的,在java上面就需要使用不同的數據庫驅動,是很不方便的!

sun公司為了簡化開發人員對于數據庫的操作,提供了(java操作數據庫的)規范,俗稱JDBC(java database conection顧名思義就是java與數據庫的連接)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

2.1JDBC下載

我使用的mysql版本是8.0,因此我需要下相關的java-connector 8.0.28相對來說穩定一點!

JDBC下載

2.2JDBC的第一個代碼測試

2.2.1前期工作:

? ? ? ? 首先我們需要對其進行jar的導入,導入依賴,(先創建一個lib目錄,然后添加進去就行!注意需要對lib右鍵里面的 add as? library)

2.2.2開始編寫代碼:

數據庫里面的表:

java里面的代碼:

package com.xcl.test;import java.sql.*;public class Demo01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.添加驅動(固定寫法,加載驅動)Class.forName("com.mysql.cj.jdbc.Driver");//2.用戶信息和url//useUnicode=true(表示中文有效) &characterEncoding=utf8(編碼要求) && useSSL=true(一些其他錯誤的警告)String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true";String username = "root";String password = "123456";//3.連接成功,數據庫對象(拿到了數據庫對象,現在就可以對其進行操作數據庫對象,connection就代表數據庫)Connection connection = DriverManager.getConnection(url, username, password);//4.執行SQL對象Statement statement = connection.createStatement();//5.執行SQL對象去執行SQL,查看返回結果//SQL語句String sql = "select * from student";//執行結果ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){System.out.print("id=" + resultSet.getObject("id"));System.out.print("name=" + resultSet.getObject("name"));System.out.print("password=" + resultSet.getObject("password"));System.out.print("sex=" + resultSet.getObject("sex"));System.out.print("birthday=" + resultSet.getObject("birthday"));System.out.print("address=" + resultSet.getObject("address"));System.out.print("email=" + resultSet.getObject("email"));}//6.釋放連接resultSet.close();statement.close();connection.close();}
}

分析一下:

2.2.3步驟:

1.注冊驅動DriverManager

2.用戶信息(用戶名、密碼)和url

url:

"jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true"

格式:協議://主機地址:端口號/數據庫名?參數1&參數2

3.獲取數據庫驅動對象,connection代表數據庫,那就擁有數據的權利,(數據庫設置自動提交

事務提交、事務回滾)

        Connection connection = DriverManager.getConnection(url, username, password);connection.commit();connection.rollback();connection.setAutoCommit(true);

4.具體sql執行類,上面我們有了數據庫需要對于表進行操作還需要一個執行sql語句的類對象

Statement statement = connection.createStatement();

然后就使用sql語句對其進行增刪改查

        Statement statement = connection.createStatement();statement.execute(); // 執行任何sql語句statement.executeUpdate(); //更新、插入、刪除都是這個,顯示的結果是受到影響的行數statement.executeQuery(); //查詢操作返回的ResultSet

=======================================================================

3.JDBC的抽取

根據上面我們可以知道對于驅動和連接,以及釋放資源都是固定,我們需要進行改變的就是statement對其進行增刪改查(CURD),因此我們需要對其進行提取工具類以及重點介紹一下statement的操作!!!

3.1.首先我想對于文件的,我想避免耦合,因此我想寫一個配置文件對其進行提取(寫在一個.properties文件)

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true
username=root
password=123456

3.2.上面是完成了一些文件的修改,我還行進一步簡化就是我想創建一個工具類JDBCUnity

package com.xcl.test.Utils;import java.io.FileReader;
import java.sql.*;
import java.util.Properties;public class JdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;//創建一個靜態代碼塊,在工具類之前就就加載好了static {try {//1.propertise集合類Properties properties = new Properties();//加載這個文件properties.load(new FileReader("D:\\javaLearn\\JDBC\\src\\dataBase.properties"));//開始獲取文件里面的內容driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");//然后就開始體現工具類里面的東西Class.forName("driver");} catch (Exception e) {e.printStackTrace();}}//獲取連接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}//釋放資源public static void close(Statement statement,Connection connection){//釋放資源if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(ResultSet resultSet,Statement statement,Connection connection){//釋放資源if (resultSet!=null){try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

3.3.那么我就簡單進行測試一下(進行增刪改查)

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class Demo02 {public static void main(String[] args) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//獲得連接connection = JdbcUtils.getConnection();//常見sql對象statement = connection.createStatement();//開始增刪改查//添加
//            String sqlAdd = "insert into student value ('12', '張三', '123456', '男', '1999-01-01', '北京', '123456@qq.com')";
//            int i = statement.executeUpdate(sqlAdd);
//            if (i > 0){
//                System.out.println("添加成功");
//            }//刪除
//            String sqlDelete = "delete from student where id = '12'";
//            int i = statement.executeUpdate(sqlDelete);
//            if (i > 0){
//                System.out.println("刪除成功");
//            }//修改
//            String sqlUpdate = "update student set name = '李四' where id = '11'";
//            int i = statement.executeUpdate(sqlUpdate);
//            if (i > 0){
//                System.out.println("修改成功");
//            }
//
//            //查詢String sqlQuery = "select * from student";results = statement.executeQuery(sqlQuery);while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

4.SQL注入

SQL存在漏洞,會被攻擊導致數據泄露。SQL會被拼接or,使得你查詢語句where判斷一直變成true,就可以盜取!!!

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQLError {//SQL注入public static void main(String[] args) {login("' or '1=1","' or '1=1");
//        login("趙六","123456");}private static void login(String userName,String password) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//獲得連接connection = JdbcUtils.getConnection();//常見sql對象statement = connection.createStatement();//查詢String sqlQuery = "select * from student where name='"+userName+"' and password='"+password+"'";results = statement.executeQuery(sqlQuery);while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

因此我們就需要更好的對象去先預處理這個東西

(主要就是進行預編譯,里面輸入的參數還用?先先代替就行)

步驟:

1.先用問號代替

2.然后進行填充

代碼展示:

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.*;public class SQLError {//SQL注入public static void main(String[] args) {
//        login("' or '1=1","' or '1=1");login("趙六","123456");}private static void login(String userName,String password) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//獲得連接connection = JdbcUtils.getConnection();//常見sql對象
//            statement = connection.createStatement();//查詢String sqlQuery = "select * from student where name= ? and password= ?";PreparedStatement  preparedStatement = connection.prepareStatement(sqlQuery);preparedStatement.setString(1,userName);preparedStatement.setString(2,password);results = preparedStatement.executeQuery();while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

5.事務(在java里面表現事務)【這不是完整代碼,里面還有工具類和數據庫,只是給大家一個思路!】

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.*;public class TransactionDemo {public static void main(String[] args) {Connection con = null;PreparedStatement ps = null;ResultSet resultSet = null;try {//連接con = JdbcUtils.getConnection();//關閉自動提交,之后不需要開啟因為會自動開啟事務con.setAutoCommit(false);//進行轉賬的修改String sql_A = "update account set money = money - 200 where name = 'A'";ps = con.prepareStatement(sql_A);ps.executeUpdate();String sql_B = "update account set money = money + 200 where name = 'B'";ps = con.prepareStatement(sql_B);ps.executeUpdate();//提交事務con.commit();System.out.println("轉賬成功!");} catch (SQLException e) {//失敗后進行回滾try {con.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}throw new RuntimeException(e);}finally {JdbcUtils.close(resultSet,ps,con);}}
}

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

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

相關文章

django之數據的翻頁和搜索功能

數據的翻頁和搜素功能 目錄 1.實現搜素功能 2.實現翻頁功能 一、實現搜素功能 我們到bootstrap官網, 點擊組件, 然后找到輸入框組, 并點擊作為額外元素的按鈕。 我們需要使用上面紅色框里面的組件, 就是搜素組件, 代碼部分就是下面紅色框框出來的部分。 把這里的代碼復制…

Kotlin Multiplatform--02:項目結構進階

Kotlin Multiplatform--02:項目結構進階 引言正文 引言 在上一章中,我們對 Kotlin Multiplatform 項目有了基本的了解,已經可以進行開發了。但我們只是使用了系統默認的項目結構。本章介紹了如何進行更復雜的項目結構管理。 正文 在上一章中&…

【Git】連接github時的疑難雜癥(DNS解析失敗)

大家好,我是jstart千語。最近在將項目推送到github的時候,突然github就拒絕訪問了,即使掛了VPN,網頁也進不去,通過git也不能把代碼推送上去。 即使后面看別人的一些解決方案,比如取消代理啊、更換ssh的方式…

ViTMAE:掩碼自編碼器是可擴展的視覺學習者

摘要 本文展示了掩碼自編碼器(MAE)作為計算機視覺中的可擴展自監督學習方法。我們的MAE方法很簡單:我們對輸入圖像進行隨機掩碼,并重建缺失的像素。該方法基于兩個核心設計。首先,我們開發了一種非對稱的編碼器-解碼器…

全球碳化硅晶片市場深度解析:技術迭代、產業重構與未來賽道爭奪戰(2025-2031)

一、行業全景:從“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作為第三代半導體材料的代表,憑借其寬禁帶(3.26eV)、高臨界擊穿場強(3MV/cm)、高熱導率(4.9W/cmK&…

AWS Glue ETL設計與調度最佳實踐

一、引言 在AWS Glue中設計和調度ETL過程時,需結合其無服務器架構和托管服務特性,采用系統化方法和最佳實踐,以提高效率、可靠性和可維護性。本文將從調度策略和設計方法兩大維度詳細論述,并輔以實際案例說明。 二、調度策略的最…

數據結構手撕--【二叉樹】

目錄 定義結構體: 初始化: 手動創建一個二叉樹: 前序遍歷: 中序遍歷: 后序遍歷 二叉樹節點個數: 葉子節點個數: 二叉樹第k層節點個數: 二叉樹的高度: 查找值為x…

2025 Java 開發避坑指南:如何避免踩依賴管理的坑?

在 Java 開發的世界里,依賴管理就像是一座看不見的橋梁,連接著項目所需的各種第三方庫和框架。然而,這座橋梁并非總是穩固,稍有不慎就可能掉入 “依賴地獄”,導致項目編譯失敗、運行異常。2025 年,隨著開源…

用node打開一個網頁

前言 使用node打開網頁,要求跨平臺 方案 使用子進程來用命令行打開網頁鏈接就可以了,需要注意的是Mac系統使用的是open命令,Windows系統使用的是start命令,Linux等系統使用xdg-open命令。針對不同的操作系統使用不同的命令。 封…

使用功能包組織C++節點的具體教程

在 ROS(Robot Operating System)中,使用功能包(package)來組織 C 節點是一種常見且有效的方式,它能讓代碼結構更清晰、便于管理和復用。 1. 環境準備 確保已經安裝了 ROS,這里以 ROS 2 Humble…

二項式分布html實驗

二項式分布html實驗 本文將帶你一步步搭建一個純前端的二項分布 Monte-Carlo 模擬器。 只要一個 HTML 文件,打開就能運行: 動態輸入試驗次數 n、成功概率 p 與重復次數 m點擊按鈕立刻得到「模擬頻數 vs 理論頻數」柱狀圖隨著 m 增大,兩組柱狀…

通過 API 對接應用網絡商城實現訂單自動化

前言 API(Application Programming Interface)即應用程序編程接口,是一種允許不同軟件應用程序之間進行交互和數據共享的工具。它通過定義一組明確的規則和協議,使得各個軟件系統能夠以標準化的方式相互通信。 在支付領域&#x…

openwrt作旁路由時的幾個常見問題 openwrt作為旁路由配置zerotier 圖文講解

1 先看openwrt時間,一定要保證時間和瀏覽器和服務器是一致的,不然無法更新 2 openwrt設置旁路由前先測試下,路由器能否ping通主路由,是否能夠連接外網,好多旁路由設置完了,發現還不能遠程好多就是旁路由本…

FANUC機器人GI與GO位置數據傳輸設置

FANUC機器人GI與GO位置數據傳輸設置(整數小數分開發) 一、概述 在 Fanuc 機器人應用中,如果 IO 點位足夠,可以利用機器人 IO 傳輸位置數據及偏移位置數據等。 二、操作步驟 1、確認通訊軟件安裝 首先確認機器人控制柜已經安裝…

UE5 Assimp 自用

記錄一下配assimp庫到ue中的過程。因為想在ue里面實現一些幾何處理(雖然ue好像有相關的geo的代碼),遂配置了一下assimp。 1. 編譯整理生成自己所需要的文件。cmake編譯,下載github 的官方的assimp-master,然后cmake都是默認的就行…

第18章:MCP在創作領域中的應用

第18章:MCP在創作領域中的應用 創意過程,無論是寫作、繪畫、音樂創作還是設計,往往充滿了不確定性、迭代和靈感的迸發。傳統 AI 在創意領域的應用常常局限于風格遷移、簡單內容生成等。MCP 框架通過其對記憶、上下文和規劃的整合,為 AI Agent 參與和輔助更深層次的創意活動…

電子電子架構 --- 主機廠視角下ECU開發流程

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

【Agent】LangManus深度解析:AI自動化框架的對比與langgraph原理

LangManus深度解析:AI自動化框架的技術演進與實踐 本文將帶你深入探索LangManus這一AI自動化框架的核心技術與其基于langgraph的實現原理,并與OpenManus進行全面對比,助你掌握多智能體系統的前沿技術。 本文3萬字,沒有時間的話可以…

機器學習-08-推薦算法-案例

總結 本系列是機器學習課程的系列課程,主要介紹機器學習中關聯規則 參考 機器學習(三):Apriori算法(算法精講) Apriori 算法 理論 重點 MovieLens:一個常用的電影推薦系統領域的數據集 23張圖&#x…

OpenCV 圖形API(63)圖像結構分析和形狀描述符------計算圖像中非零像素的邊界框函數boundingRect()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 計算點集或灰度圖像非零像素的 upright(不旋轉)邊界矩形。 該函數計算并返回指定點集或灰度圖像非零像素的最小 upright …