數(shù)據(jù)庫連接池與DBUtils工具 課件_第1頁
數(shù)據(jù)庫連接池與DBUtils工具 課件_第2頁
數(shù)據(jù)庫連接池與DBUtils工具 課件_第3頁
數(shù)據(jù)庫連接池與DBUtils工具 課件_第4頁
數(shù)據(jù)庫連接池與DBUtils工具 課件_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第11章數(shù)據(jù)庫連接池與DBUtils工具《Java

Web程序設(shè)計任務(wù)教程(第2版)》學(xué)習目標/Target了解什么是數(shù)據(jù)庫連接池了解DataSource接口的作用

掌握DBCP和C3P0數(shù)據(jù)庫連接池的使用了解DBUtils工具中常見的API

掌握使用DBUtils工具對數(shù)據(jù)庫進行增刪改查的操作章節(jié)概述/Summary

上一章講解了JDBC的基本用法和操作,由于每操作一次數(shù)據(jù)庫,都會執(zhí)行一次創(chuàng)建和斷開Connection對象的操作,頻繁的操作Connection對象十分影響數(shù)據(jù)庫的訪問效率,并且增加了代碼量,所以在實際開發(fā)中,開發(fā)人員通常會使用數(shù)據(jù)庫連接池來解決這些問題。Apache組織提供了一個DBUtils工具類庫,該類庫實現(xiàn)了對JDBC的簡單封裝,能在不影響數(shù)據(jù)庫訪問性能的情況下,極大地簡化JDBC的編碼工作。本章將針對數(shù)據(jù)庫連接池和DBUtils工具進行詳細講解。目錄/Contents0102數(shù)據(jù)庫連接池DBUtils工具數(shù)據(jù)庫連接池11.111.1.1什么是數(shù)據(jù)庫連接池先定一個小目標!

先定一個小目標!了解數(shù)據(jù)庫連接池的概念,能夠知道數(shù)據(jù)庫連接池用于做什么STEP01在JDBC編程中,每次創(chuàng)建和斷開Connection對象都會消耗一定的時間和IO資源。在Java程序與數(shù)據(jù)庫之間建立連接時,數(shù)據(jù)庫端要驗證用戶名和密碼,并且要為這個連接分配資源,Java程序則要把代表連接的java.sql.Connection對象等加載到內(nèi)存中,所以建立數(shù)據(jù)庫連接的開銷很大,尤其是在大量的并發(fā)訪問時。假如某網(wǎng)站一天的訪問量是10萬,那么該網(wǎng)站的服務(wù)器就需要創(chuàng)建、斷開連接10萬次,頻繁地創(chuàng)建、斷開數(shù)據(jù)庫連接會影響數(shù)據(jù)庫的訪問效率,甚至導(dǎo)致數(shù)據(jù)庫崩潰。STEP03JDBC連接數(shù)據(jù)庫的缺陷11.1.1什么是數(shù)據(jù)庫連接池STEP01為了避免頻繁的創(chuàng)建數(shù)據(jù)庫連接,數(shù)據(jù)庫連接池技術(shù)應(yīng)運而生。數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立。簡單地說,數(shù)據(jù)庫連接池就是為數(shù)據(jù)庫建立的一個“緩沖池”。預(yù)先在“緩沖池”中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需要從“緩沖池”中取出一個,使用完畢后再放回“緩沖池”即可。STEP03數(shù)據(jù)庫連接池技術(shù)11.1.1什么是數(shù)據(jù)庫連接池STEP01STEP03連接池連接數(shù)據(jù)庫的原理圖11.1.1什么是數(shù)據(jù)庫連接池STEP01數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,當應(yīng)用程序訪問數(shù)據(jù)庫時并不是直接創(chuàng)建Connection,而是向連接池“申請”一個Connection。如果連接池中有空閑的Connection,則返回一個鏈接給應(yīng)用程序,否則應(yīng)用程序需要創(chuàng)建新的Connection。使用完畢后,連接池會將Connection回收,重新放入連接池以供其他的線程使用,從而減少創(chuàng)建和斷開數(shù)據(jù)庫連接的次數(shù),提高數(shù)據(jù)庫的訪問效率。STEP03連接池連接數(shù)據(jù)庫的原理圖的解釋11.1.1什么是數(shù)據(jù)庫連接池11.1.2DataSource接口先定一個小目標!

先定一個小目標!了解使用javax.sql.DataSource接口獲取數(shù)據(jù)庫連接對象STEP01為了獲取數(shù)據(jù)庫連接對象(Connection),JDBC提供了javax.sql.DataSource接口,javax.sql.DataSource接口負責與數(shù)據(jù)庫建立連接,并定義了返回值為Connection對象的方法,具體如下。ConnectiongetConnection()。ConnectiongetConnection(String

username,String

password)。STEP03DataSource接口的方法11.1.2DataSource接口注意:上述兩個重載的方法,都能用來獲取Connection對象。不同的是,第一個方法是通過無參的方式建立與數(shù)據(jù)庫的連接,第二個方法是通過傳入登錄信息的方式建立與數(shù)據(jù)庫的連接。STEP01接口通常都會有實現(xiàn)類,javax.sql.DataSource接口也不例外,通常習慣性的把實現(xiàn)了javax.sql.DataSource接口的類稱為數(shù)據(jù)源,顧名思義,數(shù)據(jù)源即數(shù)據(jù)的來源。每創(chuàng)建一個數(shù)據(jù)庫連接,這個數(shù)據(jù)庫連接信息都會存儲到數(shù)據(jù)源中。

STEP03DataSource接口的實現(xiàn)類11.1.2DataSource接口STEP01數(shù)據(jù)源用于管理數(shù)據(jù)庫連接池。如果數(shù)據(jù)是水,數(shù)據(jù)庫就是水庫,數(shù)據(jù)庫連接池就是連接到水庫的管道,終端用戶看到的數(shù)據(jù)集是管道里流出來的水。一些開源組織提供了數(shù)據(jù)庫連接池的獨立實現(xiàn),常用的有DBCP數(shù)據(jù)庫連接池和C3P0數(shù)據(jù)庫連接池。STEP03數(shù)據(jù)源的解釋11.1.2DataSource接口11.1.3DBCP數(shù)據(jù)庫連接池先定一個小目標!

先定一個小目標!掌握如何使用DBCP數(shù)據(jù)庫連接池STEP01DBCP即數(shù)據(jù)庫連接池(DataBaseConnectionPool),是Apache組織下的開源連接池實現(xiàn),也是Tomcat服務(wù)器使用的連接池組件。使用DBCP數(shù)據(jù)庫連接池時,需要在應(yīng)用程序中導(dǎo)入commons-dbcp2.jar和commons-pool2.jar兩個JAR包。STEP03DBCP數(shù)據(jù)庫連接池11.1.3DBCP數(shù)據(jù)庫連接池STEP01commons-dbcp2.jar包是DBCP數(shù)據(jù)庫連接池的實現(xiàn)包,包含所有操作數(shù)據(jù)庫連接信息和數(shù)據(jù)庫連接池初始化信息的方法,并實現(xiàn)了DataSource接口的getConnection()方法。STEP03commons-dbcp2.jar11.1.3DBCP數(shù)據(jù)庫連接池STEP01commons-pool2.jar包是commons-dbcp2.jar包的依賴包,為commons-dbcp2.jar包中的方法提供了支持。缺少該依賴包,commons-dbcp2.jar包中的很多方法就沒有辦法實現(xiàn)。STEP03commons-pool2.jar包11.1.3DBCP數(shù)據(jù)庫連接池STEP01commons-dbcp2.jar包含兩個核心類,分別是BasicDataSourceFactory和BasicDataSource,它們都包含獲取DBCP數(shù)據(jù)庫連接池對象的方法。STEP03commons-pool2.jar包包含的核心類11.1.3DBCP數(shù)據(jù)庫連接池STEP01STEP03BasicDataSource類的常用方法11.1.3DBCP數(shù)據(jù)庫連接池方法名稱功能描述void

setDriverClassName(String

driverClassName)設(shè)置連接數(shù)據(jù)庫的驅(qū)動名稱void

setUrl(String

url)設(shè)置連接數(shù)據(jù)庫的路徑void

setUsername(String

username)設(shè)置數(shù)據(jù)庫的登錄賬號void

setPassword(String

password)設(shè)置數(shù)據(jù)庫的登錄密碼voidsetInitialSize(int

initialSize)設(shè)置數(shù)據(jù)庫連接池初始化的連接數(shù)目voidsetMinIdle(int

minIdle)設(shè)置數(shù)據(jù)庫連接池最小閑置連接數(shù)目ConnectiongetConnection()從連接池中獲取一個數(shù)據(jù)庫連接STEP01BasicDataSource對象的常用方法中setDriverClassName()、setUrl()、setUsername()、setPassword()等方法都是設(shè)置數(shù)據(jù)庫連接信息的方法;setInitialSize()、setMinIdle()等方法都是設(shè)置數(shù)據(jù)庫連接池初始化值的方法;getConnection()方法可以從DBCP數(shù)據(jù)庫連接池中獲取一個數(shù)據(jù)庫連接。STEP03BasicDataSource對象的常用方法11.1.3DBCP數(shù)據(jù)庫連接池STEP01BasicDataSourceFactory是創(chuàng)建BasicDataSource對象的工廠類,它包含一個返回值為BasicDataSource類型的方法createDataSource(),該方法通過讀取配置文件的信息生成數(shù)據(jù)源對象并返回給調(diào)用者。把數(shù)據(jù)庫的連接信息和數(shù)據(jù)源的初始化信息提取出來寫進配置文件,這樣讓代碼看起來更加簡潔,思路也更加清晰。STEP03BasicDataSourceFactory工廠類11.1.3DBCP數(shù)據(jù)庫連接池STEP01在使用BasicDataSource類創(chuàng)建數(shù)據(jù)源對象時,需要手動給數(shù)據(jù)源對象設(shè)置屬性值,然后獲取數(shù)據(jù)庫連接對象。下面通過一個案例演示BasicDataSource類的使用。STEP03創(chuàng)建數(shù)據(jù)源對象—通過BasicDataSource類直接創(chuàng)建數(shù)據(jù)源對象11.1.3DBCP數(shù)據(jù)庫連接池STEP01創(chuàng)建項目并編寫代碼在IDEA中創(chuàng)建一個名稱為chapter11的Web項目,在項目chapter11中導(dǎo)入mysql-connector-java-8.0.15.jar、commons-dbcp2-2.7.0.jar、commons-logging-1.2.jar以及commons-pool2-2.8.0.jar四個JAR包,并發(fā)布到類路徑下;然后在項目的src目錄下創(chuàng)建包cn.itcast.chapter11.example,并在該包下創(chuàng)建一個Example01類,該類采用手動方式獲取數(shù)據(jù)庫的連接信息和數(shù)據(jù)源的初始化信息。11.1.3DBCP數(shù)據(jù)庫連接池STEP02運行chapter11的Web項目程序的運行結(jié)果如下圖所示。11.1.3DBCP數(shù)據(jù)庫連接池STEP01除了使用BasicDataSource直接創(chuàng)建數(shù)據(jù)源對象外,還可以使用BasicDataSourceFactory工廠類讀取配置文件,創(chuàng)建數(shù)據(jù)源對象,然后獲取數(shù)據(jù)庫連接對象。下面通過一個案例演示通過讀取配置文件創(chuàng)建數(shù)據(jù)源對象。STEP03創(chuàng)建數(shù)據(jù)源對象—通過讀取配置文件創(chuàng)建數(shù)據(jù)源對象11.1.3DBCP數(shù)據(jù)庫連接池STEP01在chapter11項目的src目錄下創(chuàng)建perties文件,該文件用于設(shè)置數(shù)據(jù)庫的連接信息和數(shù)據(jù)源的初始化信息。perties文件的實現(xiàn)如下所示。11.1.3DBCP數(shù)據(jù)庫連接池#連接設(shè)置driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/jdbc?serverTimezone=GMT%2B8username=rootpassword=root#初始化連接initialSize=5#最大空閑連接maxIdle=10STEP02創(chuàng)建Example02類11.1.3DBCP數(shù)據(jù)庫連接池在cn.itcast.chapter11.example包下創(chuàng)建一個Example02類,Example02類從配置文件中獲取數(shù)據(jù)庫的連接信息和數(shù)據(jù)源的初始化信息。STEP03運行Example02類程序的運行結(jié)果如下圖所示。11.1.3DBCP數(shù)據(jù)庫連接池由上圖可知,BasicDataSourceFactory工廠類成功讀取了配置文件并創(chuàng)建了數(shù)據(jù)源對象,然后獲取到了數(shù)據(jù)庫連接對象。11.1.4C3P0數(shù)據(jù)庫連接池先定一個小目標!

先定一個小目標!掌握如何使用C3P0數(shù)據(jù)庫連接池STEP01C3P0是目前最流行的開源數(shù)據(jù)庫連接池之一,它實現(xiàn)了DataSource數(shù)據(jù)源接口,支持JDBC2和JDBC3的標準規(guī)范,易于擴展并且性能優(yōu)越,著名的開源框架Hibernate和Spring都支持該數(shù)據(jù)庫連接池。在使用C3P0數(shù)據(jù)庫連接池開發(fā)時,需要了解C3P0中DataSource接口的實現(xiàn)類ComboPooledDataSource,它是C3P0的核心類,提供了數(shù)據(jù)源對象的相關(guān)方法。STEP03C3P0數(shù)據(jù)庫連接池11.1.4C3P0數(shù)據(jù)庫連接池STEP01STEP03ComboPooledDataSource類的常用方法11.1.4C3P0數(shù)據(jù)庫連接池方法名稱功能描述voidsetDriverClass()設(shè)置連接數(shù)據(jù)庫的驅(qū)動名稱voidsetJdbcUrl()設(shè)置連接數(shù)據(jù)庫的路徑voidsetUser()設(shè)置數(shù)據(jù)庫的登錄賬號voidsetPassword()設(shè)置數(shù)據(jù)庫的登錄密碼voidsetMaxPoolSize()設(shè)置數(shù)據(jù)庫連接池最大連接數(shù)目voidsetMinPoolSize()設(shè)置數(shù)據(jù)庫連接池最小連接數(shù)目voidsetInitialPoolSize()設(shè)置數(shù)據(jù)庫連接池初始化的連接數(shù)目ConnectiongetConnection()從數(shù)據(jù)庫連接池中獲取一個連接STEP01當使用C3P0數(shù)據(jù)庫連接池時,首先需要創(chuàng)建數(shù)據(jù)源對象,創(chuàng)建數(shù)據(jù)源對象可以通過調(diào)用ComboPooledDataSource類的構(gòu)造方法實現(xiàn)。ComboPooledDataSource類有兩個構(gòu)造方法,分別是ComboPooledDataSource()和ComboPooledDataSource(StringconfigName)。STEP03使用C3P0數(shù)據(jù)庫連接池11.1.4C3P0數(shù)據(jù)庫連接池STEP01調(diào)用ComboPooledDataSource()構(gòu)造方法創(chuàng)建數(shù)據(jù)源對象,需要手動給數(shù)據(jù)源對象設(shè)置屬性值,然后獲取數(shù)據(jù)庫連接對象。STEP03通過ComboPooledDataSource()構(gòu)造方法創(chuàng)建數(shù)據(jù)源對象11.1.4C3P0數(shù)據(jù)庫連接池STEP0111.1.4C3P0數(shù)據(jù)庫連接池在chapter11中導(dǎo)入jar包并編寫代碼在項目chapter11中導(dǎo)入JAR包c3p0-.jar和mchange-commons-java-.jar,然后在cn.itcast.chapter11.example包下創(chuàng)建一個Example03類,Example03類采用C3P0數(shù)據(jù)庫連接池,并使用C3P0數(shù)據(jù)庫連接池對象獲取Connection對象。STEP0211.1.4C3P0數(shù)據(jù)庫連接池運行chapter11項目在chapter11中運行main()方法,程序的運行結(jié)果如下圖所示。STEP01調(diào)用ComboPooledDataSource(StringconfigName)構(gòu)造方法可以讀取c3p0-config.xml配置文件,根據(jù)配置文件中的配置信息創(chuàng)建數(shù)據(jù)源對象,然后獲取數(shù)據(jù)庫連接對象。STEP03通過ComboPooledDataSource(StringconfigName)構(gòu)造方法創(chuàng)建數(shù)據(jù)源對象11.1.4C3P0數(shù)據(jù)庫連接池STEP01在chapter11項目下創(chuàng)建配置文件在chapter11項目的src根目錄下創(chuàng)建一個c3p0-config.xml文件,用于設(shè)置數(shù)據(jù)庫的連接信息和數(shù)據(jù)源的初始化信息。11.1.4C3P0數(shù)據(jù)庫連接池STEP02在chapter11項目下創(chuàng)建Example04類并編寫代碼在cn.itcast.chapter11.example包下創(chuàng)建一個Example04類,在該類中使用C3P0數(shù)據(jù)庫連接池從配置文件中獲取Connection對象。11.1.4C3P0數(shù)據(jù)庫連接池STEP03運行Example04類11.1.4C3P0數(shù)據(jù)庫連接池在chapter11中運行main()方法,程序的運行結(jié)果如下圖所示。STEP01需要注意的是,在使用ComboPooledDataSource(StringconfigName)方法創(chuàng)建數(shù)據(jù)源對象時必須遵循以下兩點:(1)配置文件名稱必須為c3p0-config.xml或者perties,并且位于該項目的src根目錄下。(2)當傳入的configName值為空或者不存在時,使用默認配置信息創(chuàng)建數(shù)據(jù)源。STEP03通過ComboPooledDataSource(StringconfigName)構(gòu)造方法創(chuàng)建數(shù)據(jù)源對象11.1.4C3P0數(shù)據(jù)庫連接池DBUtils工具11.211.2.1DBUtils工具介紹先定一個小目標!

先定一個小目標!了解什么是DBUtils工具,能夠知道DBUtils工具用于做什么STEP01為了更加簡單地使用JDBC,Apache組織提供了一個DBUtils工具,它是操作數(shù)據(jù)庫的一個組件,實現(xiàn)了對JDBC的簡單封裝,可以在不影響數(shù)據(jù)庫訪問性能的情況下簡化JDBC的編碼工作量。DBUtils工具要有三個作用。寫數(shù)據(jù),DBUtils可以通過編寫SQL語句對數(shù)據(jù)表進行增、刪、改操作。讀數(shù)據(jù),DBUtils工具可以將從數(shù)據(jù)表中讀取的數(shù)據(jù)結(jié)果集轉(zhuǎn)換成Java常用類集合,以方便對結(jié)果進行處理。優(yōu)化性能,在使用DBUtils工具的基礎(chǔ)上,程序可以使用數(shù)據(jù)源、JNDI、數(shù)據(jù)庫連接池等技術(shù)減少代碼冗余。STEP03DBUtils工具的作用11.2.1DBUtils工具介紹STEP01STEP03DBUtils的核心類庫的三個核心API11.2.1DBUtils工具介紹由上圖可知,DBUtils核心類庫主要包括DBUtils類、QueryRunner類和ResultSetHandler接口。DBUtils工具主要通過這三個核心API進行JDBC的所有操作。11.2.2DBUtils類先定一個小目標!

先定一個小目標!了解DBUtils類的常用方法STEP01DBUtils類主要提供了加載JDBC驅(qū)動、關(guān)閉資源等方法,DBUtils類中的方法一般為靜態(tài)方法,可以直接使用類名進行調(diào)用。STEP03DBUtils類的作用11.2.2DBUtils類STEP01STEP03DBUtils類的常用方法11.2.2DBUtils類方法名稱功能描述voidclose(Connectionconn)當連接不為NULL時,關(guān)閉連接voidclose(Statementstat)當聲明不為NULL時,關(guān)閉聲明voidclose(ResultSetrs)當結(jié)果集不為NULL時,關(guān)閉結(jié)果集voidcloseQuietly(Connectionconn)當連接不為NULL時,關(guān)閉連接,并隱藏一些在程序中拋出的SQL異常voidcloseQuietly(Statementstat)當聲明不為NULL時,關(guān)閉聲明,并隱藏一些在程序中拋出的SQL異常voidcloseQuietly(ResultSetrs)當結(jié)果集不為NULL時,關(guān)閉結(jié)果集,并隱藏一些在程序中拋出的SQL異常voidcommitAndCloseQuietly(Connectionconn)提交連接后關(guān)閉連接,并隱藏一些在程序中拋出的SQL異常BooleanloadDriver(StringdriveClassName)裝載并注冊JDBC驅(qū)動程序,如果成功就返回true11.2.3QueryRunner類先定一個小目標!

先定一個小目標!掌握QueryRunner類的用法以及QueryRunner類的常用方法STEP01QueryRunner類簡化了執(zhí)行SQL語句的代碼,它與ResultSetHandler配合就能完成大部分的數(shù)據(jù)庫操作,大大減少了編碼量。QueryRunner類提供了帶有一個參數(shù)的構(gòu)造方法,該方法以javax.sql.DataSource的實例對象作為參數(shù)傳遞到QueryRunner的構(gòu)造方法中來獲取Connection對象。針對不同的數(shù)據(jù)庫操作,QueryRunner類提供不同的方法。STEP03QueryRunner類的作用11.2.3QueryRunner類STEP01STEP03QueryRunner類的常用方法方法名稱功能描述Objectquery(Connectionconn,Stringsql,ResultSetHandlerrsh,Object[]params)執(zhí)行查詢操作,傳入的Connection對象不能為空Objectquery(Stringsql,ResultSetHandlerrsh,Object[]params)執(zhí)行查詢操作Objectquery(Connectionconn,Stringsql,ResultSetHandlerrsh)執(zhí)行一個不需要置換參數(shù)的查詢操作intupdate(Connectionconn,Stringsql,ResultSetHandlerrsh)執(zhí)行一個更新(插入、刪除、更新)操作intupdate(Connectionconn,Stringsql)執(zhí)行一個不需要置換參數(shù)的更新操作intbatch(Connectionconn,Stringsql,Object[][]params)批量添加、修改、刪除intbatch(Stringsql,Object[][]params)批量添加、修改、刪除11.2.3QueryRunner類11.2.4ResultSetHandler接口先定一個小目標!

先定一個小目標!熟悉如何使用ResultSetHandler接口處理ResultSet結(jié)果集STEP01ResultSetHandler接口用于處理ResultSet結(jié)果集,它可以將結(jié)果集中的數(shù)據(jù)轉(zhuǎn)換為不同的形式。根據(jù)結(jié)果集中不同的數(shù)據(jù)類型,ResultSetHandler提供了幾種常見的實現(xiàn)類。BeanHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個對應(yīng)的JavaBean實例中。BeanListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個對應(yīng)的JavaBean實例中,并存放到List里。ColumnListHandler:將某列屬性的值封裝到List集合中。ScalarHandler:將結(jié)果集中某一條記錄的某一列數(shù)據(jù)存儲成Object對象。STEP03ResultSetHandler接口中的常見實現(xiàn)類11.2.4ResultSetHandler接口STEP01ResultSetHandler接口還提供了一個單獨的方法handle(java.sql.ResultSetrs),如果上述實現(xiàn)類沒有提供想要的功能,可以自定義一個實現(xiàn)ResultSetHandler接口的類,然后通過重寫handle()方法,實現(xiàn)結(jié)果集的處理。STEP03ResultSetHandler接口中的方法handle(java.sql.ResultSetrs)11.2.4ResultSetHandler接口11.2.5ResultSetHandler實現(xiàn)類先定一個小目標!

先定一個小目標!掌握ResultSetHandler接口實現(xiàn)類中BeanHandler、BeanListHandler、ColumnListHandler和ScalarHandler的使用STEP01BeanHandler和BeanListHandler實現(xiàn)類是將結(jié)果集中的數(shù)據(jù)封裝到對應(yīng)的JavaBean中。在封裝時,表中數(shù)據(jù)的字段和JavaBean的屬性是相互對應(yīng)的,一條數(shù)據(jù)記錄被封裝進一個對應(yīng)的JavaBean對象中。BeanHandler和BeanListHandler的對比如下表所示。STEP03BeanHandler和BeanListHandler11.2.5ResultSetHandler實現(xiàn)類類名稱相同點不同點BeanHandler都要先將結(jié)果集封裝進JavaBean封裝單條數(shù)據(jù),把結(jié)果集的第一條數(shù)據(jù)的字段放入一個JavaBean中BeanListHandler封裝多條數(shù)據(jù),把每條數(shù)據(jù)的字段值各放入一個JavaBean中,再把所有JavaBean都放入List集合中STEP0111.2.5ResultSetHandler實現(xiàn)類下面通過代碼演示BeanHandler和BeanListHandler的使用以及兩者的區(qū)別。在名為jdbc的數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表user,創(chuàng)建語句如下:USEjdbc;CREATETABLEuser(idINT(3)PRIMARYKEYAUTO_INCREMENT,nameVARCHAR(20)NOTNULL,passwordVARCHAR(20)NOTNULL);STEP0211.2.5ResultSetHandler實現(xiàn)類向user表插入三條數(shù)據(jù)并查詢user表INSERTINTOuser(name,password)VALUES('zhangsan','123456');INSERTINTOuser(name,password)VALUES('lisi','123456');INSERTINTOuser(name,password)VALUES('wangwu','123456');使用SELECT語句查詢user表,查詢結(jié)果如下圖所示。STEP0311.2.5ResultSetHandler實現(xiàn)類在項目在添加jar包將下載的DBUtils工具的JAR包commons-dbutils-1.7.jar添加到項目的lib目錄中,并將第10章中JDBCUtils.java復(fù)制到cn.itcast.chapter11.example包下。STEP0411.2.5ResultSetHandler實現(xiàn)類編寫通用的查詢方法在chapter11項目的cn.itcast.chapter11.example包中創(chuàng)建一個名為BaseDao的類,在該類中編寫一個通用的查詢方法。STEP0511.2.5ResultSetHandler實現(xiàn)類編寫User實體類在cn.itcast.chapter11.example包下創(chuàng)建實體類User,用于封裝User對象。publicclassUser{ privateintid; privateStringname; privateStringpassword; //省略getter/setter方法}

STEP0611.2.5ResultSetHandler實現(xiàn)類演示BeanHandler類處理結(jié)果集在cn.itcast.chapter11.example包下創(chuàng)建類ResultSetTest1,用于演示BeanHandler類對結(jié)果集的處理。STEP0711.2.5ResultSetHandler實現(xiàn)類運行ResultSetTest1類運行ResultSetTest1類中的main()方法,運行結(jié)果如下圖所示。由圖中的輸出結(jié)果可以看出,BeanHandler已成功將id為1的數(shù)據(jù)存入到了實體對象user中。STEP0811.2.5ResultSetHandler實現(xiàn)類演示BeanListHandler類處理結(jié)果集在cn.itcast.chapter11.example包下創(chuàng)建ResultSetTest2類,用于演示BeanListHandler類對結(jié)果集的處理。STEP0911.2.5ResultSetHandler實現(xiàn)類運行ResultSetTest2類由此可見,testBeanListHandler()方法可以將每一行的數(shù)據(jù)都封裝到user實體對象中,并將其存放到list中。運行ResultSetTest2類中的main()方法,運行結(jié)果如下圖所示。STEP01ColumnListHandler和ScalarHandler類可以對指定的列數(shù)據(jù)進行封裝,在封裝時,查詢指定列數(shù)據(jù),然后將獲得的列數(shù)據(jù)封裝到容器中。ColumnListHandler和ScalarHandler的對比如下表所示。STEP03ColumnListHandler和ScalarHandler11.2.5ResultSetHandler實現(xiàn)類類名稱相同點不同點ColumnListHandler都是對指定列的查詢結(jié)果集進行封裝封裝指定列的所有數(shù)據(jù),將他們放入一個List集合中ScalarHandler封裝單條列數(shù)據(jù),也可以封裝類似count、avg、max、min、sum等聚合函數(shù)的執(zhí)行結(jié)果注意:ColumnListHandler可以對指定列的所有數(shù)據(jù)進行封裝,ScalarHandler主要針對單行單列的數(shù)據(jù)進行封裝。STEP0111.2.5ResultSetHandler實現(xiàn)類在使用DBUtils工具操作數(shù)據(jù)庫時,如果需要輸出結(jié)果集中所有數(shù)據(jù)的值,可以使用ColumnListHandler類。下面通過一個案例演示ColumnListHandler類的使用。在cn.itcast.chapter11.example包下創(chuàng)建ResultSetTest3類,用于演示ColumnListHandler類的使用方法。ResultSetTest3類的實現(xiàn)如下所示。publicclassResultSetTest3{publicstaticvoidtestColumnListHandler()throwsSQLException{BaseDaobasedao=newBaseDao();Stringsql="select*fromuser";Objectarr=(Object)basedao.query(sql,newColumnListHandler("name"));System.out.println(arr);}publicstaticvoidmain(String[]args)throwsSQLException{testColumnListHandler();}}STEP0211.2.5ResultSetHandler實現(xiàn)類運行ResultSetTest3類中的main()方法,控制臺輸出結(jié)果如下圖所示。由圖中的輸出結(jié)果可以看出,ColumnListHandler類成功打印出了user表中的所有name信息。

STEP0111.2.5ResultSetHandler實現(xiàn)類在使用DBUtils工具操作數(shù)據(jù)庫時,如果需要輸出結(jié)果集中一行數(shù)據(jù)的指定字段值,可以使用ScalarHandler類。下面通過一個案例演示ScalarHandler類的使用。在cn.itcast.chapter11.example包下創(chuàng)建ResultSetTest4類,用于演示ScalarHandler類的使用方法。ResultSetTest4類的實現(xiàn)如下所示。publicclassResultSetTest4{ publicstaticvoidtestScalarHandler()throwsSQLException{ BaseDaobasedao=newBaseDao(); Stringsql="select*fromuserwhereid=?"; Objectarr=(Object)basedao.query(sql,newScalarHandler("name"),1); System.out.println(arr); } publicstaticvoidmain(String[]args)throwsSQLException{ testScalarHandler(); }}STEP0211.2.5ResultSetHandler實現(xiàn)類運行ResultSetTest4類中的main()方法,控制臺輸出結(jié)果如下圖所示。11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查先定一個小目標!

先定一個小目標!使用DBUtils實現(xiàn)數(shù)據(jù)的增刪改查STEP01由于每次操作數(shù)據(jù)庫時,都需要加載數(shù)據(jù)庫驅(qū)動、建立數(shù)據(jù)庫連接以及關(guān)閉數(shù)據(jù)庫連接,為了避免代碼的重復(fù)書寫,需要建立一個專門用于操作數(shù)據(jù)庫的工具類。使用DBUtils工具對數(shù)據(jù)庫中的用戶信息進行增刪改查操作,首先要創(chuàng)建用戶實體類User類,與數(shù)據(jù)庫中user表中的數(shù)據(jù)進行映射;然后創(chuàng)建一個工具類,用于創(chuàng)建數(shù)據(jù)源對象;最后創(chuàng)建增刪改查操作的DAO類,在各個DAO類中編寫其對應(yīng)的增刪改查邏輯。STEP03使用DBUtils實現(xiàn)增刪改查的思路11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查STEP01搭建開發(fā)環(huán)境11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查本任務(wù)使用11.2.5小節(jié)在jdbc數(shù)據(jù)庫中創(chuàng)建的user表作為數(shù)據(jù)表,使用DBUtils工具對user表進行增刪改查操作。STEP02創(chuàng)建JavaBean11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查本任務(wù)使用User.java作為JavaBean,在項目chapter11的目錄下,創(chuàng)建一個名為cn.itcast.jdbc.javabean的包,將User.java復(fù)制到該包下。STEP03創(chuàng)建C3p0Utils工具類11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查在項目chapter11的src目錄下,創(chuàng)建一個名為cn.itcast.jdbc.utils的包,然后在該包下創(chuàng)建C3p0Utils類,用于創(chuàng)建數(shù)據(jù)源。C3p0Utils類的實現(xiàn)如下所示。publicclassC3p0Utils{ privatestaticDataSourceds; static{ ds=newComboPooledDataSource(); } publicstaticDataSourcegetDataSource(){ returnds; }}STEP04創(chuàng)建InsertDao類,完成插入操作11.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查在項目chapter11的src目錄下,創(chuàng)建一個名為cn.itcast.jdbc.dao的包,然后在該包下創(chuàng)建一個InsertDao類,實現(xiàn)對user表插入數(shù)據(jù)的操作。InsertDao類的實現(xiàn)如下所示。publicclassInsertDao{publicstaticvoidmain(String[]args)throwsSQLException{//創(chuàng)建QueryRunner對象QueryRunnerrunner=newQueryRunner(C3p0Utils.getDataSource());Stringsql="insertintouser(name,password)values ('hello1',123456)";intnum=runner.update(sql);if(num>0){System.out.println("添加成功!");}else{System.out.println("添加失?。?);}}}STEP0511.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查文件InsertDao的運行結(jié)果如下圖所示。STEP0611.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查向MySQL數(shù)據(jù)庫發(fā)送查詢語句,查詢結(jié)果如下所示。STEP0711.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查創(chuàng)建UpdateDao類,完成修改操作在cn.itcast.jdbc.dao包下創(chuàng)建一個UpdateDao類,實現(xiàn)對user表數(shù)據(jù)的修改操作。UpdateDao類的實現(xiàn)如下所示。publicclassUpdateDao{publicstaticvoidmain(String[]args)throwsSQLException{//創(chuàng)建QueryRunner對象QueryRunnerrunner=newQueryRunner(C3p0Utils.getDataSource());//寫SQL語句Stringsql="updateusersetname=hello2,password=111111wherename=hello1";intnum=runner.update(sql);if(num>0){System.out.println("修改成功!");}else{System.out.println("修改失??!");}}}STEP0811.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查文件UpdateDao的運行結(jié)果如下圖所示。STEP0911.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查向MySQL數(shù)據(jù)庫發(fā)送查詢語句,查詢結(jié)果如下所示。STEP1011.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查創(chuàng)建DeleteDao類,完成刪除操作在cn.itcast.jdbc.dao包下創(chuàng)建一個DeleteDao類,實現(xiàn)對user表數(shù)據(jù)的刪除操作。DeleteDao類的實現(xiàn)如下所示。publicclassDeleteDao{publicstaticvoidmain(String[]args)throwsSQLException{//創(chuàng)建QueryRunner對象QueryRunnerrunner=newQueryRunner(C3p0Utils.getDataSource());//寫SQL語句Stringsql="deletefromuserwherename='hello2'";intnum=runner.update(sql);if(num>0){System.out.println("刪除成功!");}else{System.out.println("刪除失??!");}}}STEP1111.2.6動手實踐:使用DBUtils實現(xiàn)增刪改查文件DeleteDao的運行結(jié)果如下圖所示。STEP1211.2.6動手實踐:使用

溫馨提示

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

最新文檔

評論

0/150

提交評論