【MySQL】從連接數據庫開始:JDBC 編程入門指南

個人主頁:?喜歡做夢

歡迎??👍點贊? ?關注? ??收藏? 💬評論


目錄

🌟一、什么是JDBC?

🌟二、JDBC編程的步驟

?使用步驟

?DriverManger

💫定義

💫DriverManger的主要功能

💫DriverManger的核心方法

💫使用

?DataSource

💥定義

💥使用?

💥代碼優化

?DriverManger和DataSource的區別


🌟一、什么是JDBC?

JDBC(Java Data Base Connectivity,Java數據庫連接)是Java程序和數據庫之間的橋梁,也就是Java語言操作數據庫的標準API,他提供了一套用于執行SQL語句的Java接口。JDBC的主要作用就是:與數據庫連接、發送SQL語句和處理數據庫執行結果。

🌟二、JDBC編程的步驟

?使用步驟

1.加載數據庫廠商的驅動包

2.建立連接,用戶名,密碼

3.創建Statement

4.發送要執行的SQL語句

5.接收返回結果并顯示(結果集,受影響的行數)

6.釋放資源和關閉連接

?DriverManger

💫定義

DriverManger是JDBC中的一個核心類,位于java.sql包下,他負責管理數據庫驅動程序,并為客戶端程序提供獲取數據庫連接的方法。它就像一個“驅動管理器”,協調不同數據庫驅動與應用程序之間的交互。

💫DriverManger的主要功能

  • 注冊數據驅動:管理 已加載的數據;
  • 獲取數據庫連接:根據連接信息(URL、用戶名、密碼)返回合適的Connection對象;
  • 處理驅動程序之間的競爭:當多個驅動可以連接到同一URL時,選擇最合適的驅動。

URL表示統一資源定位符,是互聯網上用來指定一個位置、文件或者資源的標準方式。?

💫DriverManger的核心方法

getConnection()

核心方法功能
getConnection(String url)通過URL獲取連接
getConnection(String url,String? user,String password)通過URL、用戶名和密碼獲取連接
getConnection(String url,Properties info)通過URL和包含連接屬性的Properties對象獲取連接
registerDriver(Driver driver)注冊驅動(一般不用手動調用)
deregisterDriver(Driver driver)注銷驅動
gerDrivers()獲取所有已注冊的驅動

💫使用

import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo1 {public static void main(String[] args) {//聲明數據庫操作的相關對象//數據庫連接對象Connection connection=null;//執行靜態SQL對象,但是SQL注入可能會出現一些問題Statement statement= null;//對靜態SQL的解決方法,預處理PreparedStatement preparedStatement=null;//查詢結果集對象ResultSet resultSet=null;try{//1,加載數據廠商提供的驅動:加載數據庫提供的jdbc驅動類,注冊到DriverManger中Class.forName("com.mysql.cj.jdbc.Driver");//2.獲取數據庫連接--相當于在數據庫中寫use java2;//數據庫連接URL格式:jdbc:mysql://服務器地址:端口/數據庫?參數名=值[&參數名=值]connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");//3.創建Statement對象:Statement用于像數據庫發送SQL語句statement = connection.createStatement();//4.定義SQL語句并執行System.out.println("請輸入學生姓名:");Scanner scanner =new Scanner(System.in);//接收用戶輸入String name=scanner.next();String sql="select id,name,class_id from students where name='"+name+"'";//5.執行SQL,獲取查詢結果//executeQuery用于執行select語句,返回結果集resultSet=statement.executeQuery(sql);//6.對結果集進行遍歷獲取結果//有返回true,沒有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//獲取第一列字段的值String Stuname=resultSet.getString(2);//獲取第二列字段的值long class_id=resultSet.getLong(3);//獲取第三列字段的值System.out.println(MessageFormat.format("學生id={0},姓名={1},班級={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}finally{// 釋放資源(從后往前釋放),關閉連接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();}}}}
}

?DataSource

💥定義

是Java數據庫連接(JDBC)的一個接口,用于獲取數據庫連接,可方便數據庫連接資源,實現連接池等高級功能。

💥使用?

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo {public static void main(String[] args) {//定義MySQL數據源對象MysqlDataSource mysqlDataSource=new MysqlDataSource();//MySQL驅動直連//數據庫連接mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8");mysqlDataSource.setUser("root");mysqlDataSource.setPassword("123456");//定義jdbc數據源對象DataSource dataSource=mysqlDataSource;Connection connection=null;//預處理PreparedStatement statement=null;//查詢結果集對象ResultSet resultSet=null;try{//1.獲取數據庫連接connection= dataSource.getConnection();//2.創建Statement對象:Statement用于像數據庫發送SQL語句//定義SQL語句并執行String sql="select id,name,class_id from students where name=?";statement = connection.prepareStatement(sql);//3.接收用戶輸入System.out.println("請輸入學生姓名:");Scanner scanner =new Scanner(System.in);String name=scanner.next();// 用真實值替換占位符statement.setString(1,name);//4..執行SQL,獲取查詢結果//executeQuery用于執行select語句,返回結果集resultSet=statement.executeQuery(sql);//5.對結果集進行遍歷獲取結果//有返回true,沒有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//獲取第一列字段的值String Stuname=resultSet.getString(2);//獲取第二列字段的值long class_id=resultSet.getLong(3);//獲取第三列字段的值System.out.println(MessageFormat.format("學生id={0},姓名={1},班級={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} finally{// 釋放資源(從后往前釋放),關閉連接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();}}}}
}

💥代碼優化

封裝

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;public class DB {//數據源private static DataSource dataSource=null;//數據庫連接串private static final String url="jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8";//用戶private static String user="root";//密碼private static String password="123456";//當類加載到JVM時,執行數據源的初始化static {MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(url);mysqlDataSource.setUser(user);mysqlDataSource.setPassword(password);dataSource = mysqlDataSource;}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();}}}//構造方法私有化,防止new這個對象private  DB(){};//獲取數據連接public static Connection getConnection() throws SQLException{return dataSource.getConnection();}
}

使用jdbc插入數據?

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class Demo3{//插入數據public static void main(String[] args) {Connection connection=null;PreparedStatement statement=null;//插入數據,不用獲得結果集,要影響行數即可try{//獲取數據庫connection=DB.getConnection();//定義SQLString sql="insert into students(id,name,class_id) values(?,?,?)";//定義SQL預處理對象statement = connection.prepareStatement(sql);//接收用戶參數Scanner scanner = new Scanner(System.in);System.out.println("請輸入id");Long id= Long.valueOf(scanner.next());System.out.println("請輸入姓名");String name= scanner.next();System.out.println("請輸入班級");Long class_id= Long.valueOf(scanner.next());//用真實數據代替占位符statement.setLong(1,id);statement.setString(2,name);statement.setLong(3,class_id);//獲取結果,影響的行數//executeUpdate執行返回結果是一個整形,通常用于insert、delete、updateint row=statement.executeUpdate();//判斷if(row==1){System.out.println("插入成功");}else{System.out.println("插入失敗");}} catch (SQLException e) {e.printStackTrace();}finally {//關閉連接,釋放資源DB.close(null,statement,connection);}}}

?DriverManger和DataSource的區別

  • DriverManger每次調用都會初始化一個新的連接,導致資源浪費;
  • DataSource使用連接池的技術,一個連接可以重復使用,用DataDource替代DriverManger.getConnection()直連方式,更直接,靈活。

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

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

相關文章

重生之我在暑假學習微服務第一天《MybatisPlus-上篇》

本系列參考黑馬程序員微服務課程,有興趣的可以去查看相關視頻,本系列內容采用漸進式方式講解微服務核心概念與實踐方法,每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取…

odoo-060 git版本:發布/生產版本落后開發版本部署

文章目錄問題起源目前解決問題起源 周五提交了一個版本,本來打算使用這個版本的,周末更新。 下一個功能比較復雜,周一提交,結果周末沒有更新,導致現在還有沒測試過的不能發布的。 說明: 原來只有一個mast…

YotoR模型:Transformer與YOLO新結合,打造“又快又準”的目標檢測模型

【導讀】在目標檢測領域,YOLO系列以其高效的推理速度廣受歡迎,而Transformer結構則在精度上展現出強大潛力。如何兼顧二者優勢,打造一個“又快又準”的模型,是近年來研究熱點之一。本文介紹的一項新研究——YotoR(You …

白楊SEO:流量的本質是打開率?搞用戶搜索流量的玩法怎么做?

大家好,我是白楊SEO,專注研究SEO十年以上,全網SEO流量實戰派,AI搜索優化研究者。上周六參加了生財航海家在杭州舉行的私域運營大會,主題是圍繞私域獲客,私域IP,AI私域,精細化管理。白…

Java優雅使用Spring Boot+MQTT推送與訂閱

在物聯網(IoT)和智能設備橫行的今天,你有沒有遇到這樣的問題:服務端需要實時把報警、狀態更新、控制指令推送給客戶端;安卓 App、嵌入式設備、網頁等終端,需要輕量且穩定的連接方式;HTTP 太“重…

多目標粒子群優化(MOPSO)解決ZDT1問題

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

Coze Studio概覽(三)--智能體管理

本文簡要分析了Coze Studio中智能體管理功能,包括功能、架構以及核心流程。Coze Studio 智能體管理功能分析 1. 智能體管理架構概覽 Coze Studio的智能體管理系統基于DDD架構,主要包含以下核心模塊: 后端架構層次: API層 (coze): …

idea運行tomcat日志亂碼問題

原因在于idea和tomcat文件編碼格式不一樣。可以把idea編碼改成UTF-8 File | Settings | Editor | File Encodings 里面把GBK都改成UTF-8help里面 Edit Custom VM Options 添加一行-Dfile.encodingUTF-8重啟idea

Javaweb - 13 - AJAX

發送請求的幾種方式1. 瀏覽器的地址框中輸入地址,回車2. html --> head --> scrip / linkimg 自動發送請求,無需手動觸發3. a 標簽,form 表單標簽需要手動控制提交產生,且往往需要在新的頁面上獲得響應信息4. 運行 JS 代碼…

qt常用控件-06

文章目錄qt常用控件-06spinBox/doubleSpinBoxdateTimeEditdialSliderlistWIdgettableWidgettreeWidget結語很高興和大家見面,給生活加點impetus!!開啟今天的編程之路!! 今天我們進一步c11中常見的新增表達 作者&#…

小智源碼分析——音頻部分(二)

一、利用創建好的對象來調用音頻服務 上周從上圖的getaudiocode()方法進去感受了一下底層小智的構造如何實現。所以用一個codec來接收我們所構造的音頻對象。下來是用構造好的音頻對象來調用音頻初始化服務Initialize,因為啟動函數Application函數的類中有audio_ser…

菜鳥的C#學習(四)

文章目錄一、格式說明符1.1、數字格式說明符(適用于數值類型:int, double, decimal 等)1. 標準數字格式2. 自定義數字格式1.2、日期時間格式說明符(適用于 DateTime, DateTimeOffset)1. 標準日期時間格式2. 自定義日期…

基于黑馬教程——微服務架構解析(二)

本篇文章基于黑馬程序員的微服務課程內容,結合個人學習過程中的理解與思考進行整理。本節將圍繞以下幾個問題展開:什么是網關和配置管理前面那篇文章,我們了解如何把一個單體的項目拆成分布式微服務項目,并且講解一下各個服務之間…

Text2SQL智能問答系統開發(一)

開發一個面向企業的chatBI工作流 已完成 基礎 Text2SQL 功能實現 實現用戶輸入自然語言問題后,系統能夠自動生成 SQL 并執行返回結果。用戶交互優化 支持用戶通過補充信息對查詢進行調整,提升易用性。模糊時間處理機制 對“最近”“近期”等模糊時間關…

Python HTML模塊詳解:從基礎到實戰

一、模塊體系全景圖 Python生態中處理HTML的工具可分為三大層級: 標準庫基礎層:html模塊 html.parser第三方增強層:BeautifulSoup(搭配解析器)專業級工具層:lxml requests-html 二、標準庫核心模塊詳解…

PyTorch常用Tensor形狀變換函數詳解

PyTorch常用Tensor形狀變換函數詳解 在PyTorch中,對張量(Tensor)進行形狀變換是深度學習模型構建中不可或缺的一環。無論是為了匹配網絡層的輸入要求,還是為了進行數據預處理和維度調整,都需要靈活運用各種形狀變換函數…

自主智能Agent如何重塑工作流自動化:技術、經濟與未來展望

自主智能Agent的崛起與工作流自動化的范式革命2025年7月,當OpenAI向付費用戶推出具備網頁瀏覽和代碼執行能力的ChatGPT Agent時,工作流自動化領域迎來了一場靜默但徹底的革命。這款不再滿足于簡單問答的智能體,在一個安全的虛擬計算機環境中運…

技術架構、行業應用、工具鏈整合、挑戰應對及未來趨勢五大模塊,引用多個權威來源數據與開源項目實現細節。

以下是一份關于AI技術落地的實戰經驗總結報告,結合代碼示例、可視化圖表與行業案例,內容分為技術架構、行業應用、工具鏈整合、挑戰應對及未來趨勢五大模塊,引用多個權威來源數據與開源項目實現細節。AI技術落地實戰指南:從架構設…

第 9 篇:神經網絡初探——當AI擁有了“大腦”,世界從此不同

《人工智能AI之機器學習基石》系列⑨ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。

音頻焦點 Android Audio Focus 進階

舊焦點處理 示例調用鏈: requestAudioFocus() → propagateFocusLossFromGain_syncAf() → handleFocusLossFromGain()。 系統事件(如來電)→ 強制焦點變化 → handleFocusLossFromGain()。 函數 propagateFocusLossFromGain_syncAf 焦點持有者發生的焦點丟失通知 主要功能…