垃圾PTA:6-2 字元金字塔 (15分)
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);
}
}
}
插入測試結果:
更新測試:
刪除測試:
查詢測試: