第10章 數(shù)據(jù)庫(kù)編程_第1頁(yè)
第10章 數(shù)據(jù)庫(kù)編程_第2頁(yè)
第10章 數(shù)據(jù)庫(kù)編程_第3頁(yè)
第10章 數(shù)據(jù)庫(kù)編程_第4頁(yè)
第10章 數(shù)據(jù)庫(kù)編程_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章數(shù)據(jù)庫(kù)編程《Java基礎(chǔ)案例教程》(第3版)學(xué)習(xí)目標(biāo)/Target掌握J(rèn)DBC的常用API,能夠簡(jiǎn)述JDBC常用API的作用

了解JDBC,能夠簡(jiǎn)述JDBC的概念及優(yōu)點(diǎn)掌握DbUtils的使用,能夠使用DbUtils進(jìn)行數(shù)據(jù)的增刪改查學(xué)習(xí)目標(biāo)/Target熟悉DbUtils的作用,能夠簡(jiǎn)述QueryRunner中執(zhí)行查詢(xún)、插入、更新和刪除操作的方法,以及ResultSetHandler中常用實(shí)現(xiàn)類(lèi)封裝結(jié)果集的特點(diǎn)熟悉數(shù)據(jù)庫(kù)連接池,能夠在JDBC程序中使用數(shù)據(jù)庫(kù)連接池掌握J(rèn)DBC編程,能夠獨(dú)立編寫(xiě)JDBC程序操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)章節(jié)概述/

Summary為了滿(mǎn)足業(yè)務(wù)需求,應(yīng)用程序通常需要存儲(chǔ)和管理數(shù)據(jù)??紤]到高效性、便捷性和安全性,大多數(shù)應(yīng)用程序都會(huì)選擇將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中進(jìn)行管理。在與數(shù)據(jù)庫(kù)交互時(shí),應(yīng)用程序需要使用特定的技術(shù)來(lái)連接和操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)。其中,JDBC是Java用于訪(fǎng)問(wèn)關(guān)系型數(shù)據(jù)庫(kù)的一種技術(shù)。本章將講解使用JDBC在Java應(yīng)用程序中進(jìn)行數(shù)據(jù)庫(kù)編程的相關(guān)知識(shí)。目錄/Contents0102JDBC簡(jiǎn)介JDBC編程03數(shù)據(jù)庫(kù)連接池03DbUtilsJDBC簡(jiǎn)介10.110.1.1JDBC概述了解JDBC概述,能夠簡(jiǎn)述JDBC的概念及優(yōu)點(diǎn)

先定一個(gè)小目標(biāo)!10.1.1JDBC概述數(shù)據(jù)庫(kù)編程是指使用編程語(yǔ)言與數(shù)據(jù)庫(kù)進(jìn)行交互的過(guò)程,主要涉及與數(shù)據(jù)庫(kù)建立連接、執(zhí)行SQL語(yǔ)句、讀取和寫(xiě)入數(shù)據(jù)等操作。其中,驅(qū)動(dòng)程序是根據(jù)數(shù)據(jù)庫(kù)的規(guī)范和要求實(shí)現(xiàn)的程序,是連接和操作數(shù)據(jù)庫(kù)的必要組件,不同的數(shù)據(jù)庫(kù)可能有不同的規(guī)范和要求,因此提供的驅(qū)動(dòng)程序也會(huì)有所差異。10.1.1JDBC概述在JDBC(JavaDatabaseConnectivity,Java數(shù)據(jù)庫(kù)互聯(lián))出現(xiàn)之前,各數(shù)據(jù)庫(kù)廠(chǎng)商提供自己獨(dú)立的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,開(kāi)發(fā)人員想要操作不同類(lèi)型的數(shù)據(jù)庫(kù),需要編寫(xiě)專(zhuān)門(mén)針對(duì)每個(gè)數(shù)據(jù)庫(kù)的程序。例如,要訪(fǎng)問(wèn)MySQL數(shù)據(jù)庫(kù)就需要編寫(xiě)一種程序,要訪(fǎng)問(wèn)Oracle數(shù)據(jù)庫(kù)就需要編寫(xiě)另一種程序。這種情況下,應(yīng)用程序的可移植性非常差,因?yàn)槊看吻袚Q數(shù)據(jù)庫(kù)都需要修改和適配程序。10.1.1JDBC概述JDBC的出現(xiàn)解決了上述問(wèn)題,JDBC是一套訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)Java類(lèi)庫(kù),它定義了應(yīng)用程序訪(fǎng)問(wèn)和操作數(shù)據(jù)庫(kù)的API。通過(guò)JDBC,開(kāi)發(fā)人員可以使用相同的API操作MySQL、Oracle或其他關(guān)系型數(shù)據(jù)庫(kù)。10.1.1JDBC概述Java應(yīng)用程序通過(guò)JDBC訪(fǎng)問(wèn)不同關(guān)系型數(shù)據(jù)庫(kù)的流程如下圖所示。10.1.2JDBC常用API掌握J(rèn)DBC的常用API,能夠簡(jiǎn)述JDBC常用API的作用

先定一個(gè)小目標(biāo)!10.1.2JDBC常用APIJDBC的API主要位于java.sql包中,該包定義了一系列訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的接口和類(lèi),Java程序開(kāi)發(fā)人員可以利用這些接口和類(lèi),編寫(xiě)操作數(shù)據(jù)庫(kù)數(shù)據(jù)的JDBC程序。下面將針對(duì)java.sql包內(nèi)常用的接口和類(lèi)進(jìn)行講解。(1)Driver接口Driver接口是JDBC驅(qū)動(dòng)程序的核心接口之一,它定義了與數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序進(jìn)行通信的方法。每個(gè)數(shù)據(jù)庫(kù)廠(chǎng)商都會(huì)提供自己的驅(qū)動(dòng)程序并實(shí)現(xiàn)Driver接口,以支持應(yīng)用程序與該數(shù)據(jù)庫(kù)的連接。在編寫(xiě)JDBC程序時(shí),需要把所使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序或類(lèi)庫(kù)加載到項(xiàng)目的classpath中。10.1.2JDBC常用API(2)DriverManager類(lèi)DriverManager類(lèi)是用于管理JDBC驅(qū)動(dòng)程序的類(lèi),該類(lèi)中定義了注冊(cè)驅(qū)動(dòng)程序及獲取數(shù)據(jù)庫(kù)連接對(duì)象的靜態(tài)方法,其常用方法如下表所示。方法聲明功能描述staticvoidregisterDriver(Driver

driver)用于在DriverManager中注冊(cè)給定的JDBC驅(qū)動(dòng)程序staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)用于建立和數(shù)據(jù)庫(kù)的連接,并返回表示連接的Connection對(duì)象需要注意的是,在編寫(xiě)代碼時(shí),一般不會(huì)使用registerDriver(Driver

driver)方法注冊(cè)驅(qū)動(dòng)。因?yàn)镈riverManager類(lèi)中有一個(gè)靜態(tài)代碼塊,該靜態(tài)代碼塊內(nèi)部會(huì)執(zhí)行DriverManager對(duì)象的

registerDriver()方法注冊(cè)驅(qū)動(dòng),所以,如果使用registerDriver()方法注冊(cè)驅(qū)動(dòng),相當(dāng)于注冊(cè)了兩次驅(qū)動(dòng)程序。10.1.2JDBC常用API(2)DriverManager類(lèi)如果想要手動(dòng)注冊(cè)驅(qū)動(dòng),只需加載Driver類(lèi)就可以實(shí)現(xiàn),手動(dòng)注冊(cè)驅(qū)動(dòng)程序的示例如下。com.mysql.cj.jdbc.Driver為需要注冊(cè)到DriverManager的驅(qū)動(dòng)類(lèi)。需要注意的是,使用Class類(lèi)的forName()方法注冊(cè)驅(qū)動(dòng)時(shí),參數(shù)中指定的驅(qū)動(dòng)類(lèi)必須是類(lèi)的全限定名。Class.forName("com.mysql.cj.jdbc.Driver");10.1.2JDBC常用API(2)DriverManager類(lèi)JDBC根據(jù)URL的信息與數(shù)據(jù)庫(kù)建立連接,其URL需要按照特定的語(yǔ)法格式來(lái)配置。具體的URL格式會(huì)根據(jù)不同的數(shù)據(jù)庫(kù)類(lèi)型和驅(qū)動(dòng)程序而有所變化,其中連接到MySQL數(shù)據(jù)庫(kù)的URL語(yǔ)法格式如下。jdbc:mysql://[hostname]:[port]/database-name[?參數(shù)鍵值對(duì)1&參數(shù)鍵值對(duì)2…]10.1.2JDBC常用API(2)DriverManager類(lèi)對(duì)連接到MySQL數(shù)據(jù)庫(kù)的URL語(yǔ)法格式中的各項(xiàng)解釋如下。“jdbc:mysql://”:表示JDBC驅(qū)動(dòng)程序使用

MySQL協(xié)議進(jìn)行連接。hostname:數(shù)據(jù)庫(kù)的主機(jī)名或IP地址。port:數(shù)據(jù)庫(kù)的端口號(hào),如果連接的是本機(jī)MySQL數(shù)據(jù)庫(kù),并且使用MySQL的默認(rèn)端口號(hào)3306,則URL中的[hostname]:[port]可以省略。database-name:數(shù)據(jù)庫(kù)名稱(chēng),如果需要在URL中定制連接的一些屬性和配置,可以在數(shù)據(jù)庫(kù)名稱(chēng)后面使用問(wèn)號(hào)(?)進(jìn)行聲明,如果需要添加多個(gè)參數(shù)鍵值對(duì),參數(shù)鍵值對(duì)之間使用&進(jìn)行連接。10.1.2JDBC常用API(2)DriverManager類(lèi)編寫(xiě)JDBC程序中,注冊(cè)驅(qū)動(dòng)和獲取數(shù)據(jù)庫(kù)連接的示例代碼如下。//注冊(cè)驅(qū)動(dòng)Class.forName("com.mysql.cj.jdbc.Driver");//數(shù)據(jù)庫(kù)的連接路徑Stringurl="jdbc:mysql://localhost:3306/jdbc";Stringusername="root";Stringpassword="root";//獲取數(shù)據(jù)庫(kù)連接Connectionconn=DriverManager.getConnection(url,username,password);10.1.2JDBC常用API

小提示:如果基于MySQL5之后的驅(qū)動(dòng)包編寫(xiě)操作數(shù)據(jù)庫(kù)數(shù)據(jù)的JDBC程序時(shí),可以省略注冊(cè)驅(qū)動(dòng)的步驟。程序執(zhí)行時(shí)會(huì)自動(dòng)加載驅(qū)動(dòng)包的META-INF/services/java.sql.Driver文件中的驅(qū)動(dòng)類(lèi)。MySQL5的驅(qū)動(dòng)類(lèi)名稱(chēng)為com.mysql.jdbc.Driver,MySQL8的驅(qū)動(dòng)類(lèi)為com.mysql.cj.jdbc.Driver。(2)DriverManager類(lèi)10.1.2JDBC常用API(3)Connection接口Connection接口用于表示與數(shù)據(jù)庫(kù)的連接,是進(jìn)行數(shù)據(jù)庫(kù)操作的主要入口點(diǎn)??梢酝ㄟ^(guò)Connection對(duì)象與數(shù)據(jù)庫(kù)建立連接,并進(jìn)行各種數(shù)據(jù)庫(kù)操作,包括執(zhí)行SQL查詢(xún)、更新數(shù)據(jù)和進(jìn)行事務(wù)管理等。10.1.2JDBC常用API(3)Connection接口Connection接口的常用方法如下表所示。方法聲明功能描述StatementcreateStatement()用于創(chuàng)建一個(gè)Statement對(duì)象,Statement對(duì)象可以執(zhí)行靜態(tài)SQL語(yǔ)句PreparedStatementprepareStatement(Stringsql)用于創(chuàng)建一個(gè)PreparedStatement對(duì)象,PreparedStatement對(duì)象可以執(zhí)行預(yù)編譯的SQL語(yǔ)句voidcommit()用于提交事務(wù),使所有上一次提交/回滾后進(jìn)行的更改成為持久更改,并釋放當(dāng)前Connection對(duì)象持有的所有數(shù)據(jù)庫(kù)鎖voidsetAutoCommit(booleanautoCommit)用于設(shè)置是否關(guān)閉自動(dòng)提交模式voidroolback()用于回滾事務(wù),用于取消在當(dāng)前事務(wù)中進(jìn)行的所有更改,并釋放當(dāng)前Connection對(duì)象持有的所有數(shù)據(jù)庫(kù)鎖voidclose()用于關(guān)閉與數(shù)據(jù)庫(kù)的連接并釋放資源10.1.2JDBC常用API(3)Connection接口Connectionconn=DriverManager.getConnection(url,username,password);Stringsql="SELECT*FROMuserWHEREid=1";//定義SQL語(yǔ)句Statementstmt=conn.createStatement();//獲取執(zhí)行SQL語(yǔ)句的對(duì)象

Statementtry{

conn.setAutoCommit(false);//關(guān)閉事務(wù)的自動(dòng)提交,手動(dòng)提交事務(wù)

stmt.executeUpdate(sql);//執(zhí)行SQL語(yǔ)句

mit();//提交事務(wù)}catch(Exceptionthrowables){

conn.rollback();

//回滾事務(wù) throwables.printStackTrace();}stmt.close();//釋放資源conn.close();編寫(xiě)JDBC程序時(shí),通過(guò)Connection進(jìn)行事物管理的示例如右所示。10.1.2JDBC常用API(4)Statement接口Statement接口是Java中用于執(zhí)行SQL語(yǔ)句的重要接口之一,該接口的實(shí)例可以通過(guò)Connection對(duì)象的createStatement()方法獲取,通過(guò)該接口實(shí)例可以將靜態(tài)SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中進(jìn)行編譯與執(zhí)行,并返回?cái)?shù)據(jù)庫(kù)的處理結(jié)果。靜態(tài)SQL語(yǔ)句是指在編譯時(shí)就確定好的SQL語(yǔ)句,其結(jié)構(gòu)和內(nèi)容在程序運(yùn)行期間不會(huì)發(fā)生變化。10.1.2JDBC常用API(4)Statement接口Statement接口提供了三個(gè)常用方法用于執(zhí)行SQL語(yǔ)句,具體如下表所示。方法聲明功能描述booleanexecute(Stringsql)用于執(zhí)行SQL語(yǔ)句,該方法執(zhí)行SQL語(yǔ)句后可能會(huì)返回多個(gè)結(jié)果,如果執(zhí)行后結(jié)果為ResultSet對(duì)象,則返回true;如果執(zhí)行后結(jié)果為受影響的行數(shù)或沒(méi)有任何結(jié)果,則返回falseintexecuteUpdate(Stringsql)用于執(zhí)行SQL中的INSERT、UPDATE和DELETE語(yǔ)句。該方法返回一個(gè)int類(lèi)型的值,表示數(shù)據(jù)庫(kù)中受SQL語(yǔ)句影響的行數(shù)ResultSetexecuteQuery(Stringsql)用于執(zhí)行SQL中的SELECT語(yǔ)句,該方法返回一個(gè)表示查詢(xún)結(jié)果的ResultSet對(duì)象10.1.2JDBC常用API(5)PrepareStatement接口使用Statement接口執(zhí)行SQL語(yǔ)句時(shí),如果不對(duì)輸入的SQL語(yǔ)句進(jìn)行把控,就很有可能收到SQL注入攻擊。同時(shí),手動(dòng)拼接SQL語(yǔ)句會(huì)使代碼變得冗長(zhǎng),難以閱讀和維護(hù)。為此,JDBCAPI提供了擴(kuò)展的PreparedStatement接口,該接口的對(duì)象可以執(zhí)行預(yù)編譯的SQL語(yǔ)句。預(yù)編譯的SQL語(yǔ)句是指在執(zhí)行SQL語(yǔ)句之前,先將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行編譯,生成一個(gè)預(yù)編譯的執(zhí)行計(jì)劃,然后再執(zhí)行。預(yù)編譯的SQL語(yǔ)句在每次執(zhí)行時(shí)只需傳遞參數(shù),而無(wú)需重新解析和編譯SQL語(yǔ)句,可以在SQL語(yǔ)句中使用占位符來(lái)代替具體的參數(shù)值。10.1.2JDBC常用API(5)PrepareStatement接口PreparedStatement接口還提供了一系列setter方法,用于將具體的參數(shù)值賦值給指定的占位符,常用方法如下。方法聲明功能描述intexecuteUpdate()用于執(zhí)行INSERT、UPDATE或DELETE語(yǔ)句ResultSetexecuteQuery()用于執(zhí)行SELECT語(yǔ)句,并返回結(jié)果集voidsetInt(int

parameterIndex,int

x)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為int類(lèi)型的參數(shù)xvoidsetFloat(intparameterIndex,floatf)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為float類(lèi)型的參數(shù)fvoidsetLong(intparameterIndex,longl)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為long類(lèi)型的參數(shù)l10.1.2JDBC常用API(5)PrepareStatement接口接上頁(yè)表格。方法聲明功能描述voidsetDouble(intparameterIndex,doubled)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為double類(lèi)型的參數(shù)dvoidsetBoolean(intparameterIndex,booleanb)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為boolean類(lèi)型的參數(shù)bvoidsetString(intparameterIndex,Stringx)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為String類(lèi)型的參數(shù)xvoidsetObject(intparameterIndex,Objecto)用于將SQL語(yǔ)句中parameterIndex位置的占位符賦值為Object

類(lèi)型的參數(shù)o10.1.2JDBC常用API(6)ResultSet接口ResultSet接口是JDBC中用于表示數(shù)據(jù)庫(kù)查詢(xún)結(jié)果集的接口,執(zhí)行查詢(xún)語(yǔ)句得到的結(jié)果集會(huì)被封裝到一個(gè)ResultSet對(duì)象中。可以將ResultSet對(duì)象看作一個(gè)包含多個(gè)數(shù)據(jù)行的表格,每一行代表結(jié)果集中的一條記錄,每一列代表每個(gè)字段的值。ResultSet接口內(nèi)部維護(hù)著一個(gè)游標(biāo),用于指示當(dāng)前行的位置。初始化ResultSet對(duì)象時(shí),游標(biāo)位于第一行之前的位置。通過(guò)調(diào)用next()方法,可以將游標(biāo)移動(dòng)到下一行。10.1.2JDBC常用API(6)ResultSet接口ResultSet接口的常用方法如下表所示。方法聲明功能描述StringgetString(intcolumnIndex)通過(guò)字段的索引獲取String類(lèi)型的值,參數(shù)columnIndex代表字段在查詢(xún)結(jié)果中的索引StringgetString(StringcolumnName)通過(guò)字段的名稱(chēng)獲取String類(lèi)型的值,參數(shù)columnName代表字段的名稱(chēng)intgetInt(intcolumnIndex)通過(guò)字段的索引獲取int類(lèi)型的值,參數(shù)columnIndex代表字段在查詢(xún)結(jié)果中的索引intgetInt(StringcolumnName)通過(guò)字段的名稱(chēng)獲取int類(lèi)型的值。參數(shù)columnName代表字段的名稱(chēng)booleanabsolute(introw)將游標(biāo)移動(dòng)到結(jié)果集的第row條記錄booleanprevious()將游標(biāo)從結(jié)果集的當(dāng)前位置移動(dòng)到上一條記錄10.1.2JDBC常用API(6)ResultSet接口方法聲明功能描述booleannext()將游標(biāo)從結(jié)果集的當(dāng)前位置移動(dòng)到下一條記錄voidbeforeFirst()將游標(biāo)移動(dòng)到結(jié)果集開(kāi)頭(第一條記錄之前)voidafterLast()將游標(biāo)指針移動(dòng)到結(jié)果集末尾(最后一條記錄之后)booleanfirst()將游標(biāo)移動(dòng)到結(jié)果集的第一條記錄booleanlast()將游標(biāo)移動(dòng)到結(jié)果集的最后一條記錄intgetRow()返回當(dāng)前記錄的行號(hào)StatementgetStatement()返回生成結(jié)果集的Statement對(duì)象voidclose()釋放此ResultSet對(duì)象的數(shù)據(jù)庫(kù)和JDBC資源10.1.2JDBC常用API(6)ResultSet接口ResultSet移動(dòng)結(jié)果集的游標(biāo)和獲取結(jié)果集數(shù)據(jù)的示例如下所示。//執(zhí)行SQL并獲取結(jié)果集ResultSetrs=stmt.executeQuery(sql);//光標(biāo)向下移動(dòng)一行,并且判斷當(dāng)前行是否有數(shù)據(jù)while(rs.next()){ //根據(jù)字段的名稱(chēng)獲取結(jié)果集中的數(shù)據(jù) intid=rs.getInt("id"); Stringname=rs.getString("username");//根據(jù)字段的索引獲取結(jié)果集中的數(shù)據(jù) Stringpwd=rs.getString(3);}//釋放資源rs.close();JDBC編程10.210.2JDBC編程掌握J(rèn)DBC編程,能夠獨(dú)立編寫(xiě)JDBC程序操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)

先定一個(gè)小目標(biāo)!10.2JDBC編程加載并注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序通過(guò)DriverManager獲取數(shù)據(jù)庫(kù)連接通過(guò)Connection對(duì)象獲取Statement對(duì)象關(guān)閉連接,釋放資源操作ResultSet結(jié)果集執(zhí)行SQL語(yǔ)句使用JDBC的常用API編寫(xiě)JDBC程序的大致步驟如下。10.2JDBC編程案例演示下面根據(jù)上述步驟編寫(xiě)一個(gè)JDBC程序,用于查詢(xún)數(shù)據(jù)庫(kù)中的數(shù)據(jù)并輸出在控制臺(tái)。(1)搭建數(shù)據(jù)庫(kù)環(huán)境在MySQL中創(chuàng)建一個(gè)名稱(chēng)為jdbc_demo的數(shù)據(jù)庫(kù),在該數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)tb_space表用于存儲(chǔ)航天里程碑的信息。CREATEDATABASEIFNOTEXISTSjdbc_demoCHARACTERSETutf8mb4;USEjdbc_demo;CREATETABLEtb_space( idINTPRIMARYKEYAUTO_INCREMENT, nameVARCHAR(40), launchtimeDATE );10.2JDBC編程案例演示(1)搭建數(shù)據(jù)庫(kù)環(huán)境為了便于后續(xù)測(cè)試,在tb_space表中插入三條數(shù)據(jù)。INSERTINTOtb_space(name,launchtime) VALUES('東方紅一號(hào)','1970-4-24'),

('神舟五號(hào)','2003-10-15'),('嫦娥一號(hào)','2007-10-24');10.2JDBC編程案例演示(1)搭建數(shù)據(jù)庫(kù)環(huán)境為了查看數(shù)據(jù)是否插入成功,使用SELECT語(yǔ)句查詢(xún)tb_space表中的數(shù)據(jù),執(zhí)行結(jié)果如下圖所示。10.2JDBC編程案例演示(2)創(chuàng)建項(xiàng)目,導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序在IDEA中創(chuàng)建一個(gè)名稱(chēng)為chapter10的Java項(xiàng)目,在項(xiàng)目的根目錄創(chuàng)建文件夾lib,在lib文件夾中導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)的JAR包。右擊lib文件夾,在彈出的菜單中選擇“AddasLibrary...”,彈出CreateLibrary對(duì)話(huà)框。10.2JDBC編程案例演示(3)編寫(xiě)JDBC程序在項(xiàng)目chapter10的src目錄下創(chuàng)建一個(gè)名稱(chēng)為com.itheima.jdbc的包,并在該包中創(chuàng)建類(lèi)Example01。在該類(lèi)中讀取jdbc_demo數(shù)據(jù)庫(kù)下tb_space表中的所有數(shù)據(jù),并將讀取結(jié)果輸出到控制臺(tái)。Example01.java源代碼10.2JDBC編程案例演示(3)編寫(xiě)JDBC程序運(yùn)行文件Example01.java,結(jié)果如下圖所示。數(shù)據(jù)庫(kù)連接池10.310.3數(shù)據(jù)庫(kù)連接池熟悉數(shù)據(jù)庫(kù)連接池,能夠在JDBC程序中使用數(shù)據(jù)庫(kù)連接池

先定一個(gè)小目標(biāo)!10.3數(shù)據(jù)庫(kù)連接池在之前的講解中,每次連接數(shù)據(jù)庫(kù)都會(huì)創(chuàng)建一個(gè)Connection對(duì)象,使用完畢就會(huì)將其銷(xiāo)毀。每一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象都對(duì)應(yīng)一個(gè)物理的數(shù)據(jù)庫(kù)連接,這樣重復(fù)創(chuàng)建與銷(xiāo)毀的過(guò)程會(huì)造成系統(tǒng)的性能低下,對(duì)此,可以使用數(shù)據(jù)庫(kù)連接池。10.3數(shù)據(jù)庫(kù)連接池?cái)?shù)據(jù)庫(kù)連接池是個(gè)容器,負(fù)責(zé)分配、管理數(shù)據(jù)庫(kù)連接對(duì)象,通過(guò)數(shù)據(jù)庫(kù)連接池,程序可以復(fù)用連接對(duì)象,而不是每次連接數(shù)據(jù)庫(kù)都重新創(chuàng)建和銷(xiāo)毀數(shù)據(jù)庫(kù)連接對(duì)象,可以大大提高系統(tǒng)的性能和效率。10.3數(shù)據(jù)庫(kù)連接池?cái)?shù)據(jù)庫(kù)連接池操作數(shù)據(jù)庫(kù)的過(guò)程如下圖所示。10.3數(shù)據(jù)庫(kù)連接池為了更加方便地使用和管理數(shù)據(jù)庫(kù)連接池,Java提供了DataSource接口,該接口為應(yīng)用程序提供了標(biāo)準(zhǔn)化和可重用的方式管理和提供數(shù)據(jù)庫(kù)連接。目前,許多廠(chǎng)商和組織已經(jīng)實(shí)現(xiàn)了DataSource接口并提供相應(yīng)的數(shù)據(jù)庫(kù)連接池,常見(jiàn)的數(shù)據(jù)庫(kù)連接池包括DBCP、C3P0和Druid等。不同數(shù)據(jù)庫(kù)連接池的底層實(shí)現(xiàn)可能存在差異,但使用方法基本相似。下面以Druid為例講解數(shù)據(jù)庫(kù)連接池的使用。10.3數(shù)據(jù)庫(kù)連接池Druid數(shù)據(jù)庫(kù)連接池的使用步驟如下所示。(1)導(dǎo)入JAR包在項(xiàng)目chapter10的lib文件夾中添加Druid的JAR包,并使lib文件夾內(nèi)的JAR包在項(xiàng)目中生效。10.3數(shù)據(jù)庫(kù)連接池(2)創(chuàng)建配置文件在項(xiàng)目的src目錄下創(chuàng)建配置文件perties,用于存放數(shù)據(jù)庫(kù)連接的信息。perties源代碼10.3數(shù)據(jù)庫(kù)連接池(3)測(cè)試數(shù)據(jù)庫(kù)連接池創(chuàng)建一個(gè)測(cè)試類(lèi)Example02,并在該類(lèi)的main()方法中加載連接池的配置文件,根據(jù)配置文件的信息創(chuàng)建連接池對(duì)象,并通過(guò)連接池對(duì)象獲取數(shù)據(jù)庫(kù)連接對(duì)象。Example02.java源代碼10.3數(shù)據(jù)庫(kù)連接池(3)測(cè)試數(shù)據(jù)庫(kù)連接池運(yùn)行文件Example02.java文件,運(yùn)行結(jié)果如下圖所示。DbUtils10.410.4DbUtils掌握DbUtils的使用,能夠使用DbUtils進(jìn)行數(shù)據(jù)的增刪改查

先定一個(gè)小目標(biāo)!10.4DbUtils使用JDBC進(jìn)行開(kāi)發(fā)時(shí),像SQL中傳遞參數(shù)值,以及處理結(jié)果的時(shí)候比較繁瑣,導(dǎo)致冗余代碼較多,對(duì)此,可以將JDBC常用的一些功能進(jìn)行封裝,提高編程效率。CommonsDbUtils是一個(gè)開(kāi)源的JDBC工具類(lèi)庫(kù)。它對(duì)JDBC進(jìn)行了簡(jiǎn)單的封裝,簡(jiǎn)化了JDBC進(jìn)行數(shù)據(jù)查詢(xún)和記錄讀取操作。10.4DbUtils1.QueryRunner類(lèi)QueryRunner類(lèi)提供了對(duì)SQL語(yǔ)句操作的API,它封裝的查詢(xún)、插入、更新和刪除等數(shù)據(jù)庫(kù)操作方法,可以更方便地進(jìn)行數(shù)據(jù)庫(kù)操作。QueryRunner類(lèi)常用的構(gòu)造方法和方法如下表所示。方法功能描述

QueryRunner()用于創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)無(wú)關(guān)的QueryRunner對(duì)象,后期再操作數(shù)據(jù)庫(kù)時(shí),需要手動(dòng)提供一個(gè)Connection對(duì)象QueryRunner(DataSourceds)用于根據(jù)數(shù)據(jù)源ds創(chuàng)建QueryRunner對(duì)象intupdate(Connectionconn,Stringsql,Object...params)用于執(zhí)行增加、刪除和更新等數(shù)據(jù)操作,其中傳入的參數(shù)

params

會(huì)賦值到SQL語(yǔ)句的占位符中,并根據(jù)數(shù)據(jù)庫(kù)連接對(duì)象執(zhí)行SQL語(yǔ)句10.4DbUtils1.QueryRunner類(lèi)接上頁(yè)表格。方法功能描述intupdate(Stringsql,Object...params)用于執(zhí)行增加、刪除和更新等數(shù)據(jù)操作,和上一行方法的區(qū)別在于它需要從構(gòu)造方法的數(shù)據(jù)源DataSource中獲得Connection對(duì)象query(Connectioncon

溫馨提示

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

評(píng)論

0/150

提交評(píng)論