JDBC總結

目錄

JDBC(java database connection)?

JDBC連接數據庫步驟:

1.? ?在項目中添加jar文件,如圖所示

2.加載驅動類

向數據庫中插入數據代碼示例:

第一種:

第二種:

查詢操作 :

?第一種:

?第二種:

JDBC(java database connection)?

????????java數據庫連接.api(應用程序編程接口) ,可以為多種關系型數據提供統一訪問,它由一組java語言編寫的類和接口組成.

????????java程序是可以連接不同的數據庫,但是不同的數據庫具體的連接細節不同,那么連接數據庫的細節應該由誰來實現?

????????連接細節由數據庫開發商實現,由于開發商起的名字,連接操作步驟不同,所以由java設計出一系列連接數據庫接口規范,然后由不同的數據庫開發商實現.

示例 :

java 定義的接口

inerface oper

{

insert()

{}

delete()

{}

select()

{}

update()

{}

}

然后例如mysql sqlsever 去實現.

示例: mysql實現類

oracleOperImpl implements oper{

insert()

{

.......}

delete()

{

.......}

select()

{

.....}

update()

{

.......}

}

?有了JDBC,java開發人員只需要編寫一次程序,就可以訪問不同的數據庫

因為java對于不同的數據庫,對其的操作方法的名字都是一樣的,?

  • java定義者制定了JDBC規范,
  • 數據庫開發商實現接口
  • 程序員學習使用標準規范

?????????所以程序員只需要知道java提供的方法即可,java提供了鏈接數據庫的規范,具體連接細節由數據庫開發商實現.mysql和java連接的jar文件,mysql-connector-java-8.0.16.jar.

JDBC連接數據庫步驟

1.? ?在項目中添加jar文件,如圖所示

2.加載驅動類

完整功能

package jdbc;import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class demo1 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//2加載驅動類Class.forName("com.mysql.cj.jdbc.Driver");//2加載驅動類2//DriverManager.registerDriver(new Driver());//建立與數據庫的連接,獲得連接對象//三個參數,賬號,密碼,數據庫連接地址String url = "jdbc:mysql://127.0.0.1:3306/學生?serverTimezone=Asia/" + "Shanghai";String user ="root";String password ="root";Connection connection = DriverManager.getConnection(url,user,password);//發送sqlStatement st = connection.createStatement();//java向數據庫發送語句//向表中插入數據st.executeUpdate("insert into major(name)values('計算機')");//關閉數據庫連接st.close();connection.close();}
}

這樣就可以將java中的數據存儲到數據庫中去.?

?注意

????????關于調用抽象類中的方法,實際上在JDBC的上下文中,你并不會直接去實例化一個抽象類或者明確地調用抽象類的方法。更多的是通過接口和具體實現類的交互來完成數據庫操作。例如,當你調用DriverManager.getConnection(url, username, password)獲取數據庫連接時,這個方法返回的是一個實現了java.sql.Connection接口的對象。這個對象是由具體的數據庫驅動程序提供的,它可能是一個具體類也可能是抽象類的具體子類,但作為開發者,我們通常不需要關心其具體實現細節,只需要知道它遵循了Connection接口規范即可。

如圖所示:

向數據庫中插入數據代碼示例:

第一種

statement傳遞sql直接將sql語句傳遞到數據庫中

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
//向數據庫插入數據
public class deom2 {public static void main(String[] args) {try {new deom2().save("小三",12,"2003-06_17", "19025284617", "男","陜西西安", 1.80, 5 );} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {//加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//反射實現// 管理驅動程序并建立與數據庫連接,返回的這個connection 對象代表了特定數據庫的連接Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/學生?serverTimezone=Asia/Shanghai","root","root");// 通過調用 Connection 對象的 createStatement() 方法,// 你可以創建一個 Statement 對象。// 這個 Statement 對象可以用來執行SQL查詢或者更新(比如INSERT, UPDATE, DELETE語句)Statement st =  connection.createStatement();//執行SQL語句中的更新數據的操作st.executeUpdate("INSERT INTO student(name ,num , birthday ,phone ,gender,address,height ,reg_time,majorid)"+ "values('"+name+"',"+num+",'"+birthday+"','"+phone+"','"+gender+"','"+address+"',"+height+",now(),"+majorid+")");//執行sql語句中的修改操作//st.executeUpdate("update student set name ='"+name+"',gender ='"+gender+"',birthday = '"+birthday+"',reg_time=now()where num ='"+num+"' ");//關閉單一的SQL操作句柄st.close();//關閉數據庫連接connection.close();}
}

?statement:

實現這個接口的對象,專門用來向數據庫發生SQL語句,并且這個接口類的抽象方法定義的名字都是一樣的,方法里面傳遞的參數都是sql.

?第二種

preparestatement先用占位符?站位,然后通過setobject 方法賦值,寫起來就不用連接符.安全可靠,具體實現如下:

package jdbc;
import java.sql.*;
/*preparestatement 和 statement的區別
相同點都是向數據庫發送SQL
不同點,
statement 安全性差
preparestatement 先用占位符?站位,然后通過setobject方法賦值,寫起來不用連接字符串,安全可靠
在賦值時進行檢測,可以防止sql注入攻擊如"or 1 = 1" 檢測到有兩個字符串,就會報錯. 若是第一種,則刪除操作時,回將整個表刪除(若沒有外鍵約束).查詢查詢整張表.
*
* */
//向數據庫插入數據
public class deom3 {public static void main(String[] args) {try {new deom3().save("小三",12,"2003-06_17", "19025284617", "男","陜西西安", 1.80, 5 );} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public void save(String name, int num ,String birthday ,String phone, String gender,String address ,double height ,int majorid) throws ClassNotFoundException, SQLException {//加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//反射實現Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/學生?serverTimezone=Asia/Shanghai","root","root");//發送//預先編譯sqlPreparedStatement ps = connection.prepareStatement("insert into student(name,num ,birthday ,phone,gender,address,height,majorid)values(?,?,?,?,?,?,?,?)");//然后傳參ps.setObject(1, name);ps.setObject(2, num);ps.setObject(3,birthday);ps.setObject(4, phone);ps.setObject(5, gender);ps.setObject(6, address);ps.setObject(7,height);ps.setObject(8, majorid);//執行ps.executeUpdate();//關閉單一的SQL操作句柄ps.close();//關閉數據庫連接connection.close();}
}

查詢操作 :

第一種

????????當查詢結果只有一行時,JAVA是面向對象的,查詢語句中將查詢到的結果將這行數據封裝到對象中.步驟如下

????????定義一個學生類相當于數據庫中的表名,其中的變量如name,num,gender相當于數據庫中的列名,將從數據庫中查到的列名用set()方法賦值到對象的變量中,然后利用改寫toString方法輸出,

具體代碼實現如下

package jdbc;import java.sql.*;public class deom4 {public static void main(String[] args) {try {student st =  new deom4().findstudentByNum(5);System.out.println(st.toString());} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public student findstudentByNum(int num) throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");//反射實現Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/學生?serverTimezone=Asia/Shanghai","root","root");PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where num=?");ps.setObject(1, num);//查詢操作ResultSet rs =  ps.executeQuery();//將查詢的結果封裝到result對象中,需要ResultSet對象封裝到對象中student st = null;//結果集中有數據返回true否則falsewhile(rs.next()){//創建學生對象,將獲取到的結果封裝到學生類中.st = new student();st.setNum(rs.getInt("num"));st.setName(rs.getString("name"));st.setGender(rs.getString("gender"));st.setBirthday(rs.getString("birthday"));st.setPhone(rs.getString("phone"));st.setReg_time(rs.getTimestamp("reg_time"));}
rs.close();ps.close();connection.close();return st ;}}

定義的student類,用來裝數據庫中查詢到的結果.?

package jdbc;import java.util.Date;public class student {private int  num ;private String name ;private String gender;private String birthday;private String phone ;private Date reg_time ;public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}@Overridepublic String toString() {return "student{" +"num=" + num +", name='" + name + '\'' +", gender='" + gender + '\'' +", birthday='" + birthday + '\'' +", phone='" + phone + '\'' +", reg_time=" + reg_time +'}';}public void setGender(String gender) {this.gender = gender;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Date getReg_time() {return reg_time;}public void setReg_time(Date reg_time) {this.reg_time = reg_time;}
}

?第二種:

????????當查詢結果有多條語句時,就要用到java中的集合ArrayList來裝數據庫中查詢到的多條記錄,

將查詢到的每一條student對象全部用arraylist中的add方法添加到arraylist中去,然后輸出arraylist

集合.

具體實現如下:

package jdbc;import java.sql.*;
import java.util.ArrayList;
import java.util.Collection;public class deom5 {public static void main(String[] args) {try {ArrayList <student> students =  new deom5().findstudentByGender("男");System.out.println(students);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public ArrayList<student> findstudentByGender(String gender) throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");//反射實現Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/學生?serverTimezone=Asia/Shanghai","root","root");PreparedStatement ps = connection.prepareStatement("select num ,name ,gender ,birthday ,phone ,reg_time from student where gender=?");ps.setObject(1, gender);ArrayList<student> students  = new ArrayList<>();//創建學生集合,存儲多個學生對象//查詢操作ResultSet rs =  ps.executeQuery();//將查詢的結果封裝到result對象中,需要ResultSet對象封裝到對象中//結果集中有數據返回true否則falsewhile(rs.next()){//每循環一次創建一個學生對象student st = new student();st.setNum(rs.getInt("num"));st.setName(rs.getString("name"));st.setGender(rs.getString("gender"));st.setBirthday(rs.getString("birthday"));st.setPhone(rs.getString("phone"));st.setReg_time(rs.getTimestamp("reg_time"));//將學生對象存入到學生集合之中去students.add(st);}
rs.close();ps.close();connection.close();return students ;}}

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

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

相關文章

Java中的垃圾回收機制

在Java編程語言中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;機制是內存管理的一個核心部分。它的主要目標是自動釋放那些不再被程序使用的對象所占用的內存空間&#xff0c;從而防止內存泄漏&#xff0c;并確保程序的穩定運行。下面&#xff0c;我將…

一文講清!傳統企業的進銷存管理難題該怎么解決?

有沒有開源的進銷存軟件啊&#xff1f; 確實&#xff0c;市面上存在不少開源的進銷存軟件。但客觀地講&#xff0c;開源軟件往往面臨著安全隱患&#xff0c;因為代碼公開&#xff0c;容易成為黑客攻擊的目標。此外&#xff0c;開源軟件的功能模塊通常較為固定&#xff0c;難以…

初出茅廬的小李博客之MQTT.fx客戶端接入EMQX Platform

EMQX Platform 概覽 EMQX Platform 是 EMQ 推出的一款面向物聯網領域的 MQTT 消息中間件產品。作為全球首個 MQTT 5.0 消息云服務&#xff0c;EMQX Platform 提供了一站式運維代管、獨有隔離環境的 MQTT 消息服務。在萬物互聯的時代&#xff0c;EMQX Platform 可以幫助您快速構…

python數據類型之列表

目錄 1.創建列表 2.列表基礎操作 常用操作 對列表元素順序隨機打亂 列表下標和切片 字符串分割為列表 列表位移 列表切片替換 3.列表內置方法 4.列表排序 簡單排序 使用key參數按指定規則排序 二維列表排序 自定義排序規則函數 5.列表排序算法 選擇排序 柱狀圖…

C# 利用Xejen框架源碼,我們來開發一個基于Dapper技術的數據庫通用的幫助訪問類,通過Dapper的增刪改查,可以訪問Sqlite數據庫

Dapper 是一個輕量級的對象關系映射&#xff08;ORM&#xff09;工具&#xff0c;適用于 .NET 平臺。它由 Stack Overflow 團隊開發&#xff0c;旨在提供簡單、高效的數據訪問功能。與其他重量級 ORM&#xff08;如 Entity Framework&#xff09;相比&#xff0c;Dapper 更加輕…

基于Python圖像增強算法:低光增強+圖像修復+超分辨率重建

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理與計算機視覺領域&#xff0c;圖像增強技術是提高圖像質量和可用性的重要手段。在實…

單片機io擴展

輸入輸出擴展 i2c擴展 方案1:PCF8575 PCF8575雙向IO口擴展模塊 16位輸入輸出I2C通訊 單片機級聯擴展板 方案2&#xff1a;PCA955A 輸出擴展 74HC595 io口擴展模塊輸出口擴展 參考鏈接 中微愛芯發[2004] 1號           簽發人&#xff1a; (szlcsc.com)https://…

? Vscode和Idea都可以使用的-AI插件(官方-百度出的)

? Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特別火&#xff0c;給大家推薦一下最新出的VScode插件&#xff0c;輔助我們寫代碼&#xff01; 1、下載地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group設計梯度壓測場景

Ultimate Thread Group Ultimate Thread Group 線程組是模擬波浪式壓測或者階梯式負載壓測 1、Start Threads Count&#xff1a;線程數量 2、Initial Delay&#xff0c;sec&#xff1a;每組開始添加到測試執行之前的延遲&#xff08;xx秒開始啟動線程&#xff09; 3、Startu…

python中的線程并行

文章目錄 1. 單線程2. 線程池ThreadPoolExecutor 1. 單線程 現在有1154張圖片需要順時針旋轉后保存到本地&#xff0c;一般使用循環1154次處理&#xff0c;具體代碼如下所示&#xff0c;img_paths中存儲1154個圖片路徑&#xff0c;該代碼段耗時約用97ms。 t1time.time() for …

Python筑基之旅-MySQL數據庫(四)

目錄 一、數據表操作 1、新增記錄 1-1、用mysql-connector-python庫 1-2、用PyMySQL庫 1-3、用PeeWee庫 1-4、用SQLAlchemy庫 2、刪除記錄 2-1、用mysql-connector-python庫 2-2、用PyMySQL庫 2-3、用PeeWee庫 2-4、用SQLAlchemy庫 3、修改記錄 3-1、用mysql-conn…

Java輕松轉換Markdown文件到Word和PDF文檔

Markdown 憑借其簡潔易用的特性&#xff0c;成為創建和編輯純文本文檔的常用選擇。但某些時候我們需要更加精致的展示效果&#xff0c;例如在專業分享文檔或打印成離線使用的紙質版時&#xff0c;就需要將Markdown文件以其他固定的文檔格式呈現。通過將 Markdown 轉換為 Word 和…

OpenHarmony實戰開發——網絡組件axios可以在OpenHarmony上使用了

什么是axios 上古瀏覽器頁面在向服務器請求數據時&#xff0c;因為返回的是整個頁面的數據&#xff0c;頁面都會強制刷新一下&#xff0c;這對于用戶來講并不是很友好。并且我們只是需要修改頁面的部分數據&#xff0c;但是從服務器端發送的卻是整個頁面的數據&#xff0c;十分…

高效寫代碼java-推薦插件1(格式轉化 ConverterX )-日后待更新

ConverterX 主要功能:格式轉化 字符串格式轉換 日期轉換 Json格式轉義 字符格式 快捷鍵 ctrl shiftS Upper(CODEEASE)字符串全部變成大寫Lower(codeease)字符串全部變成小寫Camel(codeEase)字符串變成小駝峰ClassCaemel(CodeEase)字符串變成大駝峰UnderlineUpper(CODE_EAS…

項目管理:Jira,禪道,GitHub Issues對比

Jira、禪道&#xff08;ZenTao&#xff09;和GitHub Issues都是項目管理工具&#xff0c;但它們在功能、適用場景和特性上有所不同。以下是它們之間的對比&#xff1a; 功能&#xff1a; Jira&#xff1a;是一款強大的項目管理工具&#xff0c;適用于各種項目&#xff0c;尤其…

Vue3組件間通信通過回調函數傳遞數據

Vue3組件間通信通過回調函數傳遞數據 一、前言1、使用場景2、實現方法1. 父組件中定義回調方法2. 子組件中觸發回調方法 二、結論 一、前言 在 Vue 3 中&#xff0c;組件之間的通信是一個重要的主題。在許多情況下&#xff0c;你可能需要從子組件向父組件傳遞數據或觸發父組件…

python實用系列:按順序重命名文件

啊&#xff0c;好久沒更博客了&#xff0c;今天偶然想換個桌面壁紙&#xff0c;于是上網搜了兩個比較滿意的桌面壁紙&#xff0c;都是壓縮包&#xff1a; 當我想要給他們放到我的桌面壁紙文件里的時候患了難&#xff0c;因為他們的名字有相同的&#xff1a; anime文件夾里邊&a…

揭秘!亞馬遜、Vinted賣家如何借助自養號測評實現爆單?

?作為一名跨境賣家&#xff0c;你一定夢想著能夠在亞馬遜上實現爆單&#xff0c;讓產品火爆銷售。下面就分享五個秘訣&#xff0c;幫助你實現這個夢想&#xff1a; 1. 優質產品&#xff1a;首先&#xff0c;確保你的產品質量優秀&#xff0c;能夠滿足消費者的需求。品質好的產…

基于Matlab使用BP神經網絡進行電力系統短期負荷預測

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 電力系統的短期負荷預測對于電力調度和能源管理具有至關重要的作用。通過準確地預測電力負荷&…

【產品經理】輸出

引言&#xff1a; ? ? ? ?在最近頻繁的產品管理職位面試中&#xff0c;我深刻體會到了作為產品經理需要的不僅僅是對市場和技術的敏銳洞察&#xff0c;更多的是在復雜多變的環境中&#xff0c;如何運用溝通、領導力和決策能力來引導產品從概念走向市場。這一系列博客將分享…