版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JavaWeb應(yīng)用開發(fā)技術(shù)新聞發(fā)布系統(tǒng)訪問數(shù)據(jù)庫主講:
目錄CONTENTS01應(yīng)用JDBC實(shí)現(xiàn)新聞信息添加
02應(yīng)用數(shù)據(jù)庫連接池實(shí)現(xiàn)新聞信息修改素質(zhì)目標(biāo)技能目標(biāo)知識目標(biāo)掌握J(rèn)DBC的概念掌握J(rèn)DBC的工作原理掌握數(shù)據(jù)庫訪問步驟掌握J(rèn)DBC常用類和接口掌握數(shù)據(jù)連接池的配置與應(yīng)用具備應(yīng)用JDBC技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫連接的能力具備應(yīng)用JDBC技術(shù)實(shí)現(xiàn)數(shù)據(jù)持久化存儲的能力具備應(yīng)用JDBC技術(shù)實(shí)現(xiàn)數(shù)據(jù)增、刪、改、查的能力具備應(yīng)用連接池技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫連接的能力學(xué)習(xí)目標(biāo)培養(yǎng)AI素養(yǎng)培養(yǎng)開發(fā)應(yīng)用程序的興趣具備嚴(yán)謹(jǐn)、細(xì)致的工作態(tài)度具備較強(qiáng)的社會責(zé)任感具備自主學(xué)習(xí)的能力增強(qiáng)數(shù)據(jù)安全意識任務(wù)背景在新聞發(fā)布系統(tǒng)項(xiàng)目的開發(fā)過程中,數(shù)據(jù)庫是核心組成部分,負(fù)責(zé)存儲新聞信息、用戶數(shù)據(jù)、評論信息等。在本工作單元中,項(xiàng)目團(tuán)隊(duì)將采用Java數(shù)據(jù)庫互連(JavaDatabaseConnectivity,JDBC)技術(shù)來連接MySQL數(shù)據(jù)庫,實(shí)現(xiàn)項(xiàng)目數(shù)據(jù)的持久化存儲以及數(shù)據(jù)的查詢、更新、插入和刪除等操作。感謝聆聽任務(wù)三:新聞發(fā)布系統(tǒng)訪問數(shù)據(jù)庫JavaWeb應(yīng)用開發(fā)技術(shù)01應(yīng)用JDBC實(shí)現(xiàn)新聞信息添加任務(wù)描述本任務(wù)先介紹JDBC工作原理、JDBC常用類和應(yīng)用程序接口(ApplicationProgramInterface,API)及其功能,然后應(yīng)用JDBC技術(shù)連接MySQL數(shù)據(jù)庫,實(shí)現(xiàn)將新聞信息保存到數(shù)據(jù)庫表的操作。JDBC(JavaDataBaseConnectivity)是Java數(shù)據(jù)庫連接技術(shù)的簡稱。JDBC是Java數(shù)據(jù)庫連接規(guī)范,由一組使用Java語言編寫的類和接口組成,稱為JDBCAPI,位于java.sql以及javax.sql包中。JDBCAPI為Java開發(fā)人員操作數(shù)據(jù)庫提供了一個(gè)標(biāo)準(zhǔn),可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問。JDBC概念項(xiàng)目開發(fā)中,使用JDBC可以實(shí)現(xiàn)應(yīng)用程序與數(shù)據(jù)庫之間的數(shù)據(jù)通信,簡單來說,JDBC的作用有以下3點(diǎn)。1.建立應(yīng)用程序與數(shù)據(jù)庫之間的訪問連接2.將編寫好的SQL語句發(fā)送到數(shù)據(jù)庫執(zhí)行(增、刪、改、查)3.對數(shù)據(jù)庫返回的結(jié)果進(jìn)行處理JDBC的作用JDBC工作原理JDBC定義了一組標(biāo)準(zhǔn)接口,使得開發(fā)者可以使用相同的代碼結(jié)構(gòu)來連接和操作不同的數(shù)據(jù)庫,而不需要關(guān)心底層數(shù)據(jù)庫的具體實(shí)現(xiàn)。JDBC通過驅(qū)動程序與數(shù)據(jù)庫進(jìn)行通信。不同的數(shù)據(jù)庫廠商提供了不同的JDBC驅(qū)動程序,這些驅(qū)動程序?qū)崿F(xiàn)了JDBCAPI,并與特定數(shù)據(jù)庫的底層通信協(xié)議相對應(yīng)。JDBC使用DriverManager類來管理數(shù)據(jù)庫連接。開發(fā)者可以通過提供數(shù)據(jù)庫的URL、用戶名和密碼來獲取數(shù)據(jù)庫連接。獲取連接后,就可以通過JDBC的JavaAPI進(jìn)行SQL語句執(zhí)行數(shù)據(jù)的增、刪、改、查等操作。JDBC的工作原理Java應(yīng)用程序SqlServerOracleJDBCDriverManagerSqlServerJDBC
驅(qū)動程序JDBCAPI
MySQLOracleJDBC
驅(qū)動程序MySQLJDBC
驅(qū)動程序不同數(shù)據(jù)庫廠商有不同的JDBC驅(qū)動,不同的JDBC驅(qū)動實(shí)現(xiàn)與不同數(shù)據(jù)庫的連接;不同數(shù)據(jù)庫廠商的JDBC驅(qū)動均有JDBCAPI中的DriverManager類來統(tǒng)一管理。小結(jié)JDBC是Java數(shù)據(jù)庫連接規(guī)范,各個(gè)數(shù)據(jù)庫廠商在遵循JDBC規(guī)范的基礎(chǔ)上提供訪問自己公司數(shù)據(jù)庫服務(wù)器的驅(qū)動才能保證應(yīng)用程序與數(shù)據(jù)庫之間數(shù)據(jù)通信,所以遵循一定的規(guī)范和標(biāo)準(zhǔn)非常重要!在數(shù)據(jù)庫訪問中,保障數(shù)據(jù)的安全性非常重要!遵守職業(yè)規(guī)范與標(biāo)準(zhǔn)增強(qiáng)信息安全意識!交流與討論通過交流討論對問題進(jìn)行深入的探索:回憶課程的要點(diǎn),思考一下幾個(gè)問題:JDBC是什么?主要作用是什么?JDBC的工作原理是什么?開始加載并注冊驅(qū)動程序創(chuàng)建一個(gè)Connection對象創(chuàng)建一個(gè)Statement對象執(zhí)行語句關(guān)閉ResultSet對象關(guān)閉Statement對象關(guān)閉連接結(jié)束使用ResultSet對象12345876添加JDBC驅(qū)動jar包1個(gè)準(zhǔn)備天龍八步JDBC程序訪問數(shù)據(jù)庫的步驟Class.forName(JDBC驅(qū)動類);//
mySQL數(shù)據(jù)庫驅(qū)動類:com.mysql.jdbc.Driver//sqlserver數(shù)據(jù)庫驅(qū)動類:"com.microsoft.sqlserver.jdbc.SQLServerDriver"
第一步:加載并注冊驅(qū)動程序Connectioncon=DriverManager.getConnection(JDBCURL,數(shù)據(jù)庫用戶名,密碼);JDBCURL連接字符串是固定格式:jdbc:<子協(xié)議>:<子名稱>以下為mySQL的JDBCURL示例:jdbc:mysql://localhost:3306/news第二步:創(chuàng)建與數(shù)據(jù)庫連接Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTable1");第三、四步:創(chuàng)建一個(gè)Statement對象并執(zhí)行SQL語句使用Connection對象創(chuàng)建Statement對象,并執(zhí)行SQL語句以返回一個(gè)ResultSet對象,它包含執(zhí)行查詢后所產(chǎn)生的結(jié)果集“l(fā)ocalhost”代表本機(jī);其它機(jī)器用機(jī)器名稱或IP地址數(shù)據(jù)庫名稱發(fā)送并執(zhí)行SQL語句的步驟:數(shù)據(jù)庫端口號JDBCURL用來標(biāo)識數(shù)據(jù)庫JDBC程序訪問數(shù)據(jù)庫的步驟—連接數(shù)據(jù)庫JDBC程序訪問數(shù)據(jù)庫的步驟while(rs.next()){intx=rs.getInt("a");Strings=rs.getString("b");floatf=rs.getFloat("c");}第五步:處理結(jié)果rs.close();stmt.close();con.close();第六、七、八步:關(guān)閉結(jié)果集、查詢語句及與數(shù)據(jù)庫的連接,釋放數(shù)據(jù)庫資源注意關(guān)閉的順序先ResultSet再Statement最后為Connection使用ResultSet對象的next()方法循環(huán)遍歷結(jié)果集釋放數(shù)據(jù)庫資源的步驟:方法getXXX提供了獲取當(dāng)前行中某列值的途徑JDBC程序訪問數(shù)據(jù)庫的步驟---處理數(shù)據(jù)集JDBCAPI作用:供程序員調(diào)用的接口與類,集成在java.sql和javax.sql包中,核心類與接口:DriverManager類Connection接口Statement接口ResultSet接口ResultSetMetaData接口PreparedStatement接口CallableStatement接口JDBC常用類和接口Java應(yīng)用程序數(shù)據(jù)庫JDBCAPI
DriverManager作用:載入各種不同的JDBC驅(qū)動,獲取Connection對象,與數(shù)據(jù)庫連接Connection作用:與數(shù)據(jù)庫通信,Connection最為重要的一個(gè)方法就是用來獲取Statement對象;Statement作用:用來向數(shù)據(jù)庫發(fā)送SQL語句ResultSet作用:獲取查詢結(jié)果集ResultSetMetaData接口:存放結(jié)果集元數(shù)據(jù)信息,有關(guān)從數(shù)據(jù)庫查詢返回的結(jié)果集對象和與數(shù)據(jù)庫相關(guān)的額外信息,由ResultSetMetaData對象提供PreparedStatement接口:擴(kuò)展了Statement接口,提供方法使SQL語句提前編譯好,提高執(zhí)行效率。CallableStatement接口:為所有的數(shù)據(jù)庫管理系統(tǒng)提供了一種以標(biāo)準(zhǔn)形式調(diào)用存儲過程的方法。JDBC常用類和接口DriverManager類常用方法:(1)DriverManager.registerDriver(newDriver())registerDriver()方法用于注冊驅(qū)動,但是在實(shí)際開發(fā)中并不推薦采用registerDriver()方法注冊驅(qū)動。在實(shí)際開發(fā)中推薦使用Class.forName("驅(qū)動包名.類名")加載驅(qū)動。MySQL5.x加載驅(qū)動類的代碼:Class.forName("com.mysql.jdbc.Driver")。MySQL8加載驅(qū)動類的代碼:Class.forName("com.mysql.cj.jdbc.Driver")。Oracle數(shù)據(jù)庫加載驅(qū)動類的代碼:Class.forName("oracle.jdbc.driver.OracleDriver")。JDBC常用類和接口(2)DriverManager.getConnection(StringURL,Stringuser,Stringpassword)getConnection()方法用來與數(shù)據(jù)庫建立連接。方法的第一個(gè)參數(shù)用于標(biāo)識一個(gè)被注冊的驅(qū)動程序。JDBCURL的標(biāo)準(zhǔn)由以下3部分組成,各部分間用冒號分隔。<協(xié)議>:<子協(xié)議>:<子名稱>協(xié)議:JDBCURL中的協(xié)議總是jdbc。子協(xié)議:用于標(biāo)識數(shù)據(jù)庫驅(qū)動程序子名稱:標(biāo)識數(shù)據(jù)庫的方法。例如:對于MySQL數(shù)據(jù)庫連接,JDBCURL采用如下形式(sid表示數(shù)據(jù)庫名稱)。jdbc:mysql://localhost:3306/sidJDBC常用類和接口Connection接口常用方法(1)createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的Statement對象。(2)prepareStatement(sql):創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯SQL語句的PrepareSatement對象。(3)prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的CallableStatement對象。(4)setAutoCommit(BooleanautoCommit):設(shè)置是否自動提交事務(wù)。(5)commit():提交對數(shù)據(jù)庫的改動并釋放當(dāng)前連接持有的數(shù)據(jù)庫的鎖。(6)rollback():回滾當(dāng)前事務(wù)中的所有改動并釋放當(dāng)前連接持有的數(shù)據(jù)庫的鎖。JDBC常用類和接口例3-1使用JDBCAPI連接MySQL數(shù)據(jù)庫案例技能點(diǎn):JDBC工作原理,數(shù)據(jù)庫訪問步驟,DriverManager類、Connection接口的應(yīng)用。實(shí)現(xiàn)步驟如下。①在MySQL數(shù)據(jù)庫中做好準(zhǔn)備,執(zhí)行SQL命令createdatabasenews,新建新聞數(shù)據(jù)庫news。②打開IntelliJIDEA,創(chuàng)建一個(gè)新的JavaWeb項(xiàng)目,項(xiàng)目命名為newspro,在項(xiàng)目的src/main/java目錄下新建包和類:cn.sdcet.utils.BaseDao。③在IDEA中單擊項(xiàng)目架構(gòu)ProjectStructure,選擇庫文件Libraries,單擊按鈕,將MySQL的驅(qū)動JAR包添加到項(xiàng)目依賴庫中。④在BaseDao類中編寫連接數(shù)據(jù)庫news的代碼。⑤編寫main()方法,運(yùn)行Java應(yīng)用程序,測試連接效果例3-1使用JDBCAPI連接MySQL數(shù)據(jù)庫packagecn.sdcet.util;importjava.sql.*;publicclassBaseDao{privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver";privatestaticfinalStringURL="jdbc:mysql://localhost:3306/news?characterEncoding=UTF-8";//連接字符串privatestaticfinalStringUNAME="root";//MySQL用戶名privatestaticfinalStringUPWD="123456";//密碼protectedConnectioncon;protectedConnectiongetConnection()throwsException{//連接數(shù)據(jù)庫//加載并注冊驅(qū)動程序Class.forName(DRIVER);//創(chuàng)建數(shù)據(jù)庫連接對象con=DriverManager.getConnection(URL,UNAME,UPWD);returncon;}//釋放對象protectedvoidcloseAll(){try{if(con!=null){con.close();}}catch(SQLExceptione){e.printStackTrace();}}
publicstaticvoidmain(String[]args)throwsException{Connectioncon=newBaseDao().getConnection();if(con!=null){System.out.println("連接數(shù)據(jù)庫成功!");}}}JDBC常用類和接口文件運(yùn)行結(jié)果如圖所示,控制臺中輸出了“連接數(shù)據(jù)庫成功!”,說明成功連接上了MySQL數(shù)據(jù)庫。Statement接口的常用方法:(1)executeQuery(Stringsql):用于向數(shù)據(jù)庫發(fā)送查詢語句,返回代表查詢結(jié)果的ResultSet對象。(2)executeUpdate(Stringsql):用于向數(shù)據(jù)庫發(fā)送INSERT、UPDATE或DELETE語句,返回一個(gè)整數(shù)(用于表示操作導(dǎo)致數(shù)據(jù)庫幾行數(shù)據(jù)發(fā)生了變化)。(3)execute(Stringsql):用于向數(shù)據(jù)庫發(fā)送任意SQL語句。(4)addBatch(Stringsql):把多條SQL語句放到一個(gè)批處理中。(5)executeBatch():發(fā)送一批SQL語句到數(shù)據(jù)庫并執(zhí)行。JDBC常用類和接口ResultSet接口的常用方法:(1)獲取任意類型的數(shù)據(jù)的方法。getObject(intindex):通過下標(biāo)獲取任意類型的數(shù)據(jù)。getObject(stringcolumnName):通過列名獲取任意類型的數(shù)據(jù)。(2)獲取指定類型的數(shù)據(jù)的方法。getString(intindex)、getString(StringcolumnName):獲取String類型的數(shù)據(jù)。getInt(intindex)、getInt(StringcolumnName):獲取Int類型的數(shù)據(jù)。(3)遍歷查詢結(jié)果集的方法。next():獲取下一行數(shù)據(jù)。JDBC常用類和接口JDBC常用類和接口遍歷查詢結(jié)果集的過程如圖所示。ResultSetMetaData接口常用方法如下:intgetColumnCount():返回ResultSet對象中的列數(shù)。JDBC常用類和接口PreparedStatement接口:(1)創(chuàng)建PreparedStatement對象以下代碼段(其中con是Connection對象)用于創(chuàng)建包含帶兩個(gè)IN參數(shù)占位符的SQL語句的PreparedStatement對象。PreparedStatementpstmt=con.prepareStatement("UPDATEtable4SETm=?WHEREx=?");pstmt對象包含語句UPDATEtable4SETm=?WHEREx=?,該語句已被發(fā)送給數(shù)據(jù)庫管理系統(tǒng),并為執(zhí)行做好了準(zhǔn)備。(2)使用PreparedStatement對象如果發(fā)送的SQL語句中有輸入?yún)?shù),則在執(zhí)行PreparedStatement對象之前必須設(shè)置每個(gè)?的值。這可通過調(diào)用setXXX()方法來完成。例如,以下代碼將第一個(gè)參數(shù)設(shè)為123456789,第二個(gè)參數(shù)設(shè)為100000000。pstmt.setLong(1,123456789);pstmt.setLong(2,100000000);JDBC常用類和接口JDBC常用類和接口PreparedStatement接口與Statement接口的比較如表所示比較點(diǎn)PreparedStatementStatement關(guān)系子接口,繼承了Statement接口的所有功能,并添加了一系列設(shè)置占位符參數(shù)值的方法父接口SQL注入問題可以避免SQL注入問題存在SQL注入隱患執(zhí)行效率可對SQL進(jìn)行預(yù)編譯,提高SQL執(zhí)行效率會使數(shù)據(jù)庫頻繁編譯SQL,可能造成數(shù)據(jù)庫緩沖溢出例3-2使用JDBC實(shí)現(xiàn)將新聞?lì)悇e信息添加到新聞?lì)悇e表案例技能點(diǎn):JDBC工作原理,數(shù)據(jù)庫訪問步驟,JDBCAPI綜合應(yīng)用。實(shí)現(xiàn)步驟如下。①在MySQL數(shù)據(jù)庫中做好數(shù)據(jù)準(zhǔn)備,依據(jù)工作單元1中的數(shù)據(jù)庫設(shè)計(jì),在news數(shù)據(jù)庫中新建新聞?lì)悇e表NRC_TYPE(t_id,t_name,t_memo)。②打開IntelliJIDEA,基于項(xiàng)目newspro,在項(xiàng)目的src/main/java目錄下新建包和類:cn.sdcet.entity.Type。例3-2使用JDBC實(shí)現(xiàn)將新聞?lì)悇e信息添加到新聞?lì)悇e表③
在項(xiàng)目的src/main/java目錄下新建包c(diǎn)n.sdcet.dao,在此包下新建接口TypeDao,在接口中定義添加新聞?lì)悇e的抽象方法add(),詳細(xì)代碼如下。packagecn.sdcet.dao;importcn.sdcet.entity.Type;importjava.util.List;public
interfaceTypeDao{
publicBooleanadd(Typetype);//添加新聞?lì)悇e
}例3-2使用JDBC實(shí)現(xiàn)將新聞?lì)悇e信息添加到新聞?lì)悇e表④
在項(xiàng)目源代碼下新建包c(diǎn)n.sdcet.dao.impl,在此包下定義實(shí)現(xiàn)類TypeDaoImpl(繼承自BaseDao類),實(shí)現(xiàn)接口TypeDao,TypeDaoImpl類的詳細(xì)代碼如下。publicclassTypeDaoImplextendsBaseDaoimplementsTypeDao{//繼承自例3-1中的BaseDao類@OverridepublicBooleanadd(Typetype){Booleanflag=false;Stringsql="insertintonrc_type(t_id,t_name)value(?,?)";try{Connectioncon=super.getConnection();PreparedStatementpstm=con.prepareStatement(sql);pstm.setInt(1,type.getT_id());pstm.setString(2,type.getT_name());pstm.executeUpdate();flag=true;}catch(Exceptione){e.printStackTrace();}finally{super.closeAll();if(pstm!=null){try{pstm.close();}catch(SQLExceptionthrowables){throwables.printStackTrace();}}}returnflag;}}例3-2使用JDBC實(shí)現(xiàn)將新聞?lì)悇e信息添加到新聞?lì)悇e表⑤
在項(xiàng)目的cn.sdcet.dao包下新建測試類TestDao,代碼如下。publicclassTestDao{publicstaticvoidtestAdd(){System.out.println("*******添加新聞?lì)悇e*******");System.out.println("請輸入新增新聞?lì)悇e編號:");Scannerscan=newScanner(System.in);intt_id=scan.nextInt();System.out.println("請輸入新增新聞?lì)悇e名稱:");Stringt_name=scan.next();Typetype=newType(t_id,t_name);booleanflag=newTypeDaoImpl().add(type);if(flag){System.out.println("添加成功!");}else{System.out.println("添加失敗!");}}publicstaticvoidmain(String[]args){testAdd();}}例3-2使用JDBC實(shí)現(xiàn)將新聞?lì)悇e信息添加到新聞?lì)悇e表運(yùn)行測試類,運(yùn)行結(jié)果如圖所示。例3-3查詢并輸出新聞?lì)悇e表信息案例技能點(diǎn):JDBC工作原理,數(shù)據(jù)庫訪問步驟,JDBCAPI綜合應(yīng)用。實(shí)現(xiàn)步驟如下。①
在例3-2的項(xiàng)目代碼基礎(chǔ)上完成本案例。打開IntelliJIDEA,在項(xiàng)目的TypeDao接口中添加查詢新聞?lì)悇e的search()方法,方法體代碼如下。packagecn.sdcet.dao;importcn.sdcet.entity.Type;importjava.util.List;public
interfaceTypeDao{
publicBooleanadd(Typetype);
publicListsearch();//查詢新聞?lì)悇e}例3-3查詢并輸出新聞?lì)悇e表信息②
在項(xiàng)目的TypeDaoImpl類中添加測試查詢新聞?lì)悇e的testSearch()方法,方法體代碼如下。publicListsearch(){ArrayListtypeList=newArrayList();try{Connectioncon=super.getConnection();Stringsql="select*fromnrc_type";PreparedStatementpstm=con.prepareStatement(sql);ResultSetrs=pstm.executeQuery(sql);while(rs.next()){intt_id=rs.getInt(1);Stringt_name=rs.getString(2);Stringt_memo=rs.getString(3);Typetype=newType(t_id,t_name,t_memo);typeList.add(type);}}catch(Exceptione){e.printStackTrace();}finally{super.closeAll();}returntypeList;}例3-3查詢并輸出新聞?lì)悇e表信息③
在項(xiàng)目的TestDao類中添加測試查詢新聞?lì)悇e的testSearch()方法,并在主方法中調(diào)用此方法,代碼如下。publicstaticvoidtestSearch(){ListtypeList=newTypeDaoImpl().search();typeList.forEach(type->System.out.println(type));}publicstaticvoidmain(String[]args){//testAdd();testSearch();//調(diào)用測試查詢方法}例3-3查詢并輸出新聞?lì)悇e表信息代碼運(yùn)行結(jié)果如圖所示。交流與討論通過交流討論對問題進(jìn)行深入的探索:回憶課程的要點(diǎn),思考一下幾個(gè)問題:JDBC程序訪問數(shù)據(jù)庫需要幾個(gè)步驟?JDBC常用類和接口感謝聆聽任務(wù)三:新聞發(fā)布系統(tǒng)訪問數(shù)據(jù)庫JavaWeb應(yīng)用開發(fā)技術(shù)董蕾02應(yīng)用數(shù)據(jù)庫連接池實(shí)現(xiàn)新聞信息修改任務(wù)描述本任務(wù)學(xué)習(xí)并理解數(shù)據(jù)庫連接池的工作原理、常用的數(shù)據(jù)庫連接池及用法,完成數(shù)據(jù)庫連接池的配置,從數(shù)據(jù)庫連接池獲取連接以實(shí)現(xiàn)更新新聞信息的功能。JDBC封裝操作JDBC本身提供的API是相對底層的,直接使用JDBC進(jìn)行數(shù)據(jù)庫操作需要編寫大量的代碼,如創(chuàng)建數(shù)據(jù)庫連接、創(chuàng)建SQL語句、處理結(jié)果集等。通過封裝類,可以將這些重復(fù)的操作封裝成方法,以便在不同的業(yè)務(wù)場景中使用,避免重復(fù)編寫代碼,提高開發(fā)效率。JDBC封裝類還可以將數(shù)據(jù)庫連接的細(xì)節(jié)(如URL、用戶名、密碼)隱藏起來,通過配置文件等方式進(jìn)行管理,避免直接在代碼中暴露敏感信息,提高了系統(tǒng)的安全性。JDBC封裝操作JDBC封裝類的創(chuàng)建步驟大體如下。首先,創(chuàng)建一個(gè)配置文件perties,并將其放置在項(xiàng)目的資源目錄下(對Maven項(xiàng)目來說,通常是src/main/resources),文件示例內(nèi)容如下。url=jdbc:mysql://localhost:3306/your_databasedriverClass=com.mysql.jdbc.Driverusername=your_usernamepassword=your_passwordJDBC封裝操作其次,創(chuàng)建一個(gè)工具類DBUtil,該類包含讀取配置文件、創(chuàng)建數(shù)據(jù)庫連接、關(guān)閉數(shù)據(jù)庫連接等各模塊可以重用的操作方法,示例代碼如下。JDBC封裝操作public
classDBUtil{
privatestaticStringjdbcUrl;
privatestaticStringuserName;
privatestaticStringpassword;
//找到資源目錄下的配置文件
InputStreaminput=
DBUtil.class.getClassLoader().getResourceAsStream("perties");
//實(shí)例化Properties對象
Propertiesproperties=newProperties();
try{
//加載配置文件,完成配置文件的解析
properties.load(input);
//獲取參數(shù)
jdbcUrl=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
//加載驅(qū)動
Class.forName(properties.getProperty("driverClass"));
}catch(IOException|ClassNotFoundExceptione){
e.printStackTrace();
}finally{
try{
if(input!=null){
input.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}JDBC封裝操作//獲取連接對象publicstaticConnectiongetConnection(){Connectionconnection=null;try{connection=DriverManager.getConnection(jdbcUrl,username,password);}catch(SQLExceptione){e.printStackTrace();}returnconnection;}//封裝關(guān)閉連接為通用方法publicstaticvoidcloseConnection(Connectionconn,PreparedStatementpst,ResultSetrs){try{if(conn!=null){conn.close();}if(pst!=null){pst.close();}if(rs!=null){rs.close();}}catch(SQLExceptione){e.printStackTrace();}}數(shù)據(jù)庫連接池配置普通JDBC連接,每次操作數(shù)據(jù)庫前,都需要創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接。操作完成后,需要手動關(guān)閉連接。頻繁地創(chuàng)建和關(guān)閉連接會增加系統(tǒng)開銷,影響性能。數(shù)據(jù)庫連接池可以很好地解決這個(gè)問題,有效減少創(chuàng)建和關(guān)閉連接的開銷。數(shù)據(jù)庫連接池配置1.?dāng)?shù)據(jù)庫連接池概述(1)數(shù)據(jù)庫連接池原理普通的JDBC數(shù)據(jù)庫連接使用DriverManager類來實(shí)現(xiàn),每次與數(shù)據(jù)庫建立連接的時(shí)候都要將Connection加載到內(nèi)存中,再驗(yàn)證用戶名和密碼(需要花費(fèi)0.05~1s)。需要連接數(shù)據(jù)庫的時(shí)候,就向數(shù)據(jù)庫連接地申請一個(gè)連接,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時(shí)間。數(shù)據(jù)庫的連接資源并沒有得到很好的重復(fù)利用。若同時(shí)有幾百人甚至幾千人在線,頻繁地進(jìn)行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴(yán)重時(shí)甚至?xí)?dǎo)致服務(wù)器崩潰。數(shù)據(jù)庫連接池配置數(shù)據(jù)庫連接池就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢后再放回去。數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個(gè)。數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,這些數(shù)據(jù)庫連接的數(shù)量取決于最小連接數(shù),無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大連接數(shù)限定了這個(gè)連接池至多能擁有的數(shù)據(jù)庫連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)時(shí),這些請求將被加入等待隊(duì)列中.數(shù)據(jù)庫連接池配置(2)JDBC連接池的運(yùn)行步驟JDBC連接池的運(yùn)行步驟如下。①
初始化連接池。在應(yīng)用程序啟動時(shí),JDBC連接池會根據(jù)預(yù)設(shè)的參數(shù)(如最小連接數(shù)、最大連接數(shù)等)初始化一定數(shù)量的數(shù)據(jù)庫連接。這些連接被保存在連接池中,等待應(yīng)用程序使用。②
連接的分配。當(dāng)應(yīng)用程序需要與數(shù)據(jù)庫進(jìn)行交互時(shí),不是直接創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接,而是向連接池請求一個(gè)連接。連接池如果有空閑的連接,會分配一個(gè)給應(yīng)用程序。如果沒有空閑連接,并且當(dāng)前連接數(shù)小于最大連接數(shù),連接池會創(chuàng)建一個(gè)新的連接供應(yīng)用程序使用。數(shù)據(jù)庫連接池配置③
連接的使用和回收。應(yīng)用程序使用從連接池中獲得的連接進(jìn)行數(shù)據(jù)庫操作。操作完成后,不是關(guān)閉連接,而是將連接返回給連接池。④
連接的管理。連接池會管理返回的連接,將其標(biāo)記為可用狀態(tài),以便為其他請求所使用。如果連接長時(shí)間未被使用,連接池可能會關(guān)閉這些連接以釋放資源。⑤
連接的維護(hù)。連接池會定期檢查池中連接的狀態(tài),確保連接的有效性。如果發(fā)現(xiàn)無效連接,會將其從池中移除,并可能創(chuàng)建新的連接以保證池中的連接數(shù)。數(shù)據(jù)庫連接池配置(3)JDBC連接池優(yōu)勢①
性能提升。②
資源節(jié)約。③
穩(wěn)定性增強(qiáng)。④
開發(fā)效率提高。⑤
靈活性與可配置性。⑥
安全性增強(qiáng)。數(shù)據(jù)庫連接池配置(4)常用的JDBC連接池在Java中,JDBC連接池通常是通過第三方庫實(shí)現(xiàn)的。常用的JDBC連接池有Druid、HikariCP、C3P0等。數(shù)據(jù)庫連接池配置2.Druid連接池常用的類及方法(1)DruidDataSource類DruidDataSource類是Druid連接池的核心類,它負(fù)責(zé)管理數(shù)據(jù)庫連接的創(chuàng)建、關(guān)閉、分配和回收,常用方法如下。①init():初始化連接池。②close():關(guān)閉連接池,釋放所有資源。③getConnection():從連接池中獲取一個(gè)數(shù)據(jù)庫連接。④setUrl(Stringurl):設(shè)置數(shù)據(jù)庫的JDBCURL。數(shù)據(jù)庫連接池配置⑤setUsername(Stringusername):設(shè)置數(shù)據(jù)庫的用戶名。⑥setPassword(Stringpassword):設(shè)置數(shù)據(jù)庫的密碼。⑦setDriverClassName(StringdriverClassName):設(shè)置數(shù)據(jù)庫的JDBC驅(qū)動類名。⑧setInitialSize(intinitialSize):設(shè)置連接池初始大小。⑨setMaxActive(intmaxActive):設(shè)置連接池最大連接數(shù)。⑩setMinIdle(intminIdle):設(shè)置連接池最小空閑連接數(shù)。setMaxWait(longmaxWait):設(shè)置獲取連接的最大等待時(shí)間。setTimeBetweenEvictionRunsMillis(longtimeBetweenEvictionRunsMillis):設(shè)置間隔多久進(jìn)行一次空閑連接的回收。數(shù)據(jù)庫連接池配置(2)DruidPooledConnection類DruidPool
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年及未來5年市場數(shù)據(jù)中國漢堡包行業(yè)市場需求預(yù)測及投資規(guī)劃建議報(bào)告
- 2025年大學(xué)國際商務(wù)(國際商務(wù)談判)試題及答案
- 2026年藥品管理(藥品驗(yàn)收流程)試題及答案
- 2025年中職(物流配送專業(yè))快遞配送試題及答案
- 2025年大學(xué)大二(植物生理學(xué))植物生長發(fā)育調(diào)控技術(shù)綜合測試題及答案
- 2025年大學(xué)教育學(xué)(教育管理學(xué)基礎(chǔ))試題及答案
- 2025年高職(商務(wù)談判與溝通)溝通技巧階段測試題及答案
- 2025年大學(xué)通識選修(傳媒文化)試題及答案
- 2026年電梯維保(電梯故障排除)試題及答案
- 2025年中職傳感器技術(shù)(技術(shù)應(yīng)用)試題及答案
- 國家安全生產(chǎn)十五五規(guī)劃
- 河南省2025年普通高等學(xué)校對口招收中等職業(yè)學(xué)校畢業(yè)生考試語文試題 答案
- 中國地級市及各省份-可編輯標(biāo)色地圖
- 實(shí)驗(yàn)室生物安全培訓(xùn)-課件
- 第章交流穩(wěn)態(tài)電路
- 馬口鐵印鐵制罐工藝流程詳解課件
- 預(yù)應(yīng)力管樁-試樁施工方案
- GB/T 16938-2008緊固件螺栓、螺釘、螺柱和螺母通用技術(shù)條件
- FZ/T 82006-2018機(jī)織配飾品
- 《食品包裝學(xué)(第三版)》教學(xué)PPT課件整套電子講義
- 全尺寸測量報(bào)告FAI
評論
0/150
提交評論