第十九章JDBC和資料庫本章重點19-1Java與資料庫功能19-2進入JDBC的世界19-3資料庫的連結19-4SQL敘述19-5預先編譯的程式19-6資料庫與Java物件第十九章JDBC和資料庫19-1Java與資料庫功能使用分散式的處理,讓資料的存取與管理更具透通性。Java程式設計與資料庫相結合。第十九章JDBC和資料庫19-2進入JDBC的世界何謂JDBCJDBC(JavaDatabaseConnectivity,簡稱JDBC)的作用就是一種讓Java程式和不同的關聯式資料庫進行連接的API。(JDBCforOracle,JDBCforSQL,JDBCforAccess)使用JDBC的好處是不管使用那一種資料庫,應用程式均不需修改。第十九章JDBC和資料庫JDBC的架構下圖例即是Java應用程式和資料庫之間的架構第十九章JDBC和資料庫JDBC的驅動模式JDBC驅動程式依連接方式不同可分為以下四類:JDBC-ODBC橋接器驅動程式(JDBC-ODBCBridgerDriver):採用部份Java程式碼所撰寫的的驅動程式(Native-API/PartlyJavaDriver):JAVA網路協定驅動程式(Net-protocol/AllJavaDriver):Java原始協定驅動程式(Native-Protocol/AllJavaDriver):第十九章JDBC和資料庫JDBC-ODBC橋接器驅動程式Type1:JDBC-ODBCBridgerDriver第十九章JDBC和資料庫Type1:JDBC-ODBCBridgerDriver無法網路存取2-tier資料庫不支援多執行緒(thread)的應用軟體不支援某些java開發軟體(例visualc++)不支援JDBC2.0API新功能採用部份Java程式碼所撰寫的的驅動程式Type2:Native-API/PartlyJavaDriverJAVA網路協定驅動程式Type3:Net-protocol/AllJavaDriverJava原始協定驅動程式Type4:JavaNative-Protocol/AllJavaDriver第十九章JDBC和資料庫19-3資料庫的連結我們要實作一個資料庫,表示得先設定JDBC的應用程式中,並設定ODBC的資料來源於伺服端。其資料來源(DataSource)是以MicrosoftAccess為連結的資料庫,當然我們必須取得MSAccess的JDBC及ODBC驅動程式以便連接資料庫。JDBC提供JAVA連接資料庫,ODBC提供資料庫的資料來源第十九章JDBC和資料庫19-3資料庫的連結資料庫的驅動程式資料庫的JDBC驅動程式的種類及支援廠商可由以下網址得知:第十九章JDBC和資料庫Navati’sJDBCproducts第十九章JDBC和資料庫19-3資料庫的連結驅動程式的下載及安裝如下列步驟:透過網址找到驅動程式。進入查詢的網頁,我們使用Access資料庫,所以把「DriverType」勾選為『4』,DBMS選「MSAccess」,按「Search」按鈕來查詢。進入廠商的下載網站:,進行下載的動作。「」第十九章JDBC和資料庫19-1-1.建立連線的JDBC類別•使用Java.sql.package所包含資料庫相關class及interface(importjava.sql.*)•JDK1.2.2所包含是JDBCAPI是2.0版,在使用的過程當中,常用的class介紹如下:19-3資料庫的連結第十九章JDBC和資料庫DriverManager載入資料庫的驅動程式,用來管理驅動程式與應用程式之間的連結Driver呼叫API,並將資料來源進行轉譯Connection應用程式和資料庫進行連結Statement執行的SQL敘述,如查詢、更新等Metadata取得資料庫內含的資料、驅動程式的相關資訊ResultSet執行敘述後所傳回的資料集19-3資料庫的連結第十九章JDBC和資料庫java.sql.DriverManager是Java.sql.package的一個類別,用來維護Driver,針對應用程式請求的URL進行比對,如果有找到資料庫,則產生回應。Class是java.lang.package的一個類別,forname是一靜態methodClass.forname(“sun.jdbc.odbc.JdbcodbcDriver”)下表為Driver及Connection類別一些常用的方法:19-3資料庫的連結第十九章JDBC和資料庫方法說明staticConnectiongetConnection(Stringurl)以資料庫為參數,建立一個Connection物件staticConnectiongetConnection(Stringurl,Propertiesinfo)建立一個Connection物件,參數一:資料庫,參數二為可自行設定staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)建立一個Connection物件,參數有:資料庫,使用者名稱和密碼staticDrivergetDriver(Stringurl)透過一個Driver物件取得已知資料庫的URLDriver及Connection類別常用的方法第十九章JDBC和資料庫Driver及Connection類別常用的方法載入driver使用drivermanager的一個static方法forname(“drivername”)當連線成功會傳回一個connection物件Connectioncon=DriverManager.getConnection(“jdbc.odbc.Library”)jdbc.odbc.Library是資料庫名稱其指向實體資料庫c:\javabook\Ch19\Library.mdb第十九章JDBC和資料庫Driver及Connection類別常用的方法Statementstmt=con.Createstatement();ResultSetresult=stmt.executeQuery(“select*frommyTable”)要取得回傳結果,可以利用Resultset類別及getResultSet()方法。第十九章JDBC和資料庫【執行結果】19-3資料庫的連結第十九章JDBC和資料庫基本資料庫存取基本資料庫存取是透過Connection物件建立statement物件(java.sql.Statement)以進行SQL指令(select,insert,update,delete)19-3資料庫的連結第十九章JDBC和資料庫19-3資料庫的連結方法說明booleanexecute(Stringsql)執行一個sql敘述傳回多個資料集IntexecuteUpdate()執行更新sql用以檢視動態查詢ResultexecuteQuery(Stringsql)執行一個sql敘述傳回單一資料集int[]executeBatch()將多個addBatch建立的sql敘述以批次方式執行Statement類別的基本操作第十九章JDBC和資料庫19-3資料庫的連結方法說明Booleanfirst()Booleanprevious()Booleannext()Booleanlast()Resultset類別是透過Resultset物件取得executeQuery()所傳回的資訊Resultsetresults=Statement.executeQuery(“select姓名from借書”)傳回第一筆資料傳回前一筆資料傳回下一筆資料傳回最後一筆資料Ch19_02簡單查詢程式第十九章JDBC和資料庫19-3資料庫的連結Metadata類別•使用Metadata類別取得資料庫的基本資訊,其透過java.sql.ResultSetMetadata儲存於ResultSet物件中•查詢資料庫的資訊須使用ResultSetMetadata,ResultSet兩個類別,配合getMetaData()方法以取得ResultSetMetadata的物件索引•可查詢的資料庫資訊包括•多少欄位•欄位名稱是否有大小寫的區分•資料的型別•那一記錄是屬於那一資料表第十九章JDBC和資料庫方法說明intgetColumnCount()以ResultSet物件回傳取得資料的欄位數StringgetColumnName(intcolumn)取得欄位名稱,以String物件傳回StringgetColumnType(intcolumn)取得欄位型態,以SQL型別的int傳回StringgetTableName(intcolumne)取得欄位名稱所在的資料表名稱StringgetColumnLabel(intcolumne)當欄位名稱進行列印時所使用的標籤intgetPrecision(intcolumne)取得欄位名稱的數值精度intgetScale(intcolumne)將欄位名稱的小數位數以int型態傳回Metadata類別常用的方法要取得回傳Metadata結果,可以利用Resultset類別及下列方法第十九章JDBC和資料庫19-4SQL敘述大部分的SQL敘述分為三類:資料定義語言DDL(DataDefinitionLanguage):用來建立資料表定義欄位的敘述。資料操作語言DML(DataManipulationLanguage):屬於資料的基本操作,可用來進行INSERT、UPDATE、DELETE等敘述。資料查詢語言DQL(DataQueryLanguage):用來查詢資料,使用SELECT指令。第十九章JDBC和資料庫19-4SQL敘述SQL的SELECT指令,提供上述的查詢需要,其語法:SELECTcolumnnamel,columnname2FROMtablenamel,tablename2,WHERE子句第十九章JDBC和資料庫19-4SQL敘述SQL指令將WHERE配合INSERT、UPDATE、DELETE指令以進行動態查詢功能更新資訊以Update指令將多筆資訊同時進行更新UPDATEtablename(借書人)SETcolumn1=value(性名=‘宋明華’)WHEREcolumn3=value(‘編號’=20)第十九章JDBC和資料庫19-4SQL敘述SQL指令以INSERT指令以進行資料新增INSERTINTOtablename(column1,,columnn)VALUES(value1,…,valuen)SQL指令以DELETE指令以進行資料刪除DELETEtablenameWHEREcolumn=valueCh19_03簡單資料更新程式Ch19_03簡單資料更新程式Ch19_04簡單資料新增程式Ch19_05簡單資料刪除程式第十九章JDBC和資料庫19-5預先編譯的程式(PreparedStatement)若使用上述的指令於Stat.execute(),將無法重覆使用之前使用過sqlstatement,將造成資料庫的效率降低改善上述問題可運用以下兩種方法一、以PreparedStatement將SQLstatement透過PreparedStatement的參數進行資料庫的查詢二、以SQL的預儲程式(storeprocedure)進行查詢第十九章JDBC和資料庫PreparedStatement物件每次執行同一sql敘述時,可改變參數值使用(?)代表參數使用setX()—setDouble,setFloat,setINT,setString取得參數