整合資料庫 學習目標 了解JDBC架構 使用JDBC API 瞭解交易與隔離層級 認識RowSet.

Slides:



Advertisements
Similar presentations
JSP 与数据库 SQL 语言简介 SQL 语言简介 JDBC 简介 JDBC 简介 使用 JDBC 连接数据库 使用 JDBC 连接数据库 访问数据库 数据库访问应用举例.
Advertisements

第十章 Java 数据库编程. 内容提要 数据库有关概念; 介绍 JDBC 的结构; 重点介绍 JDBC 访问几种数据库的基本过程;
Java 技术与应用 数据库应用 ( 第 14 章 ) 西安交大 卫颜俊 2008 年 12 月 电子信箱: QQ: 网站 : /java.
第14章 JDBC技术和数据库开发应用.
配合< JSP程序设计>例子源代码一起使用
第12章 JDBC数据库应用程序设计.
第十一讲 JDBC JDBC基础 JDBC驱动程序 JDBC编程 示例.
Views ,Stored Procedures, User-defined Function, Triggers
第15章 Java数据库连接(JDBC) 15.1 创建数据源 15.2 JDBC-ODBC桥接器 15.3 顺序查询
JAVA 程式設計與資料結構 第十一章 JDBC.
11-1 JDBC的基礎-說明 昇陽公司提出的資料庫中介軟體(Middleware)稱為「JDBC」(Java Database Connectivity),這是一種開放標準的Java程式介面,可以讓Java程式連接資料庫管理系統, 以Java技術來說,就是實作JDBC驅動程式介面(JDBC Driver.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
JDBC 数据库系统与应用 2014年.
LINQ 建國科技大學 資管系 饒瑞佶.
PHP與SQL語法存取MySQL SQL
後端教學-MYSQL 講師:邱小楓(邱珈蓉)
9/28號專題報告 Web網頁遊戲 曾建瑋.
JAVA vs. SQL Server 建國科技大學 資管系 饒瑞佶 2013/4 V1.
連結資料庫 ACCESS MSSQL.
Q101 在701 SDX Linux上的標準安裝與使用程序v2
第1章 認識Arduino.
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
高等資料庫管理系統 Advanced Database Management System
DataSet.
第八章 利用SELECT查詢資料.
資料庫管理 操作DBMS 指導教授:楊維邦  助教:廖皓翔.
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
2018/11/23 面向对象与多线程综合实验-数据库操作 教师:段鹏飞.
Working with Databases (II) 靜宜大學資管系 楊子青
資料庫操作.
指導教師:張慶寶 老師 組長:4970E079 劉明哲 組員:4970E028 蔡維庭 4991E020 葉聖鴻 4970E004 康有成
HiNet 光世代非固定制 用戶端IPv6設定方式說明
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
R教學 安裝RStudio 羅琪老師.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
Echo Server/Client Speaker:Fang.
連結資料庫管理系統.
App Inventor2呼叫PHP存取MySQL
檔案與磁碟的基本介紹.
Java 程式設計 講師:FrankLin.
FTP檔案上傳下載 實務與運用.
指導老師:黃貞芬 老師 專題組員:B 黃育宇 B 魏志軒 B 平震宇
網路安全技術 OSI七層 學生:A 郭瀝婷 指導教授:梁明章.
Topic Introduction—RMI
第 7 章 JDBC数据库访问.
Ch20. 計算器 (Mac 版本).
Pocket Access.
VB2005 DataBase Manipulation Command for Access
第 19 章 XML記憶體執行模式.
表格(HTML – FORM).
12-0.開發步驟檢查 游峰碩.
GridView.
GridView操作 (II).
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Text To Speech (TTS, 文字轉 語音)、讀簡訊 靜宜大學資管系 楊子青
MiRanda Java Interface v1.0的使用方法
基本指令.
Cloud Operating System - Unit 03: 雲端平台建構實驗
Cloud Training Material- 事件 Sherman Wang
連結資料庫 MYSQL.
多站台網路預約系統之 AJAX即時資料更新機制
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
NFC (近場通訊, Near Field Communication) 靜宜大學資管系 楊子青
SQLite資料庫 靜宜大學資管系 楊子青.
Chapter 4 Multi-Threads (多執行緒).
Joining Multiple Tables
Develop and Build Drives by Visual C++ IDE
InputStreamReader Console Scanner
Presentation transcript:

整合資料庫 學習目標 了解JDBC架構 使用JDBC API 瞭解交易與隔離層級 認識RowSet

簡介JDBC 資料庫本身是個獨立運行的應用程式 撰寫的應用程式是利用網路通訊協定與資料庫進行指令交換,以進行資料的增刪查找

簡介JDBC 應用程式會利用一組專門與資料庫進行通訊協定的程式庫

簡介JDBC 應用程式如何呼叫這組程式庫? 不同的資料庫通常會有不同的通訊協定 用以連線不同資料庫的程式庫在API上也會有所不同

簡介JDBC JDBC全名Java DataBase Connectivity Java連線資料庫的標準規範,定義一組標準類別與介面: 應用程式需要連線資料庫時就呼叫這組標準API,而標準API中的介面會由資料庫廠商實作,通常稱之為JDBC驅動程式(Driver)

簡介JDBC JDBC應用程式開發者介面(Application Developer Interface) 應用程式需要連線資料庫 相關API主要是座落於java.sql與javax.sql JDBC驅動程式開發者介面(Driver Developer Interface) 資料庫廠商要實作驅動程式時的規範,一般開發者並不用瞭解

簡介JDBC

簡介JDBC 應用程式會使用JDBC連線資料庫

簡介JDBC 廠商在實作JDBC驅動程式時,依方式可將驅動程式分作四種類型 Type 1:JDBC-ODBC Bridge Driver Type 2:Native API Dirver Type 3:JDBC-Net Driver Type 4:Native Protocol Driver

Type 1:JDBC-ODBC Bridge Driver

Type 1:JDBC-ODBC Bridge Driver 實作這種驅動程式非常簡單 JDBC與ODBC並非一對一的對應,所以部份呼叫無法直接轉換,因此有些功能是受限的 多層呼叫轉換結果,存取速度也會受到限制 ODBC本身需在平台上先設定好,彈性不足,ODBC驅動程式本身也有跨平台的限制

Type 2:Native API Dirver

Type 2:Native API Dirver 驅動程式本身與平台相依,沒有達到JDBC驅動程式的目標之一:跨平台 直接呼叫資料庫原生API,因此在速度上,有機會成為四種類型中最快的驅動程式 速度的優勢是在於獲得資料庫回應資料後,建構相關 JDBC API 實作物件時 使用前必須先在各平台進行驅動程式的安裝設定(像是安裝資料庫專屬的原生程式庫)

Type 3:JDBC-Net Driver

Type 3:JDBC-Net Driver 可使用純綷的Java技術來實現,可以跨平台 架構彈性高,客戶端不受影響 經由中介伺服器轉換,速度較慢,獲得架構上的彈性是使用這類型驅動程式的目的

Type 4:Native Protocol Driver

Type 4:Native Protocol Driver 驅動程式可以使用純綷Java技術來實現,可以跨平台 效能上也能有不錯的表現 不需要如Type 3獲得架構上的彈性時,通常會使用這類型驅動程式

連接資料庫 為了要連接資料庫系統,必須要有廠商實作的JDBC驅動程式,必須在CLASSPATH中設定驅動程式JAR檔案

連接資料庫 基本資料庫操作相關的JDBC介面或類別是位於java.sql套件中 要取得資料庫連線,必須有幾個動作: 註冊Driver實作物件 取得Connection實作物件 關閉Connectiion實作物件

連接資料庫 以MySQL實作的驅動程式為例,com.mysql.jdbc.Driver類別實作了java.sql.Driver介面 管理Driver實作物件的類別是java.sql.DriverManager

連接資料庫 實際上很少自行撰寫程式碼進行這個動作 只要想辦法載入Driver介面的實作類別.class檔案,就會完成註冊 可以透過java.lang.Class類別的forName(),動態載入驅動程式類別

連接資料庫

連接資料庫 使用JDBC時,要求載入.class檔案的方式有四種: 使用Class.forName() 自行建立Driver介面實作類別的實例 啟動JVM時指定jdbc.drivers屬性 設定JAR中 /services/java.sql.Driver 檔案(JDK6)

連接資料庫 除了「協定」在JDBC URL中總是jdbc開始之外,JDBC URL格式各家資料庫都不相同,必須查詢資料庫產品使用手冊

取得Connection實作物件 以MySQL為例: XML中:

連接資料庫 在處理JDBC時很常遇到的SQLException例外物件,為資料庫操作過程發生錯誤時的代表物件 受檢例外(Checked Exception),必須使用try...catch明確處理,在例外發生時嘗試關閉相關資源

連接資料庫 取得Connection物件之後,可以使用isClosed()方法測試與資料庫的連接是否關閉

連接資料庫 從JDK7之後,JDBC的Connection、Statement、ResultSet等介面,都是java.lang.AutoClosable子介面

連接資料庫 DriverManager如何進行連線?

連接資料庫

使用Statement、ResultSet java.sql.Statement物件是SQL陳述的代表物件 可以使用Connection的createStatement()來建立 可以使用executeUpdate()、executeQuery()等方法來執行 SQL

使用Statement、ResultSet executeUpdate()主要是用來執行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等會改變資料庫內容的SQL executeQuery()方法則是用於SELECT等查詢資料庫的SQL

使用Statement、ResultSet executeUpdate()會傳回int結果,表示資料變動的筆數 executeQuery()會傳回java.sql.ResultSet物件,代表查詢的結果

使用Statement、ResultSet

使用Statement、ResultSet Statement的execute()可以用來執行SQL 傳回true的話表示將傳回查詢結果,可以使用getResultSet()取得ResultSet物件 傳回false,表示傳回更新筆數或沒有結果,可以使用getUpdateCount()取得更新筆數。

使用PreparedStatement

使用ParparedStatement改寫先前MessageDAO中add()執行SQL語句的部份

使用PreparedStatement 安全 ...

使用PreparedStatement 以下username與password將被視作是SQL中純綷的字串,而不會當作SQL語法來解釋

使用CallableStatement 呼叫資料庫的預存程序(Stored Procedure) 必須呼叫prepareCall()建立CallableStatement實例

Java型態與SQL型態對應

Java型態與SQL型態對應 日期時間在JDBC中,並不是使用java.util.Date 年、月、日、時、分、秒、毫秒 在JDBC中要表示日期,是使用java.sql.Date 年、月、日 要表示時間的話則是使用java.sql.Time 時、分、秒 使用java.sql.Timestamp 時、分、秒、微秒

Java型態與SQL型態對應 JDK8新時間日期API 對於TimeStamp實例,你可以使用toInstant()方法將之轉為Instant實例 如果有個Instant實例,可以透過TimeStamp的from()靜態方法,將之轉為TimeStamp實例。

使用DataSource取得連線 實際應用程式開發時,JDBC URL、使用者名稱、密碼等資訊是很敏感的資訊,有些開發人員根本無從得知 如果MessageDAO的使用者無法告知這些資訊,你如何改寫MessageDAO?

使用DataSource取得連線 可以讓MessageDAO依賴於javax.sql.DataSource介面 …

使用DataSource取得連線

使用DataSource取得連線 實作具簡單連接池的DataSource…

使用DataSource取得連線

使用ResultSet捲動、更新資料 從JDBC 2.0開始,ResultSet並不僅可以使用previous()、first()、last()等方法前後移動資料游標,還可以呼叫updateXXX()、updateRow()等方法進行資料修改

使用ResultSet捲動、更新資料 建立Statement或PreparedStatement實例時,可以指定結果集類型與並行方式 結果集類型可以指定三種設定: ResultSet.TYPE_FORWARD_ONLY(預設) ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE

使用ResultSet捲動、更新資料 更新設定可以有兩種指定: ResultSet.CONCUR_READ_ONLY(預設) ResultSet.CONCUR_UPDATABLE

使用ResultSet捲動、更新資料 資料游標移動...

使用ResultSet捲動、更新資料 使用ResultSet進行資料修改 更新資料... 必須選取單一表格 必須選取主鍵 必須選取所有NOT NULL的值 更新資料...

使用ResultSet捲動、更新資料 新增資料 ...

使用ResultSet捲動、更新資料 刪除資料 ...

批次更新 以下每一次執行executeUpdate(),其實都會向資料庫發送一次SQL

批次更新 可以使用addBatch()方法來收集SQL 使用executeBatch()方法將所收集的SQL傳送出去

批次更新 以MySQL驅動程式的Statement實作為例

批次更新 使用executeBatch()時,SQL的執行順序,就是addBatch()時的順序 executeBatch()會傳回int[],代表每筆SQL造成的資料異動列數 先前已開啟的ResultSet會被關閉,執行過後收集SQL用的List會被清空 任何的SQL錯誤,會丟出BatchUpdateException 可以使用這個物件的getUpdateCounts()取得int[],代表先前執行成功的SQL所造成的異動筆數

批次更新 PreparedStatement使用批次更新

批次更新 以MySQL的PreparedStatement實作類別為例

Blob與Clob BLOB全名Binary Large Object,用於儲存大量的二進位資料,像是圖檔、影音檔等 CLOB全名Character Large Object,用於儲存大量的文字資料 java.sql.Blob與java.sql.Clob兩個類別分別代表BLOB與CLOB資料

Blob與Clob Blob擁有getBinaryStream()、getBytes()等方法,可以取得代表欄位來源的InputStream或欄位的byte[]資料 Clob擁有getCharacterStream()、getAsciiStream()等方法,可以取得Reader或InputStream等資料

Blob與Clob 也可以把BLOG欄位對應byte[]或輸入/輸出串流 使用PreparedStatement的setBytes()來設定要存入的byte[]資料,使用setBinaryStream()來設定代表輸入來源的InputStream 使用ResultSet的getBytes()以byte[]取得欄位中儲存的資料,或以getBinaryStream()取得代表欄位來源的InputStream

Blob與Clob

簡介交易 原子性(Atomicity) 一致性(Consistency) 隔離行為(Isolation behavior) 持續性(Durability)

隔離行為 可以透過Connection的getTransactionIsolation()取得資料庫目前的隔離行為設定 透過setTransactionIsolation()可提示資料庫設定指定的隔離行為

隔離行為 可設定常數是定義在Connection上 TRANSACTION_NONE TRANSACTION_UNCOMMITTED TRANSACTION_COMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE

更新遺失(Lost update)

Read uncommited

髒讀(Dirty read)

Read commited

無法重複的讀取(Unrepeatable read)

Repeatable read

幻讀(Phantom read) 同一交易期間,讀取到的資料筆數不一致。例如交易A第一次讀取得到五筆資料,此時交易B新增了一筆資料,導致交易B再次讀取得到六筆資料 如果隔離行為設定為可重複讀取,但發生幻讀現象,可以設定隔離層級為「可循序」(Serializable),也就是在有交易時若有資料不一致的疑慮,交易必須可以照順序逐一進行

隔離行為與可預防之問題

隔離行為 得知是否支援某個隔離行為

簡介metadata 詮讀資料的資料(Data about data ) 可以透過Connection的getMetaData()方法取得DatabaseMetaData物件 可以透過ResultSet的getMetaData()方法,取得ResultSetMetaData物件

簡介RowSet javax.sql.RowSet代表資料的列集合 這邊的資料並不一定是資料庫中的資料,可以是試算表資料、XML資料或任何具有列集合概念的資料來源 是ResultSet的子介面,新增了一些行為,像是透過setCommand()設定查詢指令、透過execute()執行查詢指令以填充資料等

簡介RowSet 連線式 離線式

簡介RowSet JdbcRowSet是連線式的RowSet CachedRowSet為離線式的RowSet 操作JdbcRowSet期間,會保持與資料庫的連線,可視為取得、操作ResultSet行為封裝,可簡化JDBC程式的撰寫,或作為JavaBean使用 CachedRowSet為離線式的RowSet 查詢並充填完資料後,就會斷開與資料來源的連線,而不用佔據相關連線資源,必要也可以再與資料來源連線進行資料同步

簡介RowSet 若使用Oracle/Sun JDK附帶的JdbcRowSetImpl,在JDK6之前,可以如下建立JdbcRowSet實例: 在JDK7之後,新增了javax.sql.rowset.RowSetFactory介面與javax.sql.rowset.RowSetProvider類別

簡介RowSet 如果使用Oracle/Sun JDK,以上程式片段會取得JdbcRowSetImpl實例 可以在啟動JVM時,利用系統屬性"javax.sql.rowset.RowSetFactory"指定其它廠商實作

簡介RowSet 使用RowSet查詢資料

簡介RowSet 在查詢之後,想要離線進行操作,則可以使用CachedRowSet或其子介面實作物件 使用close()關閉CachedRowSet,若在相關更新操作之後,想與再與資料來源進行同步,則可以呼叫acceptChanges()方法

簡介RowSet WebRowSet是CachedRowSet的子介面,其不僅具備離線操作,還能進行XML讀寫

簡介RowSet

簡介RowSet FilteredRowSet可以對列集合進行過濾,實現類似SQL中WHERE等條件式的功能 JoinRowSet則可以讓你結合兩個RowSet物件,實現類似SQL中JOIN的功能 http://docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html