1. 程式人生 > >Java進階(一)JDBC

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的主要步驟有七步:

  1.  註冊驅動
  2. 管理驅動 //第二步可以隱藏在第一步中
  3. 設定連線引數
  4. 獲取資料庫連線(connection)(用於從java中通過connection傳輸資料的經過驅動關鍵(DriverManager)
            //可傳入oracle或者masql  如果是查select 是有返回值的在返回到結果集裡)
  5. 操作資料庫(使用SQL語句)
  6. 處理返回結果集 //根據情況是否有或者沒有
  7. 關閉資源(關閉資源是從下往上)

下面,來一點點仔細分析一下這幾個步驟:

註冊驅動

(最常用的方式,隱含了低昂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();
			}
		}
	}
}



相關推薦

JavaJDBC

用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 ServerT-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可以形成完美的

JavaScriptJS事件機制

前言       做了這麼久的鋪墊,終於迎來了新的篇章,該章介紹JS中的事件機制 方法 1.概念 我們知道,JS是參與網頁互動的一門指令碼語言,之前所說的都是JS的基本概念,那麼怎麼來進行互動呢!那就需要JS的事件機制來進行控制了,如按鈕的點選事件觸

JAVA06多執行緒

一、三個概念 1、程式 程式(Program)是一個靜態的概念,一般對應於作業系統中的一個可執行檔案 2、程序 (1)執行中的程式叫做程序(Process),是一個動態的概念 (2)特點: 程序是程式的一次動態執行過程, 佔用特定的地址空間 每個程序由3

JAVA05IO技術

一、入門 1、資料來源 (1)資料來源分為: 源裝置:為程式提供資料,一般對應 輸入流 目標裝置:程式資料的目的地,一般對應 輸出流 2、資料流 3、典型的IO流程式碼 public static void main(String[] args) {

JAVA03常用類

一、包裝類 1、包裝類概述 8種基本型別對應8種包裝類,除了 Integer 和 Character 類以外,其他只是類名首字母大寫; 除了 Character 和 Boolean,其他都是數字型,繼承自 Number 類,重寫過 intValue()、lon

JAVA02陣列

一、概述 1、定義 陣列是相同型別資料的有序集合; 2、特點 長度是確定的; 元素必須是相同型別,可以是基本型別和引用型別; 3、本質 陣列是物件,每個元素可以看作是物件的屬性; 陣列無論存基本型別還是引用型別,陣列物件本身是在堆中儲存的

JAVA01異常處理

一、概述(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都