Java精選筆記_JDBC

JDBC

概述


什么是JDBC


JDBC全稱是Java數據庫連接(Java Database Connectivity),應用程序可通過這套API連接到關系數據庫,并使用SQL語句來完成對數據庫中數據的查詢、更新和刪除等操作。是一套用于執行SQL語句的Java API。


Java的數據庫連接接口。它是Java API中的一部分,通過它可以將Java程序和關系數據庫集成在一起。
應用程序通過調用JDBC來操作數據庫的過程,其實是由數據庫廠商提供的JDBC驅動程序來負責的。如果要更換數據庫,只要更換驅動程序,并在JDBC中載入新的驅動程序來源,即可完成數據庫系統的變更。

JDBC允許任何使用Java語言編寫的小應用程序或應用程序訪問數據庫。通過使用SQL語句可以對數據庫中的數據進行相應的插入、刪除和更新操作。


JDBC由Java語言編寫的相關類和接口組成

驅動程序 DriverManager類、Driver 接口
與特定數據庫連接 Connection接口
執行SQL語句 Statement接口、PreparedStatement接口
提供數據庫信息 DatabaseMetaData接口
結果集 ResultSet接口


DriverManager類,用來管理JDBC驅動程序,主要用于跟蹤和加載驅動程序并負責選取數據庫驅動程序和建立新的數據庫連接
Driver 接口,每個驅動程序類必須實現的接口。該接口可以將API的調用映射到數據庫的操作
Connection接口,用來連接應用程序與指定的數據庫
Statement接口,用來執行靜態SQL語句并得到SQL語句并得到執行后的結果
PreparedStatement接口,用來返回有關數據、數據庫和驅動程序等與底層數據庫有關的信息
DatabaseMetaData接口,提供對數據庫表的訪問,執行查詢后返回的結果集。通過ResultSet對象是通過執行一個查詢數據庫的語句生成



連接


在連接數據庫時需要指明數據源,以及相關的一些參數。數據源主要包括兩部分,其中protocol表示連接到數據庫的驅動程序,DatabaseName表示數據庫的名字
jdbc:<protocol>:<DatabaseName>
在連接數據庫時,需要找到使用JDBC驅動程序類的名稱。不同的數據庫供應商的數據庫產品都有自己的驅動程序,不同數據庫的URL和驅動程序也有所不同。

使用Java與數據庫連接進行數據存取的過程:加載驅動程序-->Collection建立連接(連接數據庫)-->創建Statement對象(執行SQL語句)-->取得ResultSet結果集


具體過程


(1)首先要加載當前數據源的驅動程序。通常使用Class.forName()方法加載

(2)建立數據庫的連接。可以通過DriverManager類中的getConnection方法來實現與數據庫的連接。
conn = DriverManager.getConnection(url, userNamew, password);

(3)建立連接后就可以使用SQL語句對數據庫進行訪問。這就需要創建Statement對象。通過該對象可以執行相應的SQL語句并將其操作于數據庫

stmt = conn.createStatement();

(4)將SQL語句執行后的結果返回。執行的查詢結果可以以ResultSet結果集的形式返回

ResultSet rs = stmt.executeQuery(sqlSelect);

(5)對結果集進進行處理。例如,我們可以通過使用一個while循序獲得結果集中的所有記錄

while (rs.next()) { String str1 = rs.getString(1); ? ?String str2 = rs.getString(2); ?}

(6)關閉數據庫的連接。在執行完數據庫的操作之后,需要將與數據庫連接有關的對象關閉。主要包括Statement對象、Connection對象等。

? ? stmt.close(); conn.close();


API詳解


注冊驅動(應用)Class.forName("com.mysql.jdbc.Driver");
獲得連接對象(應用)getConnection("jdbc:mysql://localhost:3306/day07",root,root)
獲得執行sql的statement對象(應用)
createStatement()返回的是Statement接口
Statement接口執行操作
* executeUpdate(sql)
* executeQuery(sql)


prepareStatement(sql),返回PreparedStatement接口,預編譯SQL語句
PreparedStatement 是Statement的子接口
* 使用它可以解決sql注入問題
* 執行SQL方法:
executeQuery()
executeUpdate()
setInt(?的位置,值)


遍歷結果集(應用)next() ?, ?getInt() ? , ?getString()
釋放資源 ? 調用close方法


PreparedStatement對象滾動結果集
可以將游標定位到任意位置
PrepareStatement pstmt = conn.prepareStatement(String sql, int resultSetType, int resultSetConcurrency)


ResultSet對象處理結果集


方法

ResultSetMetaData getMetaData() 檢索此ResultSet對象的列的編號、類型和屬性
boolean getBoolean(int columnIndex) 以Java編程語言中boolean的形式檢索此ResultSet對象的當前行中指定列的值
float getFloat(int columnIndex) 以Java編程語言中float的形式檢索
int getInt(int columnIndex) 以Java編程語言中int的形式檢索此ResultSet對象的當前行中指定列的值
String getString(int columnIndex) 以Java編程語言中String的形式檢索此ResultSet對象的當前行中指定列的值
boolean next() 將指針從當前位置下移一行


ResultSet接口中還提供了一些方法用于實現滾動結果集


boolean absolute(int row) 將游標移動到此ResultSet對象的指定參數row所對應的行。若游標位于有效行則返回true
boolean relative(int rows) 按相對行數移動游標到參數rows指定的行。若游標位于有效行上則返回true
boolean first() 將游標移動到第一行。若游標位于有效行則返回true,若結果集中沒有數據行則返回false
boolean last() 將游標移動到最后一行。若游標位于有效行則返回true,若結果集中沒有數據行則返回false
boolean next() 將游標移動到當前位置的下一行。若新當前行有效,則返回true;若不存在,則返回false
boolean previous() 將游標移動到ResultSet對象的上一行。若該行有效則返回true,若不在結果集中則返回false
boolean isFirst() 判斷游標是否在此ResultSet對象的第一行。如果是則返回true
boolean isLast() 判斷游標是否在此ResultSet對象的最后一行。如果是則返回true
boolean isBeforeFirst() 判斷游標是否在此ResultSet對象的第一行之前,如果是則返回true
boolean isAfterLast() 判斷游標是否在此ResultSet對象的最后一行之后,如果是則返回true
void beforeFirst() 將游標移動到此ResultSet對象第一行之前
void afterLast() 將游標移動到此ResultSet對象的最后一行之后


更新結果集


當將創建Statement和PreparedStatement對象中的參數resultSetConcurrency設置為ResultSet.CONCUR_UPDATABLE時,則表明該結果集是可更新的。這時我們就可以直接在結果集中對數據庫進行修改了。


方法
void insertRow() 將插入行的內容插入到此 ResultSet 對象和數據庫中。當指針位于插入時才可以調用該方法
void updateRow() 用此 ResultSet 對象的當前行的新內容更新底層數據庫
void deleteRow() 將當前行從此 ResultSet 對象和底層數據庫中刪除
void cancelRowUpdates() 取消對 ResultSet對象中的當前行所作的更新。此方法在調用更新方法之后,調用updateRow方法之前調用才可以實現對行所作的更新。如果在updateRow方法之后調用該方法,則不能取消對行所做的更新
void moveToCurrentRow() 將游標移動到當前行。只有游標位于插入行上時,調用此方法才有效
void moveToInsertRow() 將游標移動到ResultSet 對象中插入行


核心API


DriverManager
Driver
Connection
Statement
? ? PreparedStatement
? ? CallableStatement
ResultSet
RowSet
DatabaseMetaData
ResultSetMetaData
Types
SQLException


JDBC批處理


在實際開發中,經常需要向數據庫發送多條SQL語句,這時,如果逐條執行這些SQL語句,效率會很低。為此,JDBC提供了批處理機制,即同時執行多條SQL語句。Statement和PreparedStatement都實現了批處理。


Statement批處理

PreparedStatement批處理


大數據處理


大數據處理主要指的是對CLOB和BLOB類型數據的操作。在應用程序中,要想操作這兩種數據類型,必須使用PreparedStatement 完成,并且所有的操作都要以IO流的形式進行存放和讀取。


處理CLOB數據

處理BLOB數據


JDBC處理事務與數據庫連接池


JDBC處理事務


在數據庫操作中,一項事務是由一條或多條操作數據庫的SQL語句組成的一個不可分割的工作單元
只有當事務中的所有操作都正常完成,整個事務才能被提交到數據庫中,如果有一項操作沒有完成,則整個事務會被撤銷。


針對JDBC處理事務的操作,在Connection接口中,提供了三個相關的方法
setAutoCommit(boolean autoCommit)
commit()
rollback()


數據庫連接池


什么是數據庫連接池


在JDBC編程中,每次創建和斷開Connection對象都會消耗一定的時間和IO資源。頻繁地創建、斷開數據庫連接勢必會影響數據庫的訪問效率,甚至導致數據庫崩潰。
為了避免頻繁的創建數據庫連接,工程師們提出了數據庫連接池技術。


為了避免頻繁的創建數據庫連接,工程師們提出了數據庫連接池技術。


DataSource接口


為了獲取數據庫連接對象(Connection),JDBC提供了javax.sql.DataSource接口,它負責與數據庫建立連接,并定義了返回值為Connection對象的方法:
Connection getConnection()?
Connection getConnection(String username, String password)


我們習慣性的把實現了javax.sql.DataSource接口的類稱為數據源,顧名思義,數據源即數據的來源。在數據源中存儲了所有建立數據庫連接的信息。


DBCP數據源


DBCP是數據庫連接池(DataBase Connection Pool)的簡稱,是Apache組織下的開源連接池實現,也是Tomcat服務器使用的連接池組件。單獨使用DBCP數據源時,需要在應用程序中導入兩個jar包。
commons-pool.jar包
commons-dbcp.jar包
?commons-dbcp.jar包中包含兩個核心類,分別是BasicDataSourceFactory和BasicDataSource,它們都包含獲取DBCP數據源對象的方法。


編寫配置文件
配置文件 xx.properties中有命名格式要求
driverClassName
url
username
password


BasicDataSource是DataSource接口的實現類,主要包括設置數據源對象的方法。
方法
void?setDriverClassName(String?driverClassName) 設置連接數據庫的驅動名稱
void?setUrl(String?url) 設置連接數據庫的路徑
void?setUsername(String?username) 設置數據庫的登陸賬號
void?setPassword(String?password) 設置數據庫的登錄密碼
void setInitialSize(int?initialSize) 設置數據庫連接池初始化的連接數目
void setMaxActive (int?maxIdle) 設置數據庫連接池最大活躍的連接數目
void setMinIdle(int?minIdle) 設置數據庫連接池最小閑置的連接數目
Connection getConnection() 從連接池中獲取一個數據庫連接


?當使用DBCP數據源時,首先得創建數據源對象,數據源對象的創建方式有兩種
1.通過BasicDataSource類直接創建數據源對象
使用BasicDataSource類創建一個數據源對象,手動給數據源對象設置屬性值,然后獲取數據庫連接對象。


2.通過讀取配置文件創建數據源對象
使用BasicDataSourceFactory工廠類讀取配置文件,創建數據源對象,然后獲取數據庫連接對象。



C3P0數據源


C3P0是目前最流行的開源數據庫連接池之一,它實現了DataSource數據源接口,支持JDBC2和JDBC3的標準規范,易于擴展并且性能優越,著名的開源框架Hibernate和 Spring使用的都是該數據源。


我們在使用C3P0數據源開發時,需要了解C3P0中DataSource接口的實現類ComboPooledDataSource,它是C3P0的核心類,提供了數據源對象的相關方法。


方法

void setDriverClass() 設置連接數據庫的驅動名稱
void setJdbcUrl() 設置連接數據庫的路徑
void setUser() 設置數據庫的登陸賬號
void setPassword() 設置數據庫的登錄密碼
void setMaxPoolSize() 設置數據庫連接池最大的連接數目
void setMinPoolSize() 設置數據庫連接池最小的連接數目
void setInitialPoolSize() 設置數據庫連接池初始化的連接數目
Connection getConnection() 從數據庫連接池中獲取一個連接


當使用C3P0數據源時,首先得創建數據源對象,創建數據源對象可以使用ComboPooledDataSource類,該類有兩個構造方法,分別是ComboPooledDataSource()和ComboPooledDataSource(String configName)
1.通過ComboPooledDataSource類直接創建數據源對象
?使用ComboPooledDataSource類直接創建一個數據源對象,手動給數據源對象設置屬性值,然后獲取數據庫連接對象

2.通過讀取配置文件創建數據源對象
通過ComboPooledDataSource (String configName)構造方法讀取c3p0-config.xml配置文件,創建數據源對象,然后獲取數據庫連接對象。

轉載于:https://www.cnblogs.com/justdoitba/p/7582127.html

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

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

相關文章

mysql關系數據庫引擎_MySQL數據庫引擎詳解

作為Java程序員&#xff0c;MySQL數據庫大家平時應該都沒少使用吧&#xff0c;對MySQL數據庫的引擎應該也有所了解&#xff0c;這篇文章就讓我詳細的說說MySQL數據庫的Innodb和MyIASM兩種引擎以及其索引結構。也來鞏固一下自己對這塊知識的掌握。Innodb引擎Innodb引擎提供了對數…

Java之synchronized的JVM底層實現原理精簡理解

1 synchronized的JVM底層原理實現的精簡理解 Java 虛擬機中的synchronized基于進入和退出Monitor對象&#xff08;也稱為管程或監視器鎖&#xff09;實現&#xff0c; 無論是顯式同步(synchronized作用在同步代碼塊&#xff0c;有明確的 monitorenter 和 monitorexit 指令) 還是…

三分鐘掌握Actor和CSP模型

點擊上方藍字進行關注前文傳送門&#xff1a;《三分鐘掌握共享內存模型和 Actor模型》&#xff0c; 一直想比較Actor模型與golang的CSP模型&#xff0c;經過一段時間的實戰記錄了本文。Actor vs CSP模型? 傳統多線程的的共享內存&#xff08;ShareMemory&#xff09;模型使用l…

DateTimeToUnix/UnixToDateTime 對接時間轉換

問題&#xff0c;通過毫秒數來解析出時間&#xff1a;&#xff08;很多對接的時候經常需要用到&#xff09; <?php $MyJson {"jingdong_vas_subscribe_get_responce":{"code":"0","item_code":"FW_GOODS-2236-1","…

【學生選課系統經典】VB與SQLSERVER連接:Windows應用工程案例

實驗任務描述 1 用VB6訪問SQLSERVER數據庫(兩種安全模式); 2 用VB6完成數據庫指定表上的數據顯示; 3 用VB6完成數據庫指定表上的數據插入、刪除和更新; 4 用VB6完成SQLSERVER2008數據庫用戶驗證。 一、數據庫系統 該實驗中,所要求的數據庫名稱為SCHOOL,總共涉及以下表:

丟失api-ms-win-crt-runtime-l1-1-0.dll

運行Cmder的時候提示&#xff1a;丟失api-ms-win-crt-runtime-l1-1-0.dll在網上找了一些方法&#xff0c;基本解決方法都是裝VC2015的運行時&#xff0c;但是我安裝的時候出錯&#xff0c;大家可以先試試。接著我就去解決安裝出錯這問題沒&#xff0c;折騰了半天也沒成功。后來…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(二)魔法實習生第一步了解魔杖的使用

學習目標 了解什么是開發環境了解python語言的環境安裝了解python語言編程的編輯器工具 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&#xff08;一&#xff09;既然你選擇了這系列教程那么我就要讓你聽得懂 第三篇&#xff1a;《假如編…

Java之synchronized可重入性的理解

1 synchronized可重入性的理解 當一個線程試圖操作一個由其他線程持有的對象鎖的臨界資源時&#xff0c;將會處于阻塞狀態&#xff0c;但當一個線程再次請求自己持有對象鎖的臨界資源時&#xff0c;如果當前鎖是重入性&#xff0c;會請求將會成功&#xff0c;如果當前鎖不是可…

onmouseover-onmouseout

<input type"checkbox" value"autoLogin" οnmοuseοver"block()" οnmοuseοut"none()">兩周內自動登錄 <div id"div1">為了您的信息安全請不要在網吧或公共電腦勾選此項</div> <script> functi…

mysql5.7 only_full_group_by_Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報錯的解決方法

近期在開發過程中&#xff0c;因為項目開發環境連接的mysql數據庫是阿里云的數據庫&#xff0c;而阿里云的數據庫版本是5.6的。而測試環境的mysql是自己安裝的5.7。因此在開發過程中有小伙伴不注意寫了有關group by的sql語句。在開發環境中運行是正常的&#xff0c;而到了測試環…

一款高速的NET版的離線免費OCR

PaddleOCR.Onnx一款基于Paddle的OCR&#xff0c;項目使用ONNX模型&#xff0c;速度更快。本項目同時支持X64和X86的CPU上使用。本項目是一個基于PaddleOCR的C代碼修改并封裝的.NET的工具類庫。包含文本識別、文本檢測、基于文本檢測結果的統計分析的表格識別功能&#xff0c;同…

spring 注解簡單使用

一、通用注解 1、項目結構&#xff1a; 2、新建Person類&#xff0c;注解Component未指明id&#xff0c;則后期使用spring獲取實例對象時使用默認id"person"方式獲取或使用類方式獲取 package hjp.spring.annotation.commen;import org.springframework.stereotype.C…

selenium+python筆記3

#!/usr/bin/env python # -*- coding: utf-8 -*- """ desc:學習unittest的用法 注意setUp/setUpClass&#xff0c;tearDown/tearDownClass的區別 ① setUp():每個測試函數運行前運行 ② tearDown():每個測試函數運行完后執行 ③ setUpClass():必須使用classmeth…

【學生選課系統經典】C#與SQLSERVER連接:ASP.NET網站(服務器端,IIS發布)

實驗任務描述 1 用C#訪問SQLSERVER數據庫(兩種安全模式); 2 用C#完成數據庫指定表上的數據顯示; 3 用C#完成數據庫指定表上的數據插入、刪除和更新; 4 用C#完成數據庫用戶驗證。 此處使用ASP.NET工程來完成這個項目,和Windows應用不同的是:這個項目是在服務器上、依靠IIS服…

TCP包頭、UDP包頭、IP包頭、和MAC幀包頭詳細字段和包頭大小

1 TCP頭 TCP是一種可靠的、面向連接的字節流服務,頭部定義如下。 /*TCP頭定義,共20個字節*/ typedef struct _TCP_HEADER {short m_sSourPort;       // 源端口號16bitshort m_sDestPort;       // 目的端口號16bitunsigned int m_uiSequNum; …

經典面試題:用戶反映你開發的網站訪問很慢可能會是什么原因

原文鏈接&#xff1a;http://blog.csdn.net/lv_victor/article/details/53148421 問題場景&#xff1a;某個用戶向你反映說你開發的網站訪問速度很慢&#xff0c;但是該用戶訪問其他問題很正常&#xff0c;分析下原因、有哪些工具分析原因、怎么解決問題&#xff1f; 最近面試兩…

《假如編程是魔法之零基礎看得懂的Python入門教程 》——(三)使用初始魔法跟編程魔法世界打個招呼吧

學習目標 完成顯示魔法的使用——輸出print完成傳入魔法的使用——輸入input使魔法生效——運行python文件 目錄 第一篇&#xff1a;《假如編程是魔法之零基礎看得懂的Python入門教程 》——&#xff08;一&#xff09;既然你選擇了這系列教程那么我就要讓你聽得懂 第二篇&am…

查缺補漏系統學習 EF Core 6 (一)

推薦關注「碼俠江湖」加星標&#xff0c;時刻不忘江湖事掌握 ORM 開發方式是每一個 .NET 開發者所必備的技能&#xff0c;而且 .NET 平臺有很多優秀的 ORM 框架。很多人都會詬病 .NET 官方標配的 Entity Framework&#xff0c;感覺其笨重難用、性能低下。但其實經過多年發展&am…

mysql 5.5 mysqldump_mysql 5.5 mysqldump 原文翻譯

根據mysql 5.5第6.4章節理解和自己翻譯水平有限如有紕漏請指教,原文如下.6.4 使用mysqldump備份(Using mysqldump for Backups)首先多余的不用說了備份用來干什么大家都清楚。mysqldump備份分兩種輸出形式&#xff1a;1. 無--tab選項&#xff0c;輸出標準的SQL格式。輸出包含CR…

【經典回放】JavaScript學習詳細干貨筆記之(一)

【經典回放】JavaScript學習詳細干貨筆記之&#xff08;一&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;二&#xff09; 【經典回放】JavaScript學習詳細干貨筆記之&#xff08;三&#xff09; 目錄 一、為什么要學JavaScript 二、JavaScript經典案例 …