




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目四JDBC數(shù)據(jù)庫訪問技術(shù)
項(xiàng)目要
求本項(xiàng)目是JDBC數(shù)據(jù)庫訪問技術(shù)的應(yīng)用,主要是完成數(shù)據(jù)庫的增刪改查,并能應(yīng)用數(shù)據(jù)庫的相關(guān)知識完成真實(shí)項(xiàng)目數(shù)據(jù)庫的操作。
項(xiàng)目分
析要完成項(xiàng)目任務(wù),要完成項(xiàng)目任務(wù),至少需要具備兩個(gè)基本條件:一是要正確配置MySQL,二是要能正確配置JDBC對應(yīng)的jar包,三是掌握的基本的驅(qū)動(dòng)的方法,該項(xiàng)目分4個(gè)任務(wù),分別是Java中連接數(shù)據(jù)庫、數(shù)據(jù)庫查詢和模糊查詢、數(shù)據(jù)庫的更新操作和應(yīng)用連接池驅(qū)動(dòng)MySQL數(shù)據(jù)庫。
項(xiàng)目目
標(biāo)【知識目標(biāo)】掌握J(rèn)DBC的概念、掌握J(rèn)DBC常用的API的主要內(nèi)容、掌握Statement接口和Result接口、熟悉PreparedStatement對象連接池?!灸芰δ繕?biāo)】能正確配置jar包,能應(yīng)用JDBC實(shí)現(xiàn)數(shù)據(jù)庫的增、刪、改、查,能應(yīng)用數(shù)據(jù)庫連接池Druid,結(jié)合JDBC實(shí)現(xiàn)數(shù)據(jù)庫的增、刪、改、查?!舅刭|(zhì)目標(biāo)】培養(yǎng)學(xué)生具有網(wǎng)絡(luò)安全意識,提升學(xué)生民族自豪感和愛國熱情
知識導(dǎo)
圖任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)演示本任務(wù)使用Java語言驅(qū)動(dòng)MySQL數(shù)據(jù)庫,命名為“jiaqicms”數(shù)據(jù)庫中的表名為“user”的一共的記錄數(shù)打印到控制臺,如圖所示。任務(wù)一Java中連接數(shù)據(jù)庫–知識準(zhǔn)備JDBC的主要操作類及接口JDBC簡介1.JDBC簡介JDBC(JavaDatabaseConnectivity),Java數(shù)據(jù)庫連接提供了一種與平臺無關(guān)的用于執(zhí)行SQL語句的標(biāo)準(zhǔn)JavaAPI,可以方便用戶實(shí)現(xiàn)多種關(guān)系型數(shù)據(jù)庫的統(tǒng)一操作,它是由一組用Java語言編寫的類和接口。在實(shí)際開發(fā)中可以直接使用JDBC進(jìn)行各個(gè)數(shù)據(jù)庫的連接與操作,而且可以方便的向數(shù)據(jù)庫中發(fā)送各種SQL命令。在JDBC中提供了一套標(biāo)準(zhǔn)接口,Java數(shù)據(jù)庫生產(chǎn)商只要按照接口提供相應(yīng)的實(shí)現(xiàn),就可以使用JDBC進(jìn)行操作,極大的體現(xiàn)了Java語言“一次開發(fā),多平臺運(yùn)行”的特點(diǎn)。2.JDBC的主要操作類及接口JDBC通過把特定數(shù)據(jù)庫廠商數(shù)據(jù)庫操作的細(xì)節(jié)進(jìn)行抽象,得到一些類和接口,這些類和接口包含在java.sql包中,這樣,就可以被任何具有JDBC驅(qū)動(dòng)的數(shù)據(jù)庫使用,從而實(shí)現(xiàn)了數(shù)據(jù)庫訪問的通用化。要使用JDBC連接到不同廠商的數(shù)據(jù)庫,應(yīng)該首先安裝對應(yīng)廠商的數(shù)據(jù)庫驅(qū)動(dòng)。如果是MySQL數(shù)據(jù)庫,只需安裝MySQL驅(qū)動(dòng);如果是Oracle數(shù)據(jù)庫,只需安裝Oracle驅(qū)動(dòng);如果是Access數(shù)據(jù)庫,只要安裝Access數(shù)據(jù)庫,JDBC就可以實(shí)現(xiàn)對Access數(shù)據(jù)庫的操作。2.
JavaBean的分類JavaBean起初的目的是將可以重復(fù)使用的代碼進(jìn)行打包,在傳統(tǒng)的應(yīng)用中,JavaBean應(yīng)用于可視化界面,Java圖形界面中使用的按鈕、文本框和列表框等,這種JavaBean稱為可視化的JavaBean。隨著技術(shù)的不斷發(fā)展與項(xiàng)目需求的增加,JavaBean的功能與應(yīng)用范圍也在不斷擴(kuò)展,目前JavaBean主要實(shí)現(xiàn)一些業(yè)務(wù)邏輯或封裝一些業(yè)務(wù)對象,這些JavaBean并沒有可視化界面,又稱為非可視化的JavaBean。(1)Driver接口class.forName是用來對類進(jìn)行初始化,他會讓Java虛擬機(jī)(Java虛擬機(jī),英文縮寫為“JavaVirtualMachine”,簡記為JVM,它專門為執(zhí)行單個(gè)計(jì)算機(jī)程序而設(shè)計(jì),主要為執(zhí)行java字節(jié)碼指令而設(shè)計(jì)的)對指定的類進(jìn)行加載、連接、初始化等操作。該接口為類的類變量分配空間并賦值、執(zhí)行靜態(tài)代碼塊中的數(shù)據(jù)庫的配置信息,實(shí)現(xiàn)對類的初始化操作。Class.forName()方法具體使用如下:Class.forName("com.mysql.jdbc.Driver");(2)DriverManager類DriverManager類主要用來管理和注冊數(shù)據(jù)庫驅(qū)動(dòng),得到數(shù)據(jù)庫連接對象。在DriverManager類中,定義了兩個(gè)重要的靜態(tài)方法,如表所示。
表4-·1DriverManager類的方法方法名稱作用staticregisterDriver(Driverdriver)該方法用于向DriverManager中注冊給定的JDBC驅(qū)動(dòng)程序staticconnectiongetConnection(Stringurl,Stringuser,Stringpassword)創(chuàng)建連接對象,其中url為數(shù)據(jù)庫服務(wù)器的地址,user為數(shù)據(jù)庫用戶名,password為用戶的密碼staticDrivergetDriver(Stringurl)用于返回能夠打開url所指定的數(shù)據(jù)庫的驅(qū)動(dòng)程序數(shù)據(jù)庫連接【例4-1-1】Java中數(shù)據(jù)庫連接publicclassMysqlDemo{publicstaticvoidmain(String[]args){ try{ Class.forName("com.mysql.jdbc.Driver");//1.注冊驅(qū)動(dòng) //2.獲取連接Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); System.out.println(conn); }catch(Exceptione){ e.printStackTrace();
}}}Connection接口代表Java程序和數(shù)據(jù)庫的連接,只有獲得該連接對象后才能訪問數(shù)據(jù)庫,才能實(shí)現(xiàn)對數(shù)據(jù)庫的增刪改查等操作。在該接口中,定義了多個(gè)方法,常用方法如表所示。
(3)Connection接口表4-2Connection接口中提供的方法方法名稱作用getMetaData()該方法用于返回?cái)?shù)據(jù)庫的元數(shù)據(jù)的DatabaseMetaData對象createStatement()該方法用于創(chuàng)建一個(gè)Statement對象并將SQL語句發(fā)送到數(shù)據(jù)庫prepareStatement(Stringsql)該方法用于創(chuàng)建一個(gè)prepareStatement對象并將參數(shù)化的SQL語句發(fā)送到數(shù)據(jù)庫prepareCall(Stringsql)該方法用于創(chuàng)建一個(gè)CallableStatement對象來調(diào)用數(shù)據(jù)庫的存儲過程【例4-1-2】實(shí)例化Statement對象
(3)Connection接口publicstaticvoidmain(String[]args){ try{Class.forName("com.mysql.jdbc.Driver");//1.注冊驅(qū)動(dòng) //2.獲取連接 Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); Statementstmt=conn.createStatement(); //3.實(shí)例化Statement對象 System.out.println(stmt); }catch(Exceptione){ e.printStackTrace(); }}}(4)Statement接口表4-3Statement接口中提供的方法方法名稱作用execute(Stringsql)該方法用于執(zhí)行各種SQL語句,返回一個(gè)boolean類型的值,如果為true,表示所執(zhí)行的SQL語句有查詢結(jié)果,可通過Statement的getResultSet()方法獲得查詢結(jié)果executeUpdate(Stringsql)該方法用于執(zhí)行SQL中的INSERT、UPDATE和DELETE語句。該方法返回一個(gè)int類型的值,表示數(shù)據(jù)庫中受到該SQL語句影響的就條數(shù)。executeQuery(Stringsql)該方法用于執(zhí)行SQL中的SELECT語句,返回一個(gè)表示查詢結(jié)果的ResultSet對象(4)Statement接口【例4-1-3】Statement接口的和executeQuery()方法的應(yīng)用publicclassMysqlDemo{ publicstaticvoidmain(String[]args){ Stringsql="selectcount(*)fromuser"; intcount=0; try{Class.forName("com.mysql.jdbc.Driver");Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); Statementstmt=conn.createStatement(); //實(shí)例化Statement對象 ResultSetrs=stmt.executeQuery(sql);//執(zhí)行SQL語句,返回ResultSet結(jié)果集對象
System.out.println(rs); }catch(Exceptione){ e.printStackTrace();
}}}(5)PreparedStatement接口PreparedStatement是Statement的子接口,用于執(zhí)行預(yù)編譯的SQL語句。該接口擴(kuò)展了帶有參數(shù)的SQL語句的執(zhí)行操作,使用該接口中“?”來代替某個(gè)參數(shù),然后通過setXxx()方法為SQL語句的參數(shù)指定值。在PreparedStatement接口中,提供了一些常用的方法,具體如表4-3所示。表4-4PreparedStatement接口中的常用方法方法名稱作用executeUpdate(Stringsql)該方法用于執(zhí)行update、insert、delete語句,它返回的是語句執(zhí)行后影響到的記錄條數(shù)(int)executeQuery(Stringsql)該方法用于執(zhí)行SQL中的執(zhí)行select語句,它返回的是查詢后得到的ResultSet對象記錄集。setInt(intparameterIndex,intx)該方法用于將給定的int類型值賦值給指定的參數(shù),parameterIndex表示SQL語句第幾個(gè)參數(shù)的位置setFloat(intparameterIndex,floatx)該方法用于將給定float類型的值賦值給指定參數(shù)setString(intparameterIndex,Stringx)該方法用于將給定String類型的值賦值給指定參數(shù)setDate(intparameterIndex,Datex)該方法用于將給定的Date類型的值賦值給指定的參數(shù)PreparedStatement()方法的應(yīng)用【例4-1-4】PreparedStatement()方法的應(yīng)用
publicclassMysqlDemo01{ publicstaticvoidmain(String[]args){ Stringsql="select*fromjq_userwhere`username`=?and`password`=?"; try{Class.forName("com.mysql.jdbc.Driver");//1.注冊驅(qū)動(dòng) //2.獲取連接Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); PreparedStatementpre=conn.prepareStatement(sql);//3.實(shí)例化Statement對象,進(jìn)行預(yù)編譯 Stringusername="zhangsan"; Stringpassword="123"; pre.setString(1,username); pre.setString(2,password);
ResultSetrs=pre.executeQuery();//4.執(zhí)行SQL語句,返回ResultSet結(jié)果集對象
System.out.println(sql); System.out.println(rs); }catch(Exceptione){e.printStackTrace();
}}}(6)resultSet接口Statement接口用于保存JDBC執(zhí)行查詢時(shí)返回的結(jié)果集,該結(jié)果集封裝在一個(gè)邏輯表格中。在ResultSet接口內(nèi)部有一個(gè)指向表格數(shù)據(jù)行的游標(biāo),ResultSet對象初始化時(shí),游標(biāo)在表格的第1行之前,調(diào)用next()方法可將游標(biāo)移動(dòng)到下一行。如果下一行沒有數(shù)據(jù),則返回boolean值為false。ResultSet接口中常用方法如表4-5所示。表4-5PreparedStatement接口中的常用方法方法名稱作用getString(intcolumnIndex)該方法用于獲取指定字段的String類型的值,參數(shù)columnIndex代表字段的索引getString(StringcolumnName)該方法用于獲取指定字段的String類型的值,參數(shù)columnName代表字段的名稱getInt(intcolumnIndex)該方法用于獲取指定字段的int類型的值,參數(shù)columnIndex代表字段的索引getInt(StringcolumnName)該方法用于獲取指定字段的int類型的值,參數(shù)columnName代表字段的名稱setDate(intcolumnIndex)該方法用于獲取指定字段的Date類型的值,參數(shù)columnIndex代表字段的索引setDate(StringcolumnName)該方法用于獲取指定的Date類型的值,參數(shù)columentName代表字段的名稱next()將游標(biāo)從當(dāng)前位置向下移一行absolute(introw)將游標(biāo)移動(dòng)到ResultSet對象指定的行afterLast()將游標(biāo)移動(dòng)到ResultSet對象指定的末尾,即最后一行之后beforeFirst()將游標(biāo)移動(dòng)到ResultSet對象指定的開頭,即第一行之前Previous()將游標(biāo)移動(dòng)到ResultSet對象的上一行Last()將游標(biāo)移動(dòng)到ResultSet對象的最后一行PreparedStatement()方法的應(yīng)用【例4-1-5】next()方法和getXxx()方法的應(yīng)用
publicclassMysqlDemo04{ publicstaticvoidmain(String[]args){ Stringsql="select*fromjq_userwhere`username`=?and`password`=?"; try{Class.forName("com.mysql.jdbc.Driver");
Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); PreparedStatementpre=conn.prepareStatement(sql); Stringusername="zhangsan"; Stringpassword="123"; pre.setString(1,username); pre.setString(2,password); //4.執(zhí)行SQL語句,返回ResultSet結(jié)果集對象 ResultSetrs=pre.executeQuery(); while(rs.next()){ System.out.println("獲取到的姓名為:"+rs.getString("username"));} }catch(Exceptione){ e.printStackTrace();
}}}任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施1.加載JDBC數(shù)據(jù)庫驅(qū)動(dòng)(1)下載MySql的jar包MySQL數(shù)據(jù)庫所有版本的驅(qū)動(dòng)可以通過以下網(wǎng)址得到:/downloads/connector/c-j選擇對應(yīng)的版本,然后點(diǎn)擊“mysql-connector-java-8.0.30”進(jìn)行下載,如圖4-7所示意。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(2)將下載得到的文件進(jìn)行解壓解壓“mysql-connector-java-8.0.30.zip”文件,使用壓縮軟件進(jìn)行解壓,解壓后的文件如圖4-8所示。(3)Eclipse中使用jar包在Eclipse中使用jar包,配置方法比較多,這里分別給出最常用的一種方法。第一步新建java項(xiàng)目,然后新建一個(gè)文件夾,名字為libs,主要用來放各種外部包,右鍵工程名(我的是sqldemo1)—新建New—文件夾Folder—Foldername為libs—Finish,如圖4-9所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施第二步在包里面加入連接MySQL數(shù)據(jù)庫的包即剛才解壓后得到的mysql-connector-java-8.0.30.jar,然后復(fù)制粘貼到我們java項(xiàng)目的libs文件夾下面(注意是物理地址里);此時(shí),在Eclipse中—右擊libs文件夾—刷新Refresh,就將下載好的JDBC放到該文件夾下,如下圖4-10所示。第三步在Eclipse中點(diǎn)擊項(xiàng)目Project——選擇屬性Propeties,如圖4-11所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施第四步選擇jar包,添加到項(xiàng)目中,如圖4-12所示。打開屬性Propeties后,點(diǎn)擊java構(gòu)建路徑(JavaBuildPath),點(diǎn)擊添加jar(AddJARs...),選擇你的項(xiàng)目下的jar包,然后確定,最后添加完成。
任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施2.數(shù)據(jù)庫準(zhǔn)備
要使用JDBC來驅(qū)動(dòng)數(shù)據(jù)庫,要在MySQL服務(wù)器中創(chuàng)建數(shù)據(jù)庫,這里使用Navicat,創(chuàng)建一名字為“jiaqicms”的數(shù)據(jù)庫,并在數(shù)據(jù)庫中創(chuàng)建一名字為“user”,具體步驟如下。
(1)設(shè)置Navicat連接,如圖4-13所示意。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施2.數(shù)據(jù)庫準(zhǔn)備
(2)準(zhǔn)備新建數(shù)據(jù)庫,在本地?cái)?shù)據(jù)庫執(zhí)行右鍵,然后點(diǎn)擊“新建數(shù)據(jù)庫”,如圖4-14所示任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施2.數(shù)據(jù)庫準(zhǔn)備
指定數(shù)據(jù)庫名,設(shè)置數(shù)據(jù)庫的編碼,如圖4-15。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施點(diǎn)擊“表”,然后鼠標(biāo)右擊,再點(diǎn)擊“新建表”,如圖4-16所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(3)創(chuàng)建名為“id”的字段,選擇類型為“intege”,設(shè)置長度為3,并且設(shè)置為主鍵,設(shè)置為自動(dòng)遞增,如圖4-17所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(4)創(chuàng)建名為“username”字段,按照圖4-18所示的內(nèi)容進(jìn)行設(shè)置.
(5)繼續(xù)點(diǎn)擊”添加欄位”,增加“password、email、address”等四個(gè)字段的內(nèi)容,如圖4-19所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(6)點(diǎn)擊保存,在彈出的對話框中輸入表名“user”,然后點(diǎn)擊“確定”,如圖4-20所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(7)保存以后,可以關(guān)閉對話框,然后點(diǎn)擊“user”表,在彈出的對話框中準(zhǔn)備輸入內(nèi)容,如圖4-21所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(8)添加第一條記錄,如圖4-22所示.任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(9)繼續(xù)新增記錄,如圖4-23所示.任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施(10)保存后的結(jié)果,如圖4-24所示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施3.JDBC編程實(shí)現(xiàn)從前面的知識我們已經(jīng)知道,要操作數(shù)據(jù)庫,首先加載驅(qū)動(dòng),然后創(chuàng)建連接,才能進(jìn)行數(shù)據(jù)的增刪改查操作,最后要關(guān)閉數(shù)據(jù)庫連接,釋放資源。這里我們將數(shù)據(jù)名為“jiaqicms”中名為“jq_user”表的記錄數(shù)給查詢出來,打印到控制臺。這里直接給出代碼。
package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassMysqlDemo{
publicstaticvoidmain(String[]args){
Connectionconn=null;
Statementstmt=null;
Stringsql="selectcount(*)fromjq_user"; try{ //1.注冊驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver"); //2.獲取連接
任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)實(shí)施conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); //3.實(shí)例化Statement對象 stmt=conn.createStatement(); //System.out.println(stmt); //4.執(zhí)行SQL語句,返回ResultSet結(jié)果集對象 ResultSetrs=stmt.executeQuery(sql); while(rs.next()){ System.out.println("jq_user表中一共有"+rs.getInt(1)+"行"); } }catch(Exceptione)
{
e.printStackTrace();} try{ conn.close(); stmt.close(); }catch(SQLExceptione){ e.printStackTrace();
}}}任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)拓展1.資源文件中配置數(shù)據(jù)庫實(shí)際開發(fā)中不建義在Java程序中把連接數(shù)據(jù)庫的信息寫死,而是寫入到配置文件或資源文件中,這樣方便修改配置文件,而不需要重新編譯程序。在工程src目錄下創(chuàng)建名為”perties”的文件,輸入如下內(nèi)容:driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/jiaqicmsusername=rootpassword=root【腳小留心】注意:該XXX.properties文件,必須放在src文件夾下,不然會出錯(cuò),而且編譯器不會直接提示。任務(wù)一Java中連接數(shù)據(jù)庫--任務(wù)拓展讀取后綴名為properties的文件,可以通過ResourceBundle類來實(shí)現(xiàn)。ResourceBundle類是java自帶的類,類路徑:java.util.ResourceBundle,主要用來讀取項(xiàng)目中后綴為properties的配置文件。獲取配置文件的名稱,使用getBundle()方法,代碼如下:ResourceBundleresourceBundle=ResourceBundle.getBundle("db");【教你一招】注意,上面代碼中的后綴名不需要書寫。獲取資源文件中的信息:使用getString()方法,比如要讀取數(shù)據(jù)庫的用戶名,則代碼可以寫為:Stringusername=bundle.getString("username");讀取其他信息,只需要改變getString()方法中的值就可以了。任務(wù)二數(shù)據(jù)庫查詢和模糊查詢--任務(wù)演示將數(shù)據(jù)庫名為“jiaqicms”的數(shù)據(jù)庫中名字為“jq_user”表的第一條記錄的姓名和郵箱信息查詢出來,并打印輸出到控制臺,如圖4-26所示。使用關(guān)鍵字“san”對名字為“jiaqicms”的數(shù)據(jù)庫進(jìn)行模糊查詢,將查詢到的記錄中的“uername”字段的內(nèi)容輸出到控制臺,如圖4-27所示。任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–知識準(zhǔn)備使用PreparedStatement接口實(shí)現(xiàn)數(shù)據(jù)查詢使用PreparedStatement接口實(shí)現(xiàn)模糊查詢1.使用PreparedStatement接口實(shí)現(xiàn)數(shù)據(jù)查詢在前面小節(jié)中,我們已經(jīng)實(shí)現(xiàn)數(shù)據(jù)庫的訪問,可以訪問到數(shù)據(jù)庫中的信息,并可以輸出到控制臺。這里使用使用PreparedStatement接口來實(shí)現(xiàn)數(shù)據(jù)庫的查詢和模糊查詢。PreparedStatement是Statement的子接口,是屬于預(yù)處理操作,與直接使用Statement不同的是,PreparedStatement在操作時(shí),是預(yù)先在數(shù)據(jù)表中準(zhǔn)備好了一條SQL語句,但是此SQL語句的具體內(nèi)容暫時(shí)不設(shè)置,而是之后在進(jìn)行設(shè)置。使用PreparedStatement中執(zhí)行SQL語句與之前并沒有什么不同,但是對于具體的內(nèi)容是采用”?”的占位符形式出現(xiàn)的,設(shè)置時(shí)要按照”?”的順序設(shè)置具體的內(nèi)容。定義如下SQL語句。Stringsql="select*fromjq_userwhereusername=?";如何對“?”處內(nèi)容賦值呢?可以通過如下方法。PreparedStatementstmt=conn.prepareStatement(sql);stmt.setString(1,"zhangsan");其中1表示第一個(gè)問號出現(xiàn)的位置,賦值的具體內(nèi)容為“zhangsan”
2.使用PreparedStatement接口實(shí)現(xiàn)模糊查詢完成了查詢操作以后,下面介紹如何進(jìn)行模糊查詢。模糊查詢是利用數(shù)據(jù)的部分信息進(jìn)行信息查找的一種查詢方式。如果用戶在進(jìn)行數(shù)據(jù)查詢時(shí),不知道查詢實(shí)體的具體信息時(shí),僅僅知道少量信息,此時(shí)就要用到模糊查詢。下面我們首先介紹一下MySQL中通配符的概念。通配符是一種特殊語句,用來模糊搜索文件。主要有星號(*)和問號(?)等,可以使用它來代替一個(gè)或多個(gè)真正字符。MySQL中規(guī)定的通配符主要有以下三種:(1)“%”號通配符:表示任何字符出現(xiàn)任意次數(shù)(可以是0次)(2)“_”通配符:只能匹配單個(gè)字符,不能多也不能少,就是一個(gè)字符。(3)like操作符:指MySQL后面的搜索模式是利用通配符而不是直接相等匹配進(jìn)行比較,如果like后面沒有出現(xiàn)通配符,則在SQL執(zhí)行優(yōu)化時(shí)將like等價(jià)于“=”執(zhí)行。1.
response對象實(shí)現(xiàn)重定向【例4-2-1】對名為”jq_user”的表進(jìn)行模糊查詢
Stringsql="selectusername,password,email,addressfromjq_user"+"whereusernamelike?";pstmt=conn.prepareStatement(sql);pstmt.setString(1,"%"+username+"%");//設(shè)定參數(shù)rs=pstmt.executeQuery();//獲取查詢的結(jié)果集
1.單條或多條記錄的查詢?nèi)蝿?wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)實(shí)現(xiàn)package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.ResourceBundle;publicclassMysqlDemo05{publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementstmt=null;
Stringsql="select*fromjq_userwhereusername=?";
Stringdriver=null;
Stringurl=null;
Stringusername=null;
Stringpassword=null;ResourceBundlebundle=ResourceBundle.getBundle("db");
driver=bundle.getString("driver");
url=bundle.getString("url");username=bundle.getString("username");password=bundle.getString("password");
try{//1.注冊驅(qū)動(dòng)
Class.forName(driver);
下面通過將jq_user表中姓名為“zhangsan”的記錄打印輸出到控制臺,如果“jq_user”表中有多條記錄,那么都可以打印輸出到控制臺。任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)實(shí)現(xiàn)conn=DriverManager.getConnection(url,username,password);prepareStatement對象
stmt=conn.prepareStatement(sql);stmt.setString(1,"zhangsan");//4.執(zhí)行SQL語句,返回ResultSet結(jié)果集對象 ResultSetrs=stmt.executeQuery(); while(rs.next()){
System.out.println("姓名:"+rs.getString("username")+"----"+"郵箱:"+rs.getString("email"));}
}catch(Exceptione){ e.printStackTrace();} try{conn.close(); stmt.close(); }catch(SQLExceptione){
e.printStackTrace();}}}
2.模糊查詢?nèi)蝿?wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)實(shí)現(xiàn)package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassMysqlDemo06{
publicstaticvoidmain(String[]args){Stringsql="select*fromjq_userwhereusernamelike?";Try{Class.forName("com.mysql.jdbc.Driver");//1.注冊驅(qū)動(dòng)
//2.獲取連接Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root")PreparedStatementpre=conn.prepareStatement(sql);//3.實(shí)例化Statement對象,進(jìn)行預(yù)編譯
Stringusername="%san%"; pre.setString(1,username); //4.執(zhí)行SQL語句,返回ResultSet結(jié)果集對象ResultSetrs=pre.executeQuery();while(rs.next()){System.out.println("獲取到的姓名為:"+rs.getString("username"));模糊查詢主要用在網(wǎng)站的內(nèi)容的搜索功能上,下面代碼實(shí)現(xiàn)對jq_user表中的數(shù)據(jù)進(jìn)行模糊查詢。
2.模糊查詢?nèi)蝿?wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)實(shí)現(xiàn)
}}catch(Exceptione){ e.printStackTrace(); }
}}
模糊查詢主要用在網(wǎng)站的內(nèi)容的搜索功能上,下面代碼實(shí)現(xiàn)對jq_user表中的數(shù)據(jù)進(jìn)行模糊查詢。任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展1.靜態(tài)代碼塊在使用JDBC操作數(shù)據(jù)庫的時(shí)候,為了增加代碼的通用性,可以將數(shù)據(jù)庫連接等操作抽象為一個(gè)工具類DBUtils。這里需要用到靜態(tài)代碼塊的知識,什么是靜態(tài)代碼塊呢?靜態(tài)代碼塊是定義在類中,使用關(guān)鍵字static修飾的代碼塊,在類加載時(shí)只執(zhí)行一次,無論類在那個(gè)位置,與對象無關(guān),不論產(chǎn)生多少對象,靜態(tài)代碼塊只在類加載時(shí)執(zhí)行一次,如下是靜態(tài)代碼塊的應(yīng)用。package.cqcvc;publicclasstestDemo02{ publicstaticvoidmain(String[]args){ System.out.println("進(jìn)入到了main方法"); Personp=newPerson("張三","123"); }}任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展classPerson{ Stringusername; Stringpassword; publicPerson(){ System.out.println("這是無參構(gòu)造函數(shù)!"); } publicPerson(Stringusername,Stringpassword){ super(); this.username=username; this.password=password; System.out.println("這是有參構(gòu)造函數(shù)!"); } static{ System.out.println("這是靜態(tài)代碼塊!"); }}任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展2.工具類DBUtils有了靜態(tài)代碼塊的知識后,我們著手把數(shù)據(jù)庫操作抽成一個(gè)工具類,代碼如下所示。
package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.util.ResourceBundle;publicclassDBUtils{ privatestaticConnectionconn=null; privatestaticStringdriver=null; privatestaticStringurl=null; privatestaticStringusername=null; privatestaticStringpassword=null;publicstaticvoidreadFile()throwsException{ ResourceBundlebundle=ResourceBundle.getBundle("db");
任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展 driver=bundle.getString("driver"); url=bundle.getString("url"); username=bundle.getString("username"); password=bundle.getString("password");}
static{ //只加載一次驅(qū)動(dòng) try{ readFile();//讀取本地配置文件 Class.forName(driver); }catch(Exceptione){ e.printStackTrace();
}}//獲取連接 publicstaticConnectiongetConnection()throwsException{
conn=DriverManager.getConnection(url,username,password); returnconn; }
任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展publicstaticvoidmyclose(Connectionconn,ResultSetrs,PreparedStatementpmst)throwsException{ if(conn!=null){ conn.close();
} if(rs!=null){
rs.close(); } if(pmst!=null){ pmst.close();
}}}有了工具類以后,需要寫一個(gè)測試方法,測試代碼如下。package.cqcvc;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassMysqlDemo10{ publicstaticvoidmain(String[]args)throwsException{ DBUtilsdb=newDBUtils(); Connectionconn=db.getConnection(); Stringsql="select*fromjq_user"; PreparedStatementpmst=conn.prepareStatement(sql); ResultSetrs=pmst.executeQuery();
任務(wù)二應(yīng)用JavaBean實(shí)現(xiàn)網(wǎng)站注冊功能–任務(wù)拓展while(rs.next()){System.out.println("用戶名:"+rs.getString("username")+",郵箱:"+rs.getString("email"));
}db.myclose(conn,rs,pmst);
}}
任務(wù)三數(shù)據(jù)庫的更新操作--任務(wù)演示為了數(shù)據(jù)庫連接以后,可以對數(shù)據(jù)進(jìn)行增、刪、改、插操作。要對數(shù)據(jù)進(jìn)行更新操作,可以使用Statement接口完成。該接口中需要Connection接口提供creatStatement()方法進(jìn)行實(shí)例化,進(jìn)而可以實(shí)現(xiàn)相應(yīng)的操作。本任務(wù)使用Java語言驅(qū)動(dòng)MySQL數(shù)據(jù)庫,命名為“jiaqicms”數(shù)據(jù)庫中的表名為“user”表中增加數(shù)據(jù)并實(shí)現(xiàn)修改刪除操作,如圖4-32所示。任務(wù)三數(shù)據(jù)庫的更新操作–知識準(zhǔn)備使用Statement接口實(shí)現(xiàn)數(shù)據(jù)的更新1.使用Statement接口實(shí)現(xiàn)數(shù)據(jù)的更新JDBC中的Statement對象用于向數(shù)據(jù)庫發(fā)送SQL語句,想完成對數(shù)據(jù)庫的增刪改查,只需要通過這個(gè)對象向數(shù)據(jù)庫發(fā)送增刪改查語句即可。Statement對象的executeUpdate()方法,用于向數(shù)據(jù)庫發(fā)送增,刪,改,查的SQL語句,executeUpdate()執(zhí)行完后,將會返回一個(gè)整數(shù),(即增刪改語句導(dǎo)致了數(shù)據(jù)庫的記錄數(shù)發(fā)生了變化)。Statement.executeQuery()用于向數(shù)據(jù)庫發(fā)送查詢語句,executeQuery()方法返回代表查詢結(jié)果的ResultSet對象。(1)插入數(shù)據(jù)【例4-3-1】使用executeUpdate(Stringsql)方法向數(shù)據(jù)中添加數(shù)據(jù)Statementstmt=conn.createStatement(); Stringsql="insertintouser(...)values(...)"; intnum=stmt.executeUpdate(sql); if(num>0){ System.out.println("數(shù)據(jù)插入成功");}(2)刪除數(shù)據(jù)【例4-3-2】使用executeUpdate(Stringsql)方法將指定表中的數(shù)據(jù)進(jìn)行刪除
Statementstmt=conn.createStatement(); Stringsql="deletefromjq_userwhereid=1"; intnum=stmt.executeUpdate(sql); if(num>0){ System.out.println("數(shù)據(jù)刪除成功"); }(3)修改數(shù)據(jù)【例4-3-2】使用executeUpdate(Stringsql)方法將指定表中的數(shù)據(jù)進(jìn)行修改Statementstmt=conn.createStatement(); Stringsql="updatejq_usersetusername=’’whereid=1"; intnum=stmt.executeUpdate(sql); if(num>0){ System.out.println("數(shù)據(jù)更新成功"); }任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)實(shí)施package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassMysqlDemo07{publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; Statementstmt=null;Class.forName("com.mysql.jdbc.Driver");conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root");
stmt=conn.createStatement();
Stringsql="insertintojq_user(username,password,email,address)values('lier','123','233@','南京路')";
1.插入數(shù)據(jù)庫表記錄。向jq_user表中增加一條新的記錄,編寫一條完整的SQL語句,并通過Statement執(zhí)行。任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)實(shí)施 intnum=stmt.executeUpdate(sql); if(num>0){ System.out.println("數(shù)據(jù)插入成功"); conn.close(); stmt.close(); }}}
任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)實(shí)施2.修改數(shù)據(jù)庫表記錄。將jq_user表中id=5的記錄password字段的值修改為“123456”,將address字段的內(nèi)容修改為“上海東路100號”,對應(yīng)的程序代碼如下。package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;publicclassMysqlDemo08{ publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; Statementstmt=null; Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); stmt=conn.createStatement(); Stringsql="updatejq_userset`password`='123456',`address`='上海東路100號'whereid=5";
任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)實(shí)施 intnum=stmt.executeUpdate(sql); if(num>0){ System.out.println("數(shù)據(jù)修改成功"); conn.close(); stmt.close(); }}}任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)實(shí)施3.刪除數(shù)據(jù)庫表字段。將jq_user表中id=4的記錄給刪除,對應(yīng)的代碼如下。publicclassMysqlDemo09{ publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; Statementstmt=null;
Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root");
stmt=conn.createStatement();
Stringsql="deletefromjq_userwhereid=4";
intnum=stmt.executeUpdate(sql);
if(num>0){
System.out.println("數(shù)據(jù)刪除成功");
conn.close(); stmt.close();
}}}
任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)拓展1.防止SQL漏洞Statement接口用于處理不帶參數(shù)的靜態(tài)sql語句,PreparedStatement接口可以處理帶參數(shù)的sql語句。Statement中SQL存在漏洞,會被攻擊導(dǎo)致數(shù)據(jù)泄露SQL會被拼接or字符。在網(wǎng)站開發(fā)中特別要注意此問題,如果是因?yàn)檫@個(gè)問題,造成網(wǎng)站數(shù)據(jù)泄露造成了損失,就是網(wǎng)站開發(fā)人員的失職。如何規(guī)避此問題呢?我們使用PreparedStatement可以防止SQL注入。PreparedStatement接口防止SQL注入的本質(zhì),把傳遞進(jìn)來的參數(shù)當(dāng)做字符,假設(shè)其中存在轉(zhuǎn)義字符,會被直接轉(zhuǎn)義。下面通過Statement接口與PreparedStatement接口代碼進(jìn)行的對比(1)使用Statement接口登錄被SQL注入。publicclassloginDemo01{
publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null;
Statementstmt=null;
Stringusername="zhangsan";
Stringpassword="123"; 任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)拓展Scannersc=newScanner(System.in);System.out.println("請輸入賬號:");username=sc.nextLine();System.out.println("請輸入密碼:");password=sc.nextLine(); Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root"); stmt=conn.createStatement();
Stringsql="select*fromjq_userwhereusername='"+username+"'andpassword='"+password+"'"; System.out.println(sql); ResultSetrs=stmt.executeQuery(sql);
if(rs.next()){ System.out.println("登錄成功"); }else{ System.out.println("登錄失敗");} conn.close(); stmt.close();} }任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)拓展(2)使用PreparedStatement接口防止SQL注入從數(shù)據(jù)庫的jq_user表中知道,我們的password字段沒有為“1”的內(nèi)容,但是這里登陸成功了,這就是SQL的注入。為了防止這種情況,可以使用PreparedStatement接口來實(shí)現(xiàn)用戶登錄防止SQL注入。package.cqcvc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.Statement;importjava.util.Scanner;publicclassloginDemo02{publicstaticvoidmain(String[]args)throwsException{ Connectionconn=null; PreparedStatementstmt=null; Stringusername="zhangsan"; Stringpassword="123";
任務(wù)三數(shù)據(jù)庫的更新操作–任務(wù)拓展
Scannersc=newScanner(System.in);System.out.println("請輸入賬號:");username=sc.nextLine();System.out.println("請輸入密碼:");password=sc.nextLine();
Class.forName("com.mysql.jdbc.Driver");
Stringsql="select*fromjq_userwhereusername=?andpassword=?";
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiaqicms","root","root");
stmt=conn.prepareStatement(sql);
stmt.setString(1,username);
stmt.setString(2,password);
ResultSetrs=stmt.executeQuery();
System.out.println(sql);
if(rs.next()){
System.out.println("登錄成功");
}else{ System.out.println("登錄失敗");}conn.close(); stmt.close();
}}任務(wù)四應(yīng)用連接池驅(qū)動(dòng)MySQL數(shù)據(jù)庫--任務(wù)演示本任務(wù)在實(shí)現(xiàn)JDBC連接池,實(shí)現(xiàn)對MySQL數(shù)據(jù)庫的訪問,如圖1-38所示任務(wù)四應(yīng)用連接池驅(qū)動(dòng)MySQL數(shù)據(jù)庫–知識準(zhǔn)備JDBC數(shù)據(jù)庫連接池的必要性數(shù)據(jù)庫連接池技術(shù)1.JDBC數(shù)據(jù)庫連接池的必要性訪問數(shù)據(jù)庫的時(shí)候,主要通過以下三個(gè)步驟:第一在主程序中建立數(shù)據(jù)庫連接;第二進(jìn)行SQL操作;第三斷開數(shù)據(jù)庫連接。應(yīng)用這種模式開發(fā),主要存在以下問題。(1)普通的JDBC數(shù)據(jù)庫連接使用DriverManager來獲取,每次向數(shù)據(jù)庫建立連接的時(shí)候都要將Connection加載到內(nèi)存中,再驗(yàn)證用戶名和密碼(得花費(fèi)0.05s~1s的時(shí)間)。需要數(shù)據(jù)庫連接的時(shí)候,就向數(shù)據(jù)庫要求一個(gè),執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時(shí)間。數(shù)據(jù)庫的連接資源并沒有得到很好的重復(fù)利用。若同時(shí)有幾百人甚至幾千人在線,頻繁的進(jìn)行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。1.JDBC數(shù)據(jù)庫連接池的必要性(2)對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將導(dǎo)致重啟數(shù)據(jù)庫。(3)這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。為解決傳統(tǒng)開發(fā)中的數(shù)據(jù)庫連接問題,可以采用數(shù)據(jù)庫連接池技術(shù)。2.數(shù)據(jù)庫連接池技術(shù)數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中,這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的。無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時(shí),這些請求將被加入到等待隊(duì)列中。2.數(shù)據(jù)庫連接池技術(shù)Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項(xiàng)目。Druid連接池為監(jiān)控而生,內(nèi)置強(qiáng)大的監(jiān)控功能,監(jiān)控特性不影響性能。功能強(qiáng)大,能防SQL注入,內(nèi)置Loging能診斷Hack應(yīng)用行為。Druid連接池號稱是業(yè)界最優(yōu)秀的連接池,在性能、監(jiān)控、診斷、安全、擴(kuò)展性都非常不錯(cuò)。使用druid連接池,主要是使用DruidDataSourceFactory根據(jù)properties配置文件內(nèi)容創(chuàng)建出DataSource數(shù)據(jù)源對象,然后調(diào)用其getConnection方法獲取數(shù)據(jù)庫連接對象,拿到連接對象之后,其它的操作跟JDBC訪問數(shù)據(jù)庫的操作一模一樣,唯一的區(qū)別就是當(dāng)調(diào)用連接的close方法時(shí),底層不再是關(guān)閉銷毀連接對象,而是將連接對象放入到連接池中,以便后續(xù)新的請求到來時(shí),直接拿去使用。2.數(shù)據(jù)庫連接池技術(shù)在項(xiàng)目的resources資源目錄下創(chuàng)建druid的properties配置文件,properties配置文件可以隨意命名,但是文件內(nèi)容中每項(xiàng)配置的key必須是指定的名稱,這里我使用perties作為配置文件的名稱,其文件內(nèi)容如下所示:
#數(shù)據(jù)庫連接參數(shù)
driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testdbusername=rootpassword=123456#初始化連接的數(shù)量initialSize=3#最大連接的數(shù)量maxActive=20#獲取連接的最大等待時(shí)間(毫秒)maxWait=30002.數(shù)據(jù)庫連接池技術(shù)有了配置文件以后,可以使用如下代碼讀取配置文件,并得到數(shù)據(jù)源對象,然后通過數(shù)據(jù)源對象獲取數(shù)據(jù)庫連接對象。//加載配置文件InputStreamis=druidtest.class.getClassLoader().getResourceAsStream("perties");Propertiesprop=newProperties();prop.load(is);//根據(jù)配置文件內(nèi)容,創(chuàng)建出數(shù)據(jù)源對象DataSourcedataSource=DruidDataSourceFactory.createDataSource(prop);//通過數(shù)據(jù)源對象獲取數(shù)據(jù)庫連接//如果連接池中的連接已經(jīng)被用完,則會等待一定的時(shí)間(所配置的時(shí)間)//如果等待超時(shí),就會拋出異常Connectionconn=dataSource.getConnection();System.out.println(conn);有了連接對象以后,就可以很方面的操作數(shù)據(jù)庫了。任務(wù)四應(yīng)用連接池驅(qū)動(dòng)MySQL數(shù)據(jù)庫–任務(wù)實(shí)施publicclassDruidUtil{ privatestaticConnectionconn=null; privatestaticDataSourcedataSource; static{try{ InputStreamis=DruidUtil.class.getClassLoader().getResourceAsStream("perties");Propertiesprop=newProperties();prop.load(is); dataSource=DruidDataSourceFactory.createDataSource(prop); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } //獲取連接publicstaticConnectiongetConnection()throws
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 推土機(jī)租賃合同書
- 建筑工程合同協(xié)議書
- 北京存量房買賣合同
- 總代理合作合同書
- 消防施工施工方案
- 天津改性砂漿施工方案
- TCSHB 0017-2024 生成式人工智能模型訓(xùn)練合規(guī)技術(shù)規(guī)范
- 足球場地基板施工方案
- 黑龍江草莓大棚施工方案
- 橋梁直角墊板施工方案
- 新生兒腸扭轉(zhuǎn)護(hù)理查房課件
- 小學(xué)數(shù)學(xué)-水中浸物問題-完整版題型訓(xùn)練30題-帶答案
- 培養(yǎng)正念提升幸福感
- 追悼會流程方案
- 公司制度制定執(zhí)行等情況匯報(bào)范文
- 營銷員壓力管理
- 淺議鄉(xiāng)鎮(zhèn)機(jī)構(gòu)改革的難點(diǎn)與對策
- 二年級下冊口算題1000題大全
- 聚酯生產(chǎn)技術(shù) 聚酯聚合原理
- GB 4806.7-2023食品安全國家標(biāo)準(zhǔn)食品接觸用塑料材料及制品
- 中職統(tǒng)編《金屬材料與熱處理》系列課件 第1章 金屬的結(jié)構(gòu)與結(jié)晶(動(dòng)畫) 云天系列課件
評論
0/150
提交評論