Java進階(一)JDBC
用Java來寫的應用程式,無論是 B/S 架構還是 C/S架構,要想程式很好的完成需要的功能,最主要的還是資料。這就要提到資料庫。事實上,資料庫可以獨立的應用,但是程式要想利用資料庫並進行相關的增刪改查(CRUD)操作,就需要將Java程式與資料庫相連線。這時,就要用到JDBC。
JDBC(Java Database Connectivity)
主要用到的是 java.sql 包中的各個類,主要有以下幾個:
import java.sql.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException;
而JDBC的主要步驟有七步:
- 註冊驅動
- 管理驅動 //第二步可以隱藏在第一步中
- 設定連線引數
- 獲取資料庫連線(connection)(用於從java中通過connection傳輸資料的經過驅動關鍵(DriverManager)
//可傳入oracle或者masql 如果是查select 是有返回值的在返回到結果集裡) - 操作資料庫(使用SQL語句)
- 處理返回結果集 //根據情況是否有或者沒有
- 關閉資源(關閉資源是從下往上)
下面,來一點點仔細分析一下這幾個步驟:
註冊驅動
(最常用的方式,隱含了低昂DriverManager中進行註冊)
驅動類:
oracle資料庫;oracle.jdbc.driver.OracleDriver
MySQL資料庫:com.jdbc.mysql.driver
Class.forName("oracle.jdbc.driver.OracleDriver");
設定連線引數
URL的適配
oracle資料庫
jdbc:oracle:[email protected]<機器名/IP地址><:埠>:資料庫名
jdbc:oracle:[email protected]:1521:orcl
mysql資料庫
jdbc:mysql://<機器名/IP地址><:埠>/資料庫名
jdbc:mysql://localhost:3306/dbname
String url="jdbc:oracle:[email protected]:1521:orcl";
String user="scott";
String passwrod="tiger";
獲取資料庫連線
Connection conn = DriverManager.getConnection(url, user, password);
操作資料庫
(執行相應的sql語句)
//要執行的語句
String sql = "select * from emp where sal>2000";
//通過Connection物件建立集裝箱
Statement statement = conn.createStatement();
//執行sql語句,獲取結果集
ResultSet rs = statement.executeQuery(sql);
//使用Statement中的方法操作資料庫(執行sql語句)
/*
* 常用的三個方法:
* 1、boolean execute(String sql)(功能最強大,所有語句都可以執行)
* 1)當有結果集ResultSet物件產生時(如執行select * 語句),返回true
* 2)當沒有結果集時(如執行insert、delete語句),返回false
* *3)如果返回值為true時,我們可以繼續
* 呼叫ResultSet getResultSet()方法獲取結果集物件
*
* 2、int executeUpdate(String sql)
* 1)執行給定 SQL 語句,該語句可能為 INSERT、UPDATE 或 DELETE 語句,或者不返回任何內容的 SQL 語句
* 2)對於 SQL 資料操作語言 (DML) 語句,返回行計數 。 對於什麼都不返回的 SQL 語句,返回 0
*
* 3、ResultSet executeQuery(String sql)
* 1)用於執行查詢語句,包含給定查詢所生成資料的ResultSet物件(結果集)
* 2)ResultSet物件永遠不能為null,所以不能判斷取出的結果是否為空
* 也就是說,如果取出的結果集沒有資料,ResultSet物件也會被建立(類似一個空的集合)
*
* 注:這些方法不會為我們檢查SQL語句的語法錯誤,
* 如果SQL寫錯,則到資料庫執行時出現異常
*/
遍歷結果集
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String job = rs.getString(3);
double sal = rs.getDouble(6);
System.out.println("id = " + id + ",name = "
+ name + ",job = " + job + ",sal = " + sal);
}
/*
* 結果集(ResultSet物件):
* 表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句生成。
*
* 1、獲取ResultSet物件:
* 1)使用executeQuery(String sql)方法執行查詢語句,可返回該物件
* 2)瞭解即可:如果執行execute(String sql)方法的返回結果為true(即sql為查詢語句)時,
* 可以繼續呼叫getResultSet()方法獲取結果集物件
*
* 2、遍歷結果集:
* 1)當next()方法返回true時,表示有下一條記錄(存在),並且會指向下一條記錄(選中)
* 2)當next()方法返回false時,表示已經到了結果集的末尾
*
* 3、取得某一列的值:
* 1)當使用next()方法移動到“正確(根據業務進行判斷)”的記錄行後,
* 我們可以獲取該條記錄的資訊(分別獲取“屬性”值)
* 2)可以根據該列的資料型別呼叫對應的“ get["屬性名"]或get[第幾列(從1開始)] ”方法取得值
* 3)如果不知道欄位的返回值型別,可以使用“getObject(int columnIndex)
* 或 getObject(String columnLabel)”方法來獲取資料,然後再進行判斷、強轉
*
* 4、注意點:
* 1)儘可能使用列名來代替 * ,這樣不容易弄錯列的位置
* 2)返回結果只有一條時(如查詢條數),可以使用if(rs.next()){}來代替while迴圈
* 3)對於數字型的列,如果裡面儲存的是null,直接使用getInt方法獲取時,JDBC會將null轉換成0
* 如果關心返回的是否為null,可以呼叫rs.wasNull()方法判斷最後一次取的值是否為null
* 4)在開發對運算結果精度要求較高的應用時(如銀行),
* 應該儘量避免使用double、float,建議使用BigDecimal
*/
關閉資源
(從下到上)
resultset.close();
statement.close();
connection.close();
JDBC補充
介面 PreparedStatement 是 Statement 的子介面
定義預編譯的sql語句,使用?為佔位符
String sql1 = "update student t set t.name=? where id=?"
通過connection物件建立“預編譯的集裝箱”
PreparedStatement pst = conn.prepareStatement(sql1);
為“預編譯的集裝箱”中的佔位符進行賦值
pst.setString(1,"張三");
pst.setInt(2,1);
預編譯的sql物件,好處:
1.預編譯的,執行效率比其父介面statement要高;
2. 編譯部分語句結構相同,值不一樣(引數),則同構;
SQL語句結構不同,則異構;
3.在特定的情況下,Statement在使用拼接的方式可能會出現錯誤;使用預編譯,問號“?”方式完美解決。
JDBC 常見異常
1、ClassNotFoundException:
1)檢查jar包是否正確匯入;
2)檢查載入的“包名+類名”是否寫正確;
2、SQL異常:
1)確認Oracle或MySQL服務正常啟動(預設自動啟動);
2)檢查連線資訊是否正確(URL,使用者名稱,密碼);
3)檢查SQL語句(標點,引號,與表中列是否對應.等);
使用JDBC進行模糊查詢
String sql2 = "Select * from tmp where ename like ?";
PreparedStatement pst = conn.prepareStatement(sql2);
//模糊查詢注意:% 或者 _ 需要在賦值時新增
pst.setString(1, "%M%");
ResultSet rs2 = pst.executeQuery();
工廠模式
把公共部分提取出來,節省資源和空間
package factory;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
把公共部分提取出來,節省資源和空間
*/
public class ConnectionFactory {
private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String USERNAME = "scott";
private static final String PASSWORD = "tiger";
private static Connection conn;
public static Connection getConnetion() {
// 1、註冊驅動(最常用的方式,隱含了向DriverManager中進行註冊)
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("載入異常");
e.printStackTrace();
}
// 3、獲取資料庫連線
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
} catch (SQLException e) {
System.out.println("獲取連線失敗");
e.printStackTrace();
}
return conn;
}
//判斷是否存在
public static void myClose(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
System.out.println("關閉結果集失敗");
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
System.out.println("關閉Statement失敗");
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("關閉連線失敗");
e.printStackTrace();
}
}
}
}
相關推薦
Java進階(一)JDBC
用Java來寫的應用程式,無論是 B/S 架構還是 C/S架構,要想程式很好的完成需要的功能,最主要的還是資料。這就要提到資料庫。事實上,資料庫可以獨立的應用,但是程式要想利用資料庫並進行相關的增刪改查(CRUD)操作,就需要將Java程式與資料庫相連線。這時,就要用到JD
java進階(一):泛型
1、泛型簡介 所謂泛型,即通過引數化型別來實現在同一份程式碼上操作多種資料型別,泛型程式設計是一種程式設計正規化,他利用“引數化型別”將型別抽象化,從而實現更為靈活的複用。 先簡單給個例子: //可以想象這裡的T為Integer型別,以便於理解,其實它可以是任何型別 p
mysql進階(一) mysql備份
mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個
函數進階(一)
並行 自己的 習題 文件 false 聲明 方式 關鍵字 true 1.命名空間 本質:存放名字與值的綁定關系 命名空間的分類:(1)全局命名空間(變量)->位於函數體外 (2)局部命名空間(變量)->
Redis高級進階(一)
具體類 tro 類型 長度 刪除過期數據 專用 影響 生活 設置時間 一、redis中的事務 在關系型數據庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢劃走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麽都執行,要麽都不執
SQL Server進階(一)T-SQL查詢和編程的背景
.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景
Redis高階進階(一)
一、redis中的事務 在關係型資料庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢划走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麼都執行,要麼都不執行,不然錢憑空消失了,換了誰也無法接受。 同樣,redis中也為我們提供了事務,原理是:先把一組同一事
SpringCloud從入門到進階(一)——懂生活就懂微服務
避免 發現 官方文檔 隨著 並發 規範 只需要 組合 組件 內容 本文通過生活中的實際場景解釋單體應用和微服務應用的關系,以及SpringCloud中各組件的功能和含義。 適合人群 Java開發人員 說明 轉載請說明出處:SpringCloud從入門到進階(一)
Servlet進階(一)第一個JSP頁面
前言 本章講解JSP的相關知識之JSP初步 方法 1.概念 在以前我們寫網頁的時候,都是用html進行書寫,這種網頁是靜態的,無法和伺服器進行一個互動,那麼怎麼辦呢?JSP技術應運而生,我們在web開發之中,Java和Jsp可以形成完美的
JavaScript進階(一)JS事件機制
前言 做了這麼久的鋪墊,終於迎來了新的篇章,該章介紹JS中的事件機制 方法 1.概念 我們知道,JS是參與網頁互動的一門指令碼語言,之前所說的都是JS的基本概念,那麼怎麼來進行互動呢!那就需要JS的事件機制來進行控制了,如按鈕的點選事件觸
JAVA進階(06)多執行緒
一、三個概念 1、程式 程式(Program)是一個靜態的概念,一般對應於作業系統中的一個可執行檔案 2、程序 (1)執行中的程式叫做程序(Process),是一個動態的概念 (2)特點: 程序是程式的一次動態執行過程, 佔用特定的地址空間 每個程序由3
JAVA進階(05)IO技術
一、入門 1、資料來源 (1)資料來源分為: 源裝置:為程式提供資料,一般對應 輸入流 目標裝置:程式資料的目的地,一般對應 輸出流 2、資料流 3、典型的IO流程式碼 public static void main(String[] args) {
JAVA進階(03)常用類
一、包裝類 1、包裝類概述 8種基本型別對應8種包裝類,除了 Integer 和 Character 類以外,其他只是類名首字母大寫; 除了 Character 和 Boolean,其他都是數字型,繼承自 Number 類,重寫過 intValue()、lon
JAVA進階(02)陣列
一、概述 1、定義 陣列是相同型別資料的有序集合; 2、特點 長度是確定的; 元素必須是相同型別,可以是基本型別和引用型別; 3、本質 陣列是物件,每個元素可以看作是物件的屬性; 陣列無論存基本型別還是引用型別,陣列物件本身是在堆中儲存的
JAVA進階(01)異常處理
一、概述(Exception) 二、異常分類 1、繼承結構 說明: ClassNotFoundException 不屬於執行時異常 2、error (1)Error與Exception的區別
Android進階(一): Launcher啟動過程
1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 Launcher 系統啟動過程 總結一下(基於Android 8.0 系統)。 文章
c語言指標進階(一)
指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址
C# 進階(一)Lambda 表示式
Lambda 表示式是一種可用於建立委託或表示式目錄樹型別的匿名函式。通過使用 lambda 表示式,可以寫入可作為引數傳遞或作為函式呼叫值返回的本地函式。 Lambda 表示式對於編寫 LINQ 查詢表示式特別有用。若要建立 Lambda 表示式,需要在 Lambda 運算
egg.js-基於koa2的node.js進階(一)
一、路由進階Egg路由的路由重定向,路由分組 在router.js修改為如下格式require引用 module.exports = app => { const { router, controller } = app; require('./routers/admin')(app); re
python3.5進階(一)-------------------網路通訊(ip、埠,socket)
1. ip地址:如198.168.1.1 ,用於在網路中標記區分每臺電腦,在本地區域網中是唯一的。window下程式->cmd->輸入ipconfig(檢視ipv4就是ip地址)。拓展:ip v4表示ip的第四個版本,目前出現了ipv6,ipv1/2/3/5都