傳智播客Jdbc1方立勛_第1頁(yè)
傳智播客Jdbc1方立勛_第2頁(yè)
傳智播客Jdbc1方立勛_第3頁(yè)
傳智播客Jdbc1方立勛_第4頁(yè)
傳智播客Jdbc1方立勛_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

JDBC開發(fā)講師:1Tip:JDBC簡(jiǎn)介數(shù)據(jù)庫(kù)驅(qū)動(dòng)SUN公司為統(tǒng)一對(duì)數(shù)據(jù)庫(kù)的操作,定義了一套Java操作數(shù)據(jù)庫(kù)的規(guī)范,稱之為JDBC。MySQLOracleMySQL驅(qū)動(dòng)Oracle驅(qū)動(dòng)應(yīng)用程序MySQLOracleMySQL驅(qū)動(dòng)Oracle驅(qū)動(dòng)應(yīng)用程序JDBC2Tip:JDBC簡(jiǎn)介JDBC全稱為:JavaDataBaseConnectivity(java數(shù)據(jù)庫(kù)連接),它主要由接口組成。組成JDBC的2個(gè)包:

java.sql

javax.sql開發(fā)JDBC應(yīng)用需要以上2個(gè)包的支持外,還需要導(dǎo)入相應(yīng)JDBC的數(shù)據(jù)庫(kù)實(shí)現(xiàn)(即數(shù)據(jù)庫(kù)驅(qū)動(dòng))。3Tip:第一個(gè)JDBC程序編寫一個(gè)程序,這個(gè)程序從user表中讀取數(shù)據(jù),并打印在命令行窗口中。 一、搭建實(shí)驗(yàn)環(huán)境: 1、在mysql中創(chuàng)建一個(gè)庫(kù),并創(chuàng)建user表和插入表的數(shù)據(jù)。 2、新建一個(gè)Java工程,并導(dǎo)入數(shù)據(jù)驅(qū)動(dòng)。二、編寫程序,在程序中加載數(shù)據(jù)庫(kù)驅(qū)動(dòng) DriverManager.registerDriver(Driver

driver)三、建立連接(Connection) Connectionconn=DriverManager.getConnection(url,user,pass);

四、創(chuàng)建用于向數(shù)據(jù)庫(kù)發(fā)送SQL的Statement對(duì)象,并發(fā)送sql Statementst=conn.createStatement(); ResultSetrs=st.excuteQuery(sql);五、從代表結(jié)果集的ResultSet中取出數(shù)據(jù),打印到命令行窗口六、斷開與數(shù)據(jù)庫(kù)的連接,并釋放相關(guān)資源4Tip:程序詳解—DriverManagerJdbc程序中的DriverManager用于加載驅(qū)動(dòng),并創(chuàng)建與數(shù)據(jù)庫(kù)的鏈接,這個(gè)API的常用方法:DriverManager.registerDriver(newDriver()),注意:在實(shí)際開發(fā)中,并不推薦采用這個(gè)方法注冊(cè)驅(qū)動(dòng)。查看Driver的源代碼可以看到,如果采用此種方式,會(huì)導(dǎo)致驅(qū)動(dòng)程序加載兩次,也就是在內(nèi)存中會(huì)有兩個(gè)Driver對(duì)象。推薦方式:Class.forName(“com.mysql.jdbc.Driver”);采用此種方式不會(huì)導(dǎo)致驅(qū)動(dòng)對(duì)象在內(nèi)存中重復(fù)出現(xiàn),并且采用此種方式,程序僅僅只需要一個(gè)字符串,不需要import驅(qū)動(dòng)的API,這樣可使程序不依賴具體的驅(qū)動(dòng),使程序的靈活性更高。DriverManager.getConnection(url,user,password),根據(jù)url獲取數(shù)據(jù)庫(kù)的鏈接。5Tip:數(shù)據(jù)庫(kù)URL常用數(shù)據(jù)庫(kù)URL地址的寫法:Oracle—jdbc:oracle:thin:@localhost:1521:sidSqlServer—jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sidMySql—jdbc:mysql://localhost:3306/sidMysql的url地址的簡(jiǎn)寫形式:jdbc:mysql:///sid常用屬性:useUnicode=true&characterEncoding=UTF-8URL用于標(biāo)識(shí)數(shù)據(jù)庫(kù)的位置,程序員通過URL地址告訴JDBC程序連接哪個(gè)數(shù)據(jù)庫(kù),URL的寫法為:jdbc:mysql:[]//localhost:3306/test?參數(shù)名:參數(shù)值協(xié)議子協(xié)議主機(jī):端口數(shù)據(jù)庫(kù)6Tip:程序詳解—ConnectionJdbc程序中的Connection,它用于代表數(shù)據(jù)庫(kù)的鏈接,Collection是數(shù)據(jù)庫(kù)編程中最重要的一個(gè)對(duì)象,客戶端與數(shù)據(jù)庫(kù)所有交互都是通過connection對(duì)象完成的,這個(gè)對(duì)象的常用方法:createStatement():創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送sql的statement對(duì)象。prepareStatement(sql):創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送預(yù)編譯sql的PrepareSatement對(duì)象。prepareCall(sql):創(chuàng)建執(zhí)行存儲(chǔ)過程的callableStatement對(duì)象。setAutoCommit(boolean

autoCommit):設(shè)置事務(wù)是否自動(dòng)提交。commit():在鏈接上提交事務(wù)。rollback():在此鏈接上回滾事務(wù)。7Tip:程序詳解—StatementJdbc程序中的Statement對(duì)象用于向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,Statement對(duì)象常用方法:execute(Stringsql):用于向數(shù)據(jù)庫(kù)發(fā)送任意sql語(yǔ)句executeQuery(String

sql):只能向數(shù)據(jù)發(fā)送查詢語(yǔ)句。executeUpdate(String

sql):只能向數(shù)據(jù)庫(kù)發(fā)送insert、update或delete語(yǔ)句addBatch(String

sql):把多條sql語(yǔ)句放到一個(gè)批處理中。executeBatch():向數(shù)據(jù)庫(kù)發(fā)送一批sql語(yǔ)句執(zhí)行。

8Tip:程序詳解—ResultSetJdbc程序中的ResultSet用于代表Sql語(yǔ)句的執(zhí)行結(jié)果。Resultset封裝執(zhí)行結(jié)果時(shí),采用的類似于表格的方式。ResultSet對(duì)象維護(hù)了一個(gè)指向表格數(shù)據(jù)行的游標(biāo),初始的時(shí)候,游標(biāo)在第一行之前,調(diào)用ResultSet.next()方法,可以使游標(biāo)指向具體的數(shù)據(jù)行,進(jìn)行調(diào)用方法獲取該行的數(shù)據(jù)。ResultSet既然用于封裝執(zhí)行結(jié)果的,所以該對(duì)象提供的都是用于獲取數(shù)據(jù)的get方法:獲取任意類型的數(shù)據(jù)getObject(intindex)getObject(stringcolumnName)獲取指定類型的數(shù)據(jù),例如:getString(intindex)getString(StringcolumnName)提問:數(shù)據(jù)庫(kù)中列的類型是varchar,獲取該列的數(shù)據(jù)調(diào)用什么方法?Int類型呢?bigInt類型呢?Boolean類型?9Tip:常用數(shù)據(jù)類型轉(zhuǎn)換表Jdbc對(duì)應(yīng)方法返回類型getBoolean()BooleangetByte()BytegetShort()ShortgetInt()IntgetLong()LonggetString()StringgetClobgetBlob()ClobBlobgetDate()java.sql.DategetTime()java.sql.TimegetTimestamp()java.sql.TimestampSQL類型BITTINYINTSMALLINTIntBIGINTCHAR,VARCHAR,LONGVARCHARText(clob)BlobDATETIMETIMESTAMP10Tip:程序詳解—ResultSetResultSet還提供了對(duì)結(jié)果集進(jìn)行滾動(dòng)的方法:next():移動(dòng)到下一行Previous():移動(dòng)到前一行absolute(introw):移動(dòng)到指定行beforeFirst():移動(dòng)resultSet的最前面。afterLast():移動(dòng)到resultSet的最后面。11Tip:程序詳解—釋放資源Jdbc程序運(yùn)行完后,切記要釋放程序在運(yùn)行過程中,創(chuàng)建的那些與數(shù)據(jù)庫(kù)進(jìn)行交互的對(duì)象,這些對(duì)象通常是ResultSet,Statement和Connection對(duì)象。特別是Connection對(duì)象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時(shí)、正確的關(guān)閉,極易導(dǎo)致系統(tǒng)宕機(jī)。Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放。為確保資源釋放代碼能運(yùn)行,資源釋放代碼也一定要放在finally語(yǔ)句中。12Tip:使用JDBC對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUDJdbc中的statement對(duì)象用于向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,想完成對(duì)數(shù)據(jù)庫(kù)的增刪改查,只需要通過這個(gè)對(duì)象向數(shù)據(jù)庫(kù)發(fā)送增刪改查語(yǔ)句即可。Statement對(duì)象的executeUpdate方法,用于向數(shù)據(jù)庫(kù)發(fā)送增、刪、改的sql語(yǔ)句,executeUpdate執(zhí)行完后,將會(huì)返回一個(gè)整數(shù)(即增刪改語(yǔ)句導(dǎo)致了數(shù)據(jù)庫(kù)幾行數(shù)據(jù)發(fā)生了變化)。Statement.executeQuery方法用于向數(shù)據(jù)庫(kù)發(fā)送查詢語(yǔ)句,executeQuery方法返回代表查詢結(jié)果的ResultSet對(duì)象。練習(xí):編寫程序?qū)ser表進(jìn)行增刪改查操作。練習(xí):編寫工具類簡(jiǎn)化CRUD操作。(異常暫不處理)13Tip:CRUD操作-create使用executeUpdate(Stringsql)方法完成數(shù)據(jù)添加操作,示例操作: Statementst=conn.createStatement(); Stringsql="insertintouser(….)values(…..)"; intnum=st.executeUpdate(sql); if(num>0){ System.out.println("插入成功?。?!"); }14Tip:CRUD操作-updata使用executeUpdate(Stringsql)方法完成數(shù)據(jù)修改操作,示例操作: Statementst=conn.createStatement(); Stringsql=“updateusersetname=‘’wherename=‘’"; intnum=st.executeUpdate(sql); if(num>0){ System.out.println(“修改成功?。?!"); }15Tip:CRUD操作-delete使用executeUpdate(Stringsql)方法完成數(shù)據(jù)刪除操作,示例操作: Statementst=conn.createStatement(); Stringsql=“deletefromuserwhereid=1; intnum=st.executeUpdate(sql); if(num>0){ System.out.println(“刪除成功?。?!"); }16Tip:CRUD操作-read使用executeQuery(Stringsql)方法完成數(shù)據(jù)查詢操作,示例操作: Statementst=conn.createStatement(); Stringsql=“select*fromuserwhereid=1; ResultSetrs=st.executeUpdate(sql); while(rs.next()){ //根據(jù)獲取列的數(shù)據(jù)類型,分別調(diào)用rs的相應(yīng)方法 //映射到j(luò)ava對(duì)象中 }17Tip:實(shí)例練習(xí)—用戶注冊(cè)和登陸改寫前面講解的用戶注冊(cè)和登陸案例,實(shí)現(xiàn)如下需求:1、把xml換成數(shù)據(jù)庫(kù),重寫UserDao。2、定義DAO接口,并定義Dao工廠,實(shí)現(xiàn)web層和dao層的解耦。3、自定義dao異常。4、防范sql注入攻擊SQL注入是用戶利用某些系統(tǒng)沒有對(duì)輸入數(shù)據(jù)進(jìn)行充分的檢查,從而進(jìn)行惡意破壞的行為。1、statement存在sql注入攻擊問題,例如登陸用戶名采用'or1=1orname=‘2、防范SQL注入,需要采用PreparedStatement取代Statement。18Tip:PreparedStatementPreperedStatement是Statement的孩子,它的實(shí)例對(duì)象可以通過調(diào)用Connection.preparedStatement()方法獲得,相對(duì)于Statement對(duì)象而言:PreperedStatement可以避免SQL注入的問題。Statement會(huì)使數(shù)據(jù)庫(kù)頻繁編譯SQL,可能造成數(shù)據(jù)庫(kù)緩沖區(qū)溢出。PreparedStatement可對(duì)SQL進(jìn)行預(yù)編譯,從而提高數(shù)據(jù)庫(kù)的執(zhí)行效率。并且PreperedStatement對(duì)于sql中的參數(shù),允許使用占位符的形式進(jìn)行替換,簡(jiǎn)化sql語(yǔ)句的編寫。練習(xí):使用PreparedStatement改寫UserDao19Tip:JDBC綜合練習(xí)-客戶管理字段名說明類型Id編號(hào)varchar(20)name客戶姓名varchar(20)sex性名varchar(4)birthday生日datecellphone手機(jī)varchar(20)Email電子郵件varchar(40)preference客戶愛好varchar(100)type客戶類型varchar(40)Description備注varchar(255)創(chuàng)立如下數(shù)據(jù)庫(kù)表customer,并完成web下的crud操作20Tip:數(shù)據(jù)庫(kù)分頁(yè)MySQL分頁(yè)的實(shí)現(xiàn):Select*fromtablelimitM,NM:記錄開始索引位置N:取多少條記

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論