《JDBC數(shù)據(jù)庫連接javaEE.ppt》由會員分享,可在線閱讀,更多相關(guān)《JDBC數(shù)據(jù)庫連接javaEE.ppt(72頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、JDBC,1,JDBC基礎(chǔ),2,JDBC基礎(chǔ),JDBC的全稱是 Java Database Connectivity,即Java數(shù)據(jù)庫連接,它是一種可以執(zhí)行SQL語句的Java API。 Java API是接口,其實現(xiàn)類由各數(shù)據(jù)庫廠商提供實現(xiàn),這些實現(xiàn)類就是“驅(qū)動程序”。 正是通過JDBC驅(qū)動的轉(zhuǎn)換,才使得使用相同JDBC API編寫的程序,可以在不同的數(shù)據(jù)庫系統(tǒng)上運行良好。,3,JDBC基礎(chǔ),JDBC編程步驟(一):,4,驅(qū)動類對應(yīng)的字符串: MySql:com.mysql.jdbc.Driver SQLServer:com.microsoft.sqlserver.jdbc
2、.SQLServerDriver 數(shù)據(jù)庫URL: MySql:jdbc:mysql://127.0.0.1:3306/sms SQLServer:jdbc:sqlserver://127.0.0.1:1433;DatabaseName=sms,JDBC基礎(chǔ),JDBC編程步驟(二):,5,注意:以上整個示例代碼,應(yīng)該使用try catch finally釋放資源,JDBC基礎(chǔ),JDBC_增刪改操作:,6,JDBC基礎(chǔ),JDBC_前幾頁PPT代碼分析: Url、User、Password直接在代碼中定義,如果數(shù)據(jù)庫服務(wù)器稍作變動,怎么辦? 一個項目基本針對一個底層數(shù)據(jù)庫,難道每次操作數(shù)
3、據(jù)庫,都要注冊一次驅(qū)動程序嘛?是否可以只注冊一次? 獲取數(shù)據(jù)庫連接時,每次都需要Url、User、Password,一旦改動其中一個數(shù)據(jù),意味著要修改所有此處的代碼。 釋放資源,每次數(shù)據(jù)庫操作后,都需要釋放資源,難道每次操作后都要寫三次try close catch代碼嘛?,7,JDBC基礎(chǔ),JDBC_封裝升級(一):,8,JDBC基礎(chǔ),JDBC_封裝升級(二):,9,JDBC基礎(chǔ),JDBC_封裝升級(三):,10,JDBC基礎(chǔ),JDBC_封裝升級(四):,11,JDBC基礎(chǔ),Statement的缺點: 同樣的SQL語句,每次都要發(fā)送,不能進(jìn)行有效的緩存。 拼接SQL字符串非常容易出現(xiàn)錯誤。
4、不能防止惡意數(shù)據(jù),易產(chǎn)生SQL注入。 升級后的新接口PreparedStatement(推薦): 預(yù)編譯SQL語句,并進(jìn)行有效的緩存,性能更好。 允許使用問號占位符參數(shù),并且該參數(shù)必須獲得值后才可以執(zhí)行。 無需拼接SQL語句。,12,SQL注入:“...where name=” + “or 1=1 or” + “and password=”+ “”+ “”,問號占位符參數(shù):INSERT INTO User(id,name,age,birthday) VALUES(?,?,?,?);,JDBC基礎(chǔ),JDBC_ PreparedStatement(一):,13,JDBC基礎(chǔ),JDBC_ Prepa
5、redStatement(二):,14,JDBC基礎(chǔ),JDBC_疑難雜癥: 獲取插入記錄后的自增長值 日期類型(datetime) 文本信息(text):varchar的最大長度為65535左右 二進(jìn)制文件(blob),15,JDBC基礎(chǔ),JDBC_疑難雜癥(一):自增長值、日期(寫入),16,JDBC基礎(chǔ),JDBC_疑難雜癥(一):自增長值、日期(讀?。?17,JDBC基礎(chǔ),JDBC_疑難雜癥(二):文本信息text(寫入),18,JDBC基礎(chǔ),JDBC_疑難雜癥(二):文本信息text(讀?。?19,JDBC基礎(chǔ),JDBC_疑難雜癥(三):二進(jìn)制文件(寫入),20,JDBC基礎(chǔ),JDBC_
6、疑難雜癥(三):二進(jìn)制文件(讀?。?21,JDBC基礎(chǔ),JDBC_事務(wù)處理: 事務(wù)處理就是當(dāng)執(zhí)行多個SQL指令時,如果因為某個原因使其中一條指令執(zhí)行有錯誤,則取消先前執(zhí)行過的所有指令。它的作用是保證各項操作的一致性和完整性。 JDBC事務(wù)是通過Connection對象進(jìn)行控制的。其提供了兩種事務(wù): 自動提交模式:系統(tǒng)默認(rèn),每項數(shù)據(jù)庫操作成功后,系統(tǒng)會自動提交。 手工提交模式:首先必須取消自動提交模式,然后通過commit()和rollback()提交和回滾事務(wù)。,22,JDBC基礎(chǔ),JDBC_事務(wù)處理:,23,JDBC基礎(chǔ),JDBC提供:DatabaseMetaData封裝數(shù)據(jù)庫相關(guān)信
7、息,24,JDBC基礎(chǔ),JDBC提供:ResultSetMetaData封裝結(jié)果集相關(guān)信息,25,連接池,26,連接池,JDBC數(shù)據(jù)庫連接的建立及關(guān)閉是極耗系統(tǒng)資源的操作。之前獲得的數(shù)據(jù)庫連接,一個數(shù)據(jù)庫連接對象均為一個物理數(shù)據(jù)庫連接,每次操作都打開一個物理連接,使用完后立即關(guān)閉連接。頻繁地打開、關(guān)閉連接將造成系統(tǒng)性能低下。 數(shù)據(jù)庫連接池的解決方案是:當(dāng)應(yīng)用程序啟動時,系統(tǒng)主動建立足夠的數(shù)據(jù)庫連接,并將這些連接組成一個連接池。每次應(yīng)用程序請求數(shù)據(jù)庫連接時,無須重新打開連接,而是從池中取出已有的連接使用,使用完后,不再關(guān)閉數(shù)據(jù)庫連接,而是直接將連接歸還給連接池。,27,連接池,數(shù)據(jù)庫連接池
8、基本工作原理:,28,連接池,自定義數(shù)據(jù)庫連接池(一):,29,連接池,自定義數(shù)據(jù)庫連接池(二):,30,連接池,自定義數(shù)據(jù)庫連接池(三):,31,連接池,自定義數(shù)據(jù)庫連接池(四):,32,連接池,自定義數(shù)據(jù)庫連接池(五):,33,連接池,非連接池與連接池對比(一):,34,連接池,非連接池與連接池對比(二):,35,連接池,開源的數(shù)據(jù)源(DBCP)(一):,36,連接池,開源的數(shù)據(jù)源(DBCP)(二):,37,連接池,開源的數(shù)據(jù)源(C3P0)(一):,38,連接池,開源的數(shù)據(jù)源( C3P0 )(二):,39,JDBC常見操作(重點),40,JDBC常見操作,基于數(shù)據(jù)庫的信息系統(tǒng),每張數(shù)據(jù)表基
9、本都包含如下操作(函數(shù)): 新增記錄、修改記錄、刪除記錄 根據(jù)主鍵獲取單個記錄 根據(jù)記錄數(shù) 獲取所有記錄 獲取分頁記錄 PS:以上僅為基本操作,實際中還需包含其它復(fù)雜操作。 以上操作中,數(shù)據(jù)的傳入傳出都以對象形式,所有每張數(shù)據(jù)表對應(yīng)一個實體類(列名對應(yīng)屬性名),41,JDBC常見操作,后續(xù)以選課系統(tǒng)sms數(shù)據(jù)庫中的class數(shù)據(jù)表作為操作范例:,42,PS:數(shù)據(jù)表的列與實體類的屬性一一對應(yīng),JDBC常見操作,純JDBC操作(一):,43,JDBC常見操作,純JDBC操作(二):,44,JDBC常見操作,純JDBC操作(三):,45,JDBC常見操作,純JDBC操作(四):,46,JDBC常見操
10、作,純JDBC操作(五):,47,JDBC常見操作,純JDBC操作(六):,48,JDBC常見操作,純JDBC操作(七):,49,JDBC常見操作,純JDBC操作(八):,50,JDBC常見操作,以上全部操作中,太多的代碼重復(fù),如下: 每次都要獲取Connection 每次都要創(chuàng)建PreparedStatement 每次都要設(shè)置參數(shù)值 每次都要執(zhí)行Query或Update操作 每次都要關(guān)閉數(shù)據(jù)庫連接 因此可以進(jìn)行代碼封裝重構(gòu),所以市面出現(xiàn)了眾多封裝后的JDBC操作工具類,此PPT中使用 Apache DBUtils 注意:對于Apache DBUtils,要求JavaBean(實體類)的屬性名
11、必須與結(jié)果集中的列名一一對應(yīng)?。?!,51,JDBC常見操作,Apache DBUtils操作(一):,52,JDBC常見操作,Apache DBUtils操作(二):,53,JDBC常見操作,Apache DBUtils操作(三):,54,JDBC常見操作,Apache DBUtils操作(四):,55,JDBC常見操作,Apache DBUtils操作(五):,56,JDBC常見操作,Apache DBUtils操作(六):,57,DAO設(shè)計模式,58,DAO設(shè)計模式,Java EE架構(gòu)大致分為如下幾層: Domain Object(領(lǐng)域?qū)ο螅樱捍藢佑上盗械腜OJO(Plain Old J
12、ava Object,普通的、傳統(tǒng)的Java對象)組成,這些對象是該系統(tǒng)的Domain Object,往往包含了各自所需要實現(xiàn)的業(yè)務(wù)邏輯方法。 DAO(Data Access Object,數(shù)據(jù)訪問對象)層:此層由系列的DAO組件組成,這些DAO實現(xiàn)了對數(shù)據(jù)庫的創(chuàng)建、查詢、更新和刪除(CRUD)等原子操作。 業(yè)務(wù)邏輯層:此層由系列的業(yè)務(wù)對象組成,這些業(yè)務(wù)邏輯對象實現(xiàn)了系統(tǒng)所需要的業(yè)務(wù)邏輯方法。這些業(yè)務(wù)邏輯方法可能僅僅用于暴露DomainObject對象所實現(xiàn)的業(yè)務(wù)邏輯方法,也可能是依賴DAO組件實現(xiàn)的業(yè)務(wù)邏輯方法。 控制器層:此層由系列控制器組成,這些控制器用于攔截用戶請求,并調(diào)用業(yè)務(wù)邏輯組件
13、的業(yè)務(wù)邏輯方法,處理用戶請求,并根據(jù)處理結(jié)果轉(zhuǎn)發(fā)到不同的表現(xiàn)層組件。 表現(xiàn)層:此層由系列的JSP頁面、Velocity頁面、PDF文檔視圖組件組成。此層負(fù)責(zé)收集用戶請求,并將顯示處理結(jié)果。,59,DAO設(shè)計模式,大致上,Java EE 應(yīng)用的架構(gòu)如圖所示:,60,Model:對應(yīng)數(shù)據(jù)庫表的實體類(屬性與表中字段對應(yīng)),XxDao:接口,定義對XX表的“增刪改查”方法名 XxDaoImpl:對應(yīng)接口的實現(xiàn)類,針對JDBC或Hibernate等的實現(xiàn),XxService:接口,實現(xiàn)業(yè)務(wù)邏輯,定義實現(xiàn)系統(tǒng)功能的方法名 XxServiceImpl:對應(yīng)接口的實現(xiàn)類,調(diào)用Dao中的方法,外加某些業(yè)務(wù)邏輯
14、判斷,DAO設(shè)計模式,DAO實現(xiàn)(一):Model,61,DAO設(shè)計模式,DAO實現(xiàn)(二):Dao,62,DAO設(shè)計模式,DAO實現(xiàn)(三):JdbcUtil,63,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(一),64,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(二),65,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(三),66,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(四),67,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(五),68,DAO設(shè)計模式,DAO實現(xiàn)(四):DaoImpl(六),69,DAO設(shè)計模式,DAO實現(xiàn)(五):Main驗證(一),70,DAO設(shè)計模式,DAO實現(xiàn)(五):Main驗證(二),71,答疑,Q & A,72,