(第三、四講)ch04JDBC編程技術(shù)_第1頁
(第三、四講)ch04JDBC編程技術(shù)_第2頁
(第三、四講)ch04JDBC編程技術(shù)_第3頁
(第三、四講)ch04JDBC編程技術(shù)_第4頁
(第三、四講)ch04JDBC編程技術(shù)_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JDBC編程技術(shù)MySQL數(shù)據(jù)庫JDBC編程基本概念JDBC高級(jí)編程數(shù)據(jù)庫分層設(shè)計(jì)

本章主要目標(biāo)

MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQLAB公司,在2008年1月16號(hào)被Sun公司收購。MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫。另外MySQL尤其受到Java教育的歡迎。是學(xué)習(xí)JavaEE編程者的首選數(shù)據(jù)庫。MySQL數(shù)據(jù)庫JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface,即應(yīng)用程序設(shè)計(jì)接口)。它由一些Java類組成。JDBC給數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺(tái)工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。通過使用JDBC,開發(fā)人員可以很方便地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫。也就是說,開發(fā)人員可以不必寫一個(gè)程序訪問SyBase,寫另一個(gè)程序訪問Oracle,再寫一個(gè)程序訪問Microsoft的SQLServer。用JDBC寫的程序能夠自動(dòng)地將SQL語句傳送給相應(yīng)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。不但如此,使用Java編寫的應(yīng)用程序可以在任何支持Java的平臺(tái)上運(yùn)行,不必在不同的平臺(tái)上編寫不同的應(yīng)用。JDBC編程基本概念(1)簡(jiǎn)單地說,JDBC能完成下列三件事:(1)同一個(gè)數(shù)據(jù)庫建立連接;(2)向數(shù)據(jù)庫發(fā)送SQL語句;(3)處理數(shù)據(jù)庫返回的結(jié)果。JDBC編程基本概念(2)JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface,即應(yīng)用程序設(shè)計(jì)接口)。它由一些Java類組成。JDBC給數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺(tái)工具開發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。通過使用JDBC,開發(fā)人員可以很方便地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫。也就是說,開發(fā)人員可以不必寫一個(gè)程序訪問SyBase,寫另一個(gè)程序訪問Oracle,再寫一個(gè)程序訪問Microsoft的SQLServer。用JDBC寫的程序能夠自動(dòng)地將SQL語句傳送給相應(yīng)的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。不但如此,使用Java編寫的應(yīng)用程序可以在任何支持Java的平臺(tái)上運(yùn)行,不必在不同的平臺(tái)上編寫不同的應(yīng)用。JDBC數(shù)據(jù)庫編程基本步驟(1)第1步:將驅(qū)動(dòng)程序?qū)氲焦こ?程序中加載驅(qū)動(dòng)。應(yīng)用程序與數(shù)據(jù)庫是兩個(gè)獨(dú)立的產(chǎn)品,如果我們使用Java連接數(shù)據(jù)庫,我們需要驅(qū)動(dòng)將兩者聯(lián)系起來。如果把連接對(duì)象看做是應(yīng)用程序同數(shù)據(jù)庫連接的橋梁的話,驅(qū)動(dòng)程序類似于建造該橋梁的原材料。隨著連接的數(shù)據(jù)庫不同,驅(qū)動(dòng)也不同。JDBC驅(qū)動(dòng)程序是由很多訪問數(shù)據(jù)庫的類構(gòu)成,為了管理方便將這些類打包成一個(gè).jar文件。驅(qū)動(dòng)可以在網(wǎng)上下載。并且需要添加到工程中。我們?cè)L問MySQL數(shù)據(jù)庫驅(qū)動(dòng)文件為”mysql-connector-java-3.1.10-bin.jar”Stringdriver="com.mysql.jdbc.Driver";//驅(qū)動(dòng)程序描述字符串

Class.forName(driver);//在程序中根據(jù)驅(qū)動(dòng)程序描述字符串加載驅(qū)動(dòng)程序JDBC數(shù)據(jù)庫編程基本步驟(2)第2步:創(chuàng)建連接對(duì)象Connection在主函數(shù)中定義的連接數(shù)據(jù)庫字符串url,url包括數(shù)據(jù)庫服務(wù)器地址及數(shù)據(jù)庫名。我在這里使用的是MySQL數(shù)據(jù)庫,所以我用的是MySQL驅(qū)動(dòng)程序,不同的數(shù)據(jù)庫用不同的驅(qū)動(dòng)程序,如果你用的不是MySQL,請(qǐng)?zhí)鎿Q此行。服務(wù)器地址是你安裝數(shù)據(jù)庫的主機(jī)的IP,如果在本機(jī),你也可以用"localhost"來連接。數(shù)據(jù)庫名是你已經(jīng)在數(shù)據(jù)庫系統(tǒng)中建立過的,這里是support.Stringurl="jdbc:mysql://127.0.0.1:3306/support";//一般形式是jdbc:mysql://數(shù)據(jù)庫IP地址:端口/數(shù)據(jù)庫名

Connectioncon=DriverManager.getConnection(url,"root","1234");//"root","1234"是連接MySQL的用戶名,密碼,根據(jù)實(shí)際情況修改JDBC數(shù)據(jù)庫編程基本步驟(3)第3步:在連接對(duì)象上創(chuàng)建命令對(duì)象Statement通過Statement類所提供的方法,可以利用標(biāo)準(zhǔn)的SQL命令,對(duì)數(shù)據(jù)庫直接新增、刪除或修改操作

Statementcmd=con.createStatement();第4步:執(zhí)行SQL語句

Stringsql="select*fromcustomers";

執(zhí)行select語句,返回結(jié)果集ResultSet,ResultSet本質(zhì)上是指向數(shù)據(jù)行的游標(biāo)。每調(diào)用一次next()方法,游標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用next將把光標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用next導(dǎo)致游標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取ResultSet行。JDBC數(shù)據(jù)庫編程基本步驟(4)createtablestudents(snointnotnullprimarykey,snamevarchar(15),ssexvarchar(2),sdeptvarchar(15));

則我們執(zhí)行查詢命令之后取數(shù)據(jù)語句如下:Statementcmd=con.createStatement();Stringsql="select*fromstudents";ResultSetrs=cmd.executeQuery(sql);JDBC數(shù)據(jù)庫編程基本步驟(5)while(rs.next()){intsno=rs.getInt(1);//表示取當(dāng)前行第一列,因?yàn)檫@列數(shù)據(jù)類型是int類型的所以使用getInt()方法

Stringsname=rs.getString(2);//表示取當(dāng)前行第二列

Stringssex=rs.getString(3);//表示取當(dāng)前行第三列

Stringsdept=rs.getString(4);//表示取當(dāng)前行第四列

System.out.printf("%-8d%-20s%-3s%-20s\n",sno,sname,ssex,sdept);}第5步:關(guān)閉連接。關(guān)閉連接是一種好的編程習(xí)慣。不使用數(shù)據(jù)庫就不要占著連接了。

con.close();JDBC數(shù)據(jù)庫編程基本步驟(6)完整示例連SQLServer數(shù)據(jù)庫的加載驅(qū)動(dòng)、創(chuàng)建連接

:driver=com.microsoft.jdbc.sqlserver.SQLServerDriverurl="jdbc:sqlserver://127.0.0.1:1433;databaseName=usermanager";JDBC數(shù)據(jù)庫編程基本步驟(7)JDBC高級(jí)編程(1)1、PreparedStatement概念什么是帶參數(shù)的Sql語句,在JDBC中如果Sql語句帶有?(占位符)號(hào),如:Stringsql="select*fromstudentswheresno=?";這里并不是表示查詢學(xué)號(hào)為?的學(xué)生,而是表示這里是一個(gè)參數(shù),在執(zhí)行該語句之前,必須到參數(shù)賦值。在JDBC應(yīng)用中,如果你已經(jīng)是稍有水平開發(fā)者,你就應(yīng)該始終以PreparedStatement代替Statement.也就是說,減少使用Statement?;谝韵碌脑颍?1)代碼的可讀性和可維護(hù)性雖然用PreparedStatement來代替Statement會(huì)使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護(hù)性上來說.都比直接用Statement的代碼好多了。cmd.executeUpdate("insertintotb_name(col1,col2,col2,col4)values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");cmd=con.prepareStatement("insertintotb_name(col1,col2,col2,col4)values(?,?,?,?)")JDBC高級(jí)編程(2)(2)PreparedStatement提高性能每一種數(shù)據(jù)庫都會(huì)盡最大努力對(duì)預(yù)編譯語句提供最大的性能優(yōu)化.因?yàn)轭A(yù)編譯語句有可能被重復(fù)調(diào)用。所以語句在被DB的編譯器編譯后的執(zhí)行代碼被緩存下來,那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中(相當(dāng)于一個(gè)涵數(shù))就會(huì)得到執(zhí)行。JDBC高級(jí)編程(3)2、如何使用PreparedStatement第1步:通過連接獲得PreparedStatement對(duì)象,用帶占位符(?)的構(gòu)造sql語句。

PreparedStatementcmd=con.preparedStatement(“select*fromStudentswheresname=?”);第2步:設(shè)置輸入?yún)?shù)值。一定要在執(zhí)行sql語句設(shè)置值。

cmd.setString(1,"張三");//1表示從左到右數(shù)的第一個(gè)參數(shù),"張三"是為第一個(gè)參數(shù)設(shè)置的值,如果還有其它參數(shù)需要一個(gè)一個(gè)賦值。JDBC高級(jí)編程(4)第3步:執(zhí)行sql語句rs=cmd.excuteQuery();Statement發(fā)送完整的Sql語句到數(shù)據(jù)庫不是直接執(zhí)行而是由數(shù)據(jù)庫先編譯,再運(yùn)行。每次都需要編譯。而PreparedStatement是先發(fā)送帶參數(shù)的Sql語句,由數(shù)據(jù)庫先編譯,再發(fā)送一組組參數(shù)值。JDBC高級(jí)編程(5)JDBC高級(jí)編程(6)元數(shù)據(jù)最本質(zhì)、最抽象的定義為:dataaboutdata(關(guān)于數(shù)據(jù)的數(shù)據(jù))。它是一種廣泛存在的現(xiàn)象,在許多領(lǐng)域有其具體的定義和應(yīng)用。簡(jiǎn)單的說元數(shù)據(jù)就是關(guān)于數(shù)據(jù)的數(shù)據(jù)或關(guān)于信息的信息。例如:書的文本就是書的數(shù)據(jù),而書名、作者、版權(quán)數(shù)據(jù)都是書的元數(shù)據(jù)。一般數(shù)據(jù)庫系統(tǒng)用他來表示數(shù)據(jù)的信息,例如數(shù)據(jù)的類型,長度,存放位置等關(guān)于數(shù)據(jù)的信息用來管理和維護(hù)數(shù)據(jù)。元數(shù)據(jù)的使用,可以大大提高系統(tǒng)的檢索和管理的效率。連接和結(jié)果集的大量信息可以從元數(shù)據(jù)對(duì)象中得到,JDBC提供了兩個(gè)元數(shù)據(jù)對(duì)象類型DatabaseMetaData和ResultSetMetaData。如何獲得元數(shù)據(jù)MetaData(1)JDBC通過元數(shù)據(jù)(MetaData)來獲得具體的表的相關(guān)信息,例如,可以查詢數(shù)據(jù)庫中有哪些表,表有哪些字段,以及字段的屬性等。MetaData中通過一系列g(shù)etXXX將這些信息返回給我們。數(shù)據(jù)庫元數(shù)據(jù)DatabaseMetaData用connection.getMetaData()獲得;包含了關(guān)于數(shù)據(jù)庫整體元數(shù)據(jù)信息。結(jié)果集元數(shù)據(jù)ResultSetMetaData用resultSet.getMetaData()獲得;比較重要的是獲得表的列名,列數(shù)等信息。如何獲得元數(shù)據(jù)MetaData(2)

1、結(jié)果集元數(shù)據(jù)對(duì)象:ResultSetMetaDatameta=rs.getMetaData();

字段個(gè)數(shù):meta.getColomnCount();

字段名字:meta.getColumnName();

字段JDBC類型:meta.getColumnType();

字段數(shù)據(jù)庫類型:meta.getColumnTypeName();2、數(shù)據(jù)庫元數(shù)據(jù)對(duì)象:DatabaseMetaDatadbmd=con.getMetaData();

數(shù)據(jù)庫名:dbmd.getDatabaseProductName();

數(shù)據(jù)庫版本號(hào):dbmd.getDatabaseProductVersion();數(shù)據(jù)庫驅(qū)動(dòng)名:dbmd.getDriverName();數(shù)據(jù)庫驅(qū)動(dòng)版本號(hào):dbmd.getDriverVersion();數(shù)據(jù)庫Url:dbmd.getURL();該連接的登陸名:dbmd.getUserName();如何獲得元數(shù)據(jù)MetaData(3)

如何獲得元數(shù)據(jù)MetaData(4)事務(wù)處理(1)

1、什么是Java事務(wù)通俗的理解,事務(wù)是一組原子操作單元,從數(shù)據(jù)庫角度說,就是一組SQL指令,要么全部執(zhí)行成功,若因?yàn)槟硞€(gè)原因其中一條指令執(zhí)行有錯(cuò)誤,則撤銷先前執(zhí)行過的所有指令。更簡(jiǎn)潔的說就是:要么全部執(zhí)行成功,要么撤銷全不不執(zhí)行。既然事務(wù)的概念從數(shù)據(jù)庫而來,那Java事務(wù)是什么?之間有什么聯(lián)系?實(shí)際上,一個(gè)Java應(yīng)用系統(tǒng),如果要操作數(shù)據(jù)庫,則通過JDBC來實(shí)現(xiàn)的。增加、修改、刪除都是通過相應(yīng)方法間接來實(shí)現(xiàn)的,事務(wù)的控制也相應(yīng)轉(zhuǎn)移到Java程序代碼中。因此,數(shù)據(jù)庫操作的事務(wù)習(xí)慣上就稱為Java事務(wù)。事務(wù)處理(2)2、為什么需要事務(wù)事務(wù)是為解決數(shù)據(jù)安全操作提出的,事務(wù)控制實(shí)際上就是控制數(shù)據(jù)的安全訪問。舉一個(gè)簡(jiǎn)單例子:比如銀行轉(zhuǎn)帳業(yè)務(wù),賬戶A要將自己賬戶上的1000元轉(zhuǎn)到B賬戶下面,A賬戶余額首先要減去1000元,然后B賬戶要增加1000元。假如在中間網(wǎng)絡(luò)出現(xiàn)了問題,A賬戶減去1000元已經(jīng)結(jié)束,B因?yàn)榫W(wǎng)絡(luò)中斷而操作失敗,那么整個(gè)業(yè)務(wù)失敗,必須做出控制,要求A賬戶轉(zhuǎn)帳業(yè)務(wù)撤銷。這才能保證業(yè)務(wù)的正確性,完成這個(gè)操走就需要事務(wù),將A賬戶資金減少和B賬戶資金增加方到一個(gè)事務(wù)里面,要么全部執(zhí)行成功,要么操作全部撤銷,這樣就保持了數(shù)據(jù)的安全性。事務(wù)處理(3)3、JDBC事務(wù)JDBC事務(wù)是用Connection對(duì)象控制的。Connection提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。在JDBC中,事務(wù)操作缺省是自動(dòng)提交。也就是說,一條對(duì)數(shù)據(jù)庫的更新表達(dá)式代表一項(xiàng)事務(wù)操作,操作成功后,系統(tǒng)將自動(dòng)調(diào)用commit()來提交,否則將調(diào)用rollback()來回滾。在JDBC中,可以通過調(diào)用setAutoCommit(false)來禁止自動(dòng)提交。之后就可以把多個(gè)數(shù)據(jù)庫操作的表達(dá)式作為一個(gè)事務(wù),在操作完成后調(diào)用commit()來進(jìn)行整體提交,倘若其中一個(gè)表達(dá)式操作失敗,都不會(huì)執(zhí)行到commit(),并且將產(chǎn)生響應(yīng)的異常;此時(shí)就可以在異常捕獲時(shí)調(diào)用rollback()進(jìn)行回滾。這樣做可以保持多次更新操作后,相關(guān)數(shù)據(jù)的一致性,示例如下:事務(wù)處理(4)數(shù)據(jù)庫分層設(shè)計(jì)(1)1、常用的O/R映射對(duì)象關(guān)系映射(ObjectRelationalMapping,簡(jiǎn)稱ORM)是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。簡(jiǎn)單的說,ORM是通過使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。ORM是隨著面向?qū)ο蟮能浖_發(fā)方法發(fā)展而產(chǎn)生的。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法,關(guān)系數(shù)據(jù)庫是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系統(tǒng)。對(duì)象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實(shí)體的兩種表現(xiàn)形式,業(yè)務(wù)實(shí)體在內(nèi)存中表現(xiàn)為對(duì)象,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對(duì)象之間存在關(guān)聯(lián)和繼承關(guān)系,而在數(shù)據(jù)庫中,關(guān)系數(shù)據(jù)無法直接表達(dá)多對(duì)多關(guān)聯(lián)和繼承關(guān)系。因此,對(duì)象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實(shí)現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射。數(shù)據(jù)庫分層設(shè)計(jì)(2)分層設(shè)計(jì)示例我們現(xiàn)在編寫程序都要分層設(shè)計(jì),也即數(shù)據(jù)庫訪問放在一個(gè)類或幾個(gè)類中。然后界面層調(diào)用,我今天使用一下OR映射思想,這個(gè)在后面開源章節(jié)里會(huì)詳細(xì)介紹,所謂OR映射是指將數(shù)據(jù)庫的表映射成程序中的類,表中列映射稱為類的屬性。對(duì)數(shù)據(jù)庫訪問的一些操作簡(jiǎn)稱DAO層。

本章小結(jié)我們主要介紹了Java數(shù)據(jù)訪問技術(shù)JDBC。在應(yīng)用程序中數(shù)據(jù)都要進(jìn)行持久化存儲(chǔ)。持久化存儲(chǔ)就是將數(shù)據(jù)存儲(chǔ)在文件中或數(shù)據(jù)庫中,不會(huì)因

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論