1. 程式人生 > 實用技巧 >2020-11-29

2020-11-29

此文轉載自:https://blog.csdn.net/qq_42376937/article/details/110306966#commentBox

JDBC連線Oracle資料庫

Java中的JDBC驅動可以分為四種類型,包括JDBC-ODBC橋、本地API驅動、網路協議驅動和本地協議驅動。

  • JDBC驅動型別一、JDBC-ODBC橋

JDBC-ODBC 橋 是sun公司提供的,是jdk提供的的標準API. 這種型別的驅動實際是把所有 JDBC的呼叫傳遞給ODBC ,再由ODBC呼叫本地資料庫驅動程式碼.( 本地資料庫驅動程式碼是指 由資料庫廠商提供的資料庫操作二進位制程式碼庫,例如在oracle for windows中就是oci dll 文 件)

只要本地機裝有相關的ODBC驅動那麼採用JDBC-ODBC橋幾乎可以訪問所有的資料庫,JDBC- ODBC方法對於客戶端已經具備ODBC driver的應用還是可行的.

但是,由於JDBC-ODBC先呼叫 ODBC再由ODBC去呼叫本地資料庫介面訪問資料庫.所以,執行效率比較低,對於那些大資料量 存取的應用是不適合的.而且,這種方法要求客戶端必須安裝ODBC 驅動,所以對於基於 internet ,intranet的應用也是不合適的.因為,你不可能要求所有客戶都能找到ODBC driver.

  • JDBC驅動型別二、本地API驅動

本地API驅動直接把JDBC呼叫轉變為資料庫的標準呼叫再去訪問資料庫.

這種方法需要本地 資料庫驅動程式碼、本地API驅動、廠商DB程式碼。這種驅動比起JDBC-ODBC橋執行效率大大提高了.但是,它仍然需要在客戶端載入資料庫廠商 提供的程式碼庫.這樣就不適合基於internet的應用.並且,他的執行效率比起其他的JDBC驅動 還是不夠高.

  • JDBC驅動型別三、網路協議驅動

這種驅動實際上是根據我們熟悉的三層結構建立的. JDBC先把對數局庫的訪問請求傳遞給網 絡上的中介軟體伺服器. 中介軟體伺服器再把請求翻譯為符合資料庫規範的呼叫,再把這種呼叫 傳給資料庫伺服器.如果中介軟體伺服器也是用java開法的,那麼在在中間層也可以使用上面說的那倆種驅動型別 JDBC驅動程式作為訪問資料庫的方法. 網路協議驅動---------中介軟體伺服器------------資料庫Server

由於這種驅動是基於server的.所以,它不需要在客戶端載入資料庫廠商提供的程式碼庫.而且 他在執行效率和可升級性方面是比較好的.因為大部分功能實現都在server端,所以這種驅動 可以設計的很小,可以非常快速的載入到記憶體中. 但是,這種驅動在中介軟體層仍然需要有配置 其它資料庫驅動程式,並且由於多了一箇中間層傳遞資料,它的執行效率還不是最好.

  • JDBC驅動型別四、本地協議驅動 (我們先使用的JDBC驅動一般都是這種型別)

這種驅動直接把JDBC呼叫轉換為符合相關資料庫系統規範的請求.這種驅動寫的應用可以直接和資料庫伺服器通訊.這種型別的驅動完全由java實現,因此實現了平臺獨立性. 本地協議驅動---------資料庫Server

由於這種驅動不需要先把JDBC的呼叫傳給ODBC或本地資料庫介面或者是中間層伺服器.所 以它的執行效率是非常高的.而且,它根本不需要在客戶端或伺服器端裝載任何的軟體或驅動. 這種驅動程式可以動態的被下載.但是對於不同的資料庫需要下載不同的驅動程式.

步驟:
1 註冊驅動
2 獲得資料庫連線物件
3 建立Statement物件
4 執行sql語句
5 處理結果集(如果有的話)
實驗:
1.先把獲得連線物件和關閉進行封裝

jdbc.properties檔案:

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:XE
username=briup
passwd=briup
package com.day1;

//import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class GetConnection {
	private static String driver;
	private static String url;
	private static String username;
	private static String passwd;
	static {
		Properties pro = new Properties();
//		FileInputStream in;
		try {
//			in = new FileInputStream("src/jdbctwo/day2/jdbc.properties");
//			pro.load(in);
			pro.load(GetConnection.class.getResourceAsStream("jdbc.properties"));
			driver=pro.getProperty("driver");
			url=pro.getProperty("url");
			username=pro.getProperty("username");
			passwd=pro.getProperty("passwd");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
public static Connection getConn() {
	Connection conn=null;
	try {
		Class.forName(driver);
		 conn= DriverManager.getConnection(url,username,passwd);
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return conn;
	
}
public static void close(ResultSet rs,Statement stmt,Connection conn) {

		try {
			if(rs!=null) rs.close();
			if(stmt!=null) rs.close();
			if(conn!=null) rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
		}
}
public static void close(Statement stmt,Connection conn) {
	close(null, stmt, conn);
}
}

進行建表測試:

package com.day1;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

public class JdbcTest1 {
	@Test
	public void createTable() {
		// 註冊驅動獲取連線
		Connection conn = null;
		// 獲取Statement物件
		Statement stmt = null;
		try {
			conn = GetConnection.getConn();
			stmt = conn.createStatement();
			String sql = "create table stus(" + "id number primary key," + "name varchar2(50) not null," + "age number,"
					+ "bod date)";
			conn.setAutoCommit(false);
			stmt.execute(sql);
			conn.commit();
			System.out.println("表格已經建立成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} finally {
			GetConnection.close(stmt, conn);
		}

	}
}

c查詢下表格是否建立成功:

進行增刪改查測試:

package com.day1;

import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

import org.junit.Test;

public class JdbcTest2 {
	@Test
	public void Insert() {
		Connection conn = null;
		Statement stmt = null;
		try {
			conn = GetConnection.getConn();
			stmt = conn.createStatement();
			String sql = "insert into stus values(7,'zs',20,'11-11月-20')";
			stmt.execute(sql);
			System.out.println("插入成功");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			GetConnection.close(stmt, conn);
		}
	}

	@Test
	// 書寫註冊操作,將資訊從控制檯輸入後直接儲存在資料庫中。
	public void test2() throws Exception {
		// 先從控制檯獲取資料
		System.out.println("請輸入使用者名稱:");
		@SuppressWarnings("resource")
		Scanner scan = new Scanner(System.in);
		String name = scan.nextLine();
		System.out.println("請輸入年齡:");
		int age = Integer.parseInt(scan.nextLine());
		System.out.println("請按照日-月-年的形式輸入:");
		String dob = scan.nextLine();
		// 獲取資料庫連線
		Connection conn = GetConnection.getConn();
		Statement stmt = conn.createStatement();
		String sql = "insert into stus values(8,'" + name + "'," + age + ",'" + dob + "')";
		System.out.println(sql);
		stmt.execute(sql);
		GetConnection.close(stmt, conn);
	}

	@Test
	public void Update() throws Exception {
		Connection conn = GetConnection.getConn();
		Statement stmt = conn.createStatement();
		String sql = "update stus set name='李思思'  where id=7";
		int exe = stmt.executeUpdate(sql);
		System.out.println("更新了" + exe + "條");
		GetConnection.close(stmt, conn);
	}

	@Test
	public void Delete() throws Exception {
		Connection conn = GetConnection.getConn();
		Statement stmt = conn.createStatement();
		String sql = "delete from stus where id=7";
		int exe = stmt.executeUpdate(sql);
		System.out.println("刪除了" + exe + "條");
		String sql1 = "delete from stus where id=8";
		int exe1 = stmt.executeUpdate(sql1);
		System.out.println("刪除了" + exe1 + "條");
		GetConnection.close(stmt, conn);
	}

	@Test
	public void select() throws Exception {
		// 註冊驅動獲取連線
		Connection conn = GetConnection.getConn();
		// 獲取Statement物件
		Statement stmt = conn.createStatement();
		String sql = "select * from stus";
		//處理結果集
		ResultSet rt = stmt.executeQuery(sql);
		while (rt.next()) {
			int id = rt.getInt("id");
			String name = rt.getString("name");
			int age = rt.getInt("age");
			Date date = rt.getDate("bod");
			System.out.println("id=" + id + "," + "name=" + name + "," + "age=" + "," + age + "," + "date=" + date);
		}
	}
}

插入測試結果:

更新測試:

刪除測試:


查詢測試: