楊廷發(fā),蘭全祥
(攀枝花學(xué)院,四川 攀枝花 617000)
JDBC(Java DataBase Connectivity,Java數(shù)據(jù)庫(kù)連接)是Java的重要組成部分,也是Java程序訪問(wèn)數(shù)據(jù)庫(kù)的主要方式[1].在系統(tǒng)開(kāi)發(fā)中,不論是B/S還是C/S的系統(tǒng)都要進(jìn)行數(shù)據(jù)庫(kù)連接,JDBC可以實(shí)現(xiàn)系統(tǒng)和不同數(shù)據(jù)庫(kù)之間的連接,是Java程序設(shè)計(jì)課程重點(diǎn)講解的內(nèi)容之一.但現(xiàn)有的JDBC教學(xué)主要采用的是認(rèn)知主義學(xué)習(xí)理論(理論教學(xué))和行為主義學(xué)習(xí)理論(實(shí)踐教學(xué)),學(xué)生在學(xué)習(xí)過(guò)程中大多處于被動(dòng)學(xué)習(xí)狀態(tài),學(xué)習(xí)效果較差.基于問(wèn)題解決的教學(xué)方法根據(jù)《華盛頓協(xié)議》關(guān)于復(fù)雜工程問(wèn)題特征的界定、解決復(fù)雜工程問(wèn)題能力的要求以及工程實(shí)踐對(duì)高等工程教育人才培養(yǎng)提出的要求對(duì)學(xué)生復(fù)雜工程問(wèn)題解決能力進(jìn)行培養(yǎng)[2].基于問(wèn)題解決的教學(xué)方法將理論學(xué)習(xí)、實(shí)踐操作有機(jī)地結(jié)合在一起,采用問(wèn)題驅(qū)動(dòng)的方式將知識(shí)融入實(shí)際工程應(yīng)用當(dāng)中,有利于從根本上理解問(wèn)題、解決問(wèn)題,培養(yǎng)學(xué)生的創(chuàng)新意識(shí),促進(jìn)學(xué)生問(wèn)題意識(shí)的培養(yǎng),探索精神和創(chuàng)新能力的形成.另外,以基于問(wèn)題解決的教學(xué)方法來(lái)構(gòu)建JDBC的知識(shí)體系,有助于學(xué)生對(duì)Java企業(yè)級(jí)開(kāi)發(fā)框架的理解,如Hibernate、MyBatis等.
通過(guò)對(duì)部分高校的課程教學(xué)大綱以及一些在線課程的了解,大部分高校和在線課程均會(huì)講解JDBC的概念、JDBC的重要接口、JDBC的開(kāi)發(fā)步驟等,少部分課程在講解JDBC的時(shí)候會(huì)提及到數(shù)據(jù)庫(kù)優(yōu)化(如數(shù)據(jù)庫(kù)連接池、DAO、配置文件、數(shù)據(jù)庫(kù)工具類等).
在JDBC的概念部分,重點(diǎn)講解JDBC是一些用Java語(yǔ)言編寫的類和接口的集合,是進(jìn)行數(shù)據(jù)庫(kù)操作的Java API,是Java程序訪問(wèn)數(shù)據(jù)庫(kù)的一種規(guī)范,強(qiáng)調(diào)JDBC作為數(shù)據(jù)庫(kù)操作接口的作用.
在講解JDBC的結(jié)構(gòu)部分時(shí),則應(yīng)突出JDBC的分層結(jié)構(gòu),使學(xué)生對(duì)JDBC的結(jié)構(gòu)有清晰、明確的認(rèn)識(shí),為后續(xù)知識(shí)講解奠定基礎(chǔ).JDBC的結(jié)構(gòu)如圖1所示.
圖1 JDBC結(jié)構(gòu)
JDBC API是JDBC知識(shí)的核心,只有對(duì)API中的方法和作用有較為清晰的認(rèn)識(shí)和學(xué)習(xí),學(xué)生才能進(jìn)行Java數(shù)據(jù)庫(kù)開(kāi)發(fā).在JDBC API講解時(shí),應(yīng)重點(diǎn)講授 DriverManager、Connection、Statement、PreparedStatement、ResultSet等類和接口,同時(shí)對(duì)這些類和接口中的常用方法進(jìn)行講解.
2.2.1 DriverManager
DriverManager主要是用于管理已加載的驅(qū)動(dòng)程序,如各種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序.在講解Driver-Manager類時(shí)應(yīng)強(qiáng)調(diào)到此類是JDBC開(kāi)發(fā)的前序步驟,并重點(diǎn)講解Class.forName()方法和DriverManager.getConnection()方法.
在方法的講解中應(yīng)強(qiáng)調(diào)Class.forName()利用了Java的反射機(jī)制,在進(jìn)行驅(qū)動(dòng)注冊(cè)的時(shí)候?qū)伋鯟lassNotFoundException 異常;getConnection()方法是DriverManager類的靜態(tài)方法,可通過(guò)類名直接調(diào)用,在獲得連接的時(shí)候可能會(huì)SQLException異常.
2.2.2 Connection
Connection表示一個(gè)和數(shù)據(jù)庫(kù)的連接,在Connection接口中可以創(chuàng)建用于執(zhí)行SQL語(yǔ)句的命令對(duì)象.在講解Connection接口時(shí)應(yīng)強(qiáng)調(diào)此接口用于創(chuàng)建命令對(duì)象的方法,如創(chuàng)建Statement、Prepared-Statement、CallableStatement命令對(duì)象,并講解 close()方法.在講解close()方法的時(shí)候應(yīng)注意訓(xùn)練學(xué)生“有借有還”的習(xí)慣,使用了資源一定要釋放.
2.2.3 Statement
Statement用于執(zhí)行靜態(tài)SQL語(yǔ)句并返回其執(zhí)行結(jié)果.在講解Statement接口時(shí),應(yīng)重點(diǎn)講解Statement執(zhí)行SQL語(yǔ)句的方法,強(qiáng)調(diào)不同的SQL語(yǔ)句要選用不同的執(zhí)行方法.接口中executeQuery()方法主要用于執(zhí)行查詢類SQL語(yǔ)句,其返回類型為結(jié)果集ResultSet;executeUpdate()方法主要用于執(zhí)行更新類SQL語(yǔ)句,其返回類型為整型.
2.2.4 PreparedStatement
PreparedStatement表示預(yù)編譯的命令對(duì)象.在講解過(guò)程中應(yīng)強(qiáng)調(diào)PreparedStatement接口與Statement接口的區(qū)別,包括它們的優(yōu)缺點(diǎn)、使用區(qū)別以及適用情況.重點(diǎn)講解PreparedStatement接口的易讀性、高效性、安全性.
Statement命令對(duì)象在執(zhí)行帶參數(shù)的SQL語(yǔ)句時(shí)容易留下SQL注入式攻擊的隱患,Prepared-Statement能夠有效防止該攻擊手段,因此為了進(jìn)一步結(jié)合工程應(yīng)用實(shí)踐,可以適當(dāng)講解部分網(wǎng)絡(luò)安全知識(shí).
2.2.5 ResultSet
ResultSet用于表示執(zhí)行查詢語(yǔ)句后得到的結(jié)果.在講解ResultSet()接口的時(shí)候,應(yīng)重點(diǎn)講解如何遍歷結(jié)果集,如何將查詢的數(shù)據(jù)轉(zhuǎn)化為Java集合.在講解此部分時(shí)可利用圖示的方式加深學(xué)生對(duì)于結(jié)果集處理的印象.
了解并學(xué)會(huì)JDBC的開(kāi)發(fā)步驟有助于學(xué)生快速、準(zhǔn)確地進(jìn)行Java數(shù)據(jù)庫(kù)開(kāi)發(fā).在JDBC開(kāi)發(fā)步驟的講解過(guò)程中,一般將開(kāi)發(fā)步驟分為注冊(cè)驅(qū)動(dòng)并建立連接、發(fā)送命令并處理結(jié)果以及釋放資源三個(gè)步驟.
在JDBC開(kāi)發(fā)步驟的教學(xué)中應(yīng)重點(diǎn)講解JDBC每個(gè)步驟之間的聯(lián)系,加深學(xué)生對(duì)于開(kāi)發(fā)步驟的印象,并強(qiáng)調(diào)最后應(yīng)當(dāng)對(duì)所有資源進(jìn)行釋放.
JDBC優(yōu)化部分作為JDBC的進(jìn)階學(xué)習(xí),有助于培養(yǎng)學(xué)生對(duì)于復(fù)雜工程問(wèn)題的解決能力[3].JDBC的優(yōu)化部分可以講解數(shù)據(jù)庫(kù)連接池、數(shù)據(jù)庫(kù)配置信息讀取、封裝數(shù)據(jù)庫(kù)工具類、DAO、工廠設(shè)計(jì)模式等內(nèi)容.
數(shù)據(jù)庫(kù)連接池的講解有助于提高學(xué)生對(duì)于程序優(yōu)化的能力;數(shù)據(jù)庫(kù)配置信息的讀取有助于培養(yǎng)學(xué)生“高內(nèi)聚,低耦合”的編程思維;封裝數(shù)據(jù)庫(kù)工具類有助于提高學(xué)生對(duì)程序復(fù)用的能力;DAO和設(shè)計(jì)模式有助于培養(yǎng)學(xué)生的模塊化設(shè)計(jì)思維.
各高校的Java相關(guān)課程體系都將JDBC部分納入了教學(xué)大綱,并要求學(xué)生系統(tǒng)地掌握J(rèn)DBC基礎(chǔ)知識(shí),能實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫(kù)開(kāi)發(fā),但在實(shí)際的教學(xué)過(guò)程中仍存在一些問(wèn)題需要解決.
3.1.1 內(nèi)容過(guò)于基礎(chǔ),無(wú)法與實(shí)際工程問(wèn)題相結(jié)合
由于學(xué)時(shí)和學(xué)生能力水平的限制,以教師為中心的教學(xué)法通常只講解JDBC的基礎(chǔ)部分,很少會(huì)講解到實(shí)際工程問(wèn)題的解決,如JDBC優(yōu)化部分.然而,簡(jiǎn)單、基礎(chǔ)的JDBC知識(shí)離實(shí)際的工程應(yīng)用還有很大的差距,容易造成“學(xué)”與“用”不能有機(jī)結(jié)合.
大多數(shù)情況下,教學(xué)大綱中只要求講解什么是JDBC,JDBC是用來(lái)做什么的,怎么用JDBC進(jìn)行開(kāi)發(fā).對(duì)原理性知識(shí)、本質(zhì)性問(wèn)題(如“為什么JDBC可以實(shí)現(xiàn)與不同數(shù)據(jù)庫(kù)進(jìn)行連接”,“為什么JDBC是一組類和接口”)等深層次問(wèn)題并不清楚.也就意味著大部分學(xué)生在學(xué)習(xí)的時(shí)候只知道是什么,而不知道為什么.
3.1.3 注重面向過(guò)程,忽視整體設(shè)計(jì)和工程需求
由于傳統(tǒng)教學(xué)法采用強(qiáng)化學(xué)習(xí)理論,不注重模塊化思想,因此在講解時(shí)將注重JDBC的實(shí)現(xiàn),而忽略JDBC在整個(gè)項(xiàng)目中扮演的角色;注重JDBC的實(shí)現(xiàn)過(guò)程,而忽略項(xiàng)目的整體設(shè)計(jì)以及架構(gòu).這對(duì)于培養(yǎng)學(xué)生解決復(fù)雜工程問(wèn)題是相當(dāng)不利的,學(xué)生將很難從單一問(wèn)題解決能力轉(zhuǎn)變?yōu)閺?fù)雜問(wèn)題解決的能力.
3.1.4 知識(shí)構(gòu)建零散,與后續(xù)課程知識(shí)分離
在高校的課程設(shè)置中,同一系列的課程之間是存在一定聯(lián)系的.但是在實(shí)際教學(xué)中,由于師資的不確定性,教學(xué)團(tuán)隊(duì)之間溝通的不及時(shí)性可能造成前后續(xù)課程不連貫,知識(shí)零散等問(wèn)題.
JDBC的后續(xù)課程包含Java EE、輕量級(jí)企業(yè)框架開(kāi)發(fā)等,這些課程中涉及到的Hibernate以及MyBatis等框架的設(shè)計(jì)思想如果能在JDBC課程中有所體現(xiàn),那對(duì)于學(xué)生后續(xù)課程的學(xué)習(xí)將有很大的幫助.
基于問(wèn)題解決的教學(xué)法是根據(jù)學(xué)習(xí)內(nèi)容設(shè)計(jì)問(wèn)題,通過(guò)解決問(wèn)題來(lái)獲得相應(yīng)的問(wèn)題圖示及相關(guān)的概念性理解[4].使用問(wèn)題解決教學(xué)法來(lái)講授JDBC內(nèi)容需要注意圍繞教學(xué)內(nèi)容和教學(xué)目標(biāo)的需要,要滿足復(fù)雜工程問(wèn)題的特征需要,同時(shí)問(wèn)題的復(fù)雜性和難度要從易到難、循序漸進(jìn)[5],以問(wèn)題為導(dǎo)向的JDBC教學(xué)運(yùn)行模型如圖2所示.
“十二五”期間,通遼市規(guī)劃建設(shè)800萬(wàn)畝旱澇保收、高產(chǎn)節(jié)水農(nóng)田,500萬(wàn)畝飼草料基地,100萬(wàn)畝設(shè)施農(nóng)業(yè),100萬(wàn)畝特色種植業(yè)基地,500萬(wàn)畝退耕還林還草工程,2000萬(wàn)頭只牲畜養(yǎng)殖業(yè)基地,實(shí)施百億斤糧食加工轉(zhuǎn)化工程,1000個(gè)嘎查村的新農(nóng)村、新牧區(qū)建設(shè)工程,每年轉(zhuǎn)移農(nóng)村牧區(qū)人口10萬(wàn)人,壓減3萬(wàn)眼機(jī)電井。
圖2 以問(wèn)題為導(dǎo)向的JDBC教學(xué)運(yùn)行模型
根據(jù)文獻(xiàn)[6]可以將問(wèn)題分為引導(dǎo)性問(wèn)題、分析性問(wèn)題、開(kāi)放性問(wèn)題,學(xué)生在解決這些問(wèn)題之后分別能達(dá)到理解和掌握、應(yīng)用于實(shí)踐、解決工程問(wèn)題的能力層級(jí).因此,在JDBC的教學(xué)中,可以將JDBC知識(shí)劃分到不同層級(jí),并采用不同的問(wèn)題設(shè)計(jì),如表1所示.
表1 JDBC教學(xué)問(wèn)題分層設(shè)計(jì)
基于問(wèn)題解決的JDBC教學(xué)方案實(shí)施可大致分為分工職責(zé)的確定、具體問(wèn)題的設(shè)計(jì)和方案實(shí)施.
3.3.1 分工職責(zé)
基于問(wèn)題解決的教學(xué)方法主要是以學(xué)生為中心進(jìn)行教學(xué).教師主要負(fù)責(zé)設(shè)計(jì)問(wèn)題、方向引導(dǎo)、技術(shù)指導(dǎo)和知識(shí)總結(jié)等,學(xué)生主要任務(wù)是根據(jù)教師設(shè)計(jì)的問(wèn)題進(jìn)行問(wèn)題分析、找到問(wèn)題的解決思路,并在教師的引導(dǎo)和技術(shù)指導(dǎo)下對(duì)解決方案進(jìn)行優(yōu)化和開(kāi)發(fā)實(shí)現(xiàn).教學(xué)方案中的分工職責(zé)如圖3所示.
圖3 教學(xué)方案中的分工與職責(zé)
基于問(wèn)題解決的JDBC教學(xué)方法各環(huán)節(jié)具體實(shí)施內(nèi)容如下:
①教師設(shè)計(jì)并給出需要解決的問(wèn)題,學(xué)生分析教師給出的問(wèn)題并設(shè)計(jì)解決方案;②教師在學(xué)生提出解決方案時(shí)提供方向引導(dǎo),指導(dǎo)學(xué)生進(jìn)行方案優(yōu)化;③在對(duì)最終方案進(jìn)行實(shí)現(xiàn)時(shí),教師應(yīng)提供相應(yīng)的技術(shù)指導(dǎo),如數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)、properties屬性文件的讀取以及DAO等設(shè)計(jì)模式的實(shí)現(xiàn)等;④通過(guò)具體實(shí)現(xiàn)解決了教師給出的問(wèn)題后,教師應(yīng)總結(jié)開(kāi)發(fā)中所用到的知識(shí),幫助學(xué)生對(duì)知識(shí)進(jìn)行固化.
3.3.2 具體問(wèn)題設(shè)計(jì)及實(shí)施
按照J(rèn)DBC知識(shí)體系及問(wèn)題分層模型,從教師視角對(duì)問(wèn)題設(shè)計(jì)、方向引導(dǎo)、技術(shù)指導(dǎo)及知識(shí)總結(jié)四個(gè)部分進(jìn)行探討.
①JDBC概念.問(wèn)題設(shè)計(jì):Java程序員在開(kāi)發(fā)程序的時(shí)候肯定希望自己的方法能適用于不同的數(shù)據(jù)庫(kù),不用重新學(xué)習(xí)新的數(shù)據(jù)庫(kù)連接方法,那么有什么辦法能夠辦到?
方向引導(dǎo):在Java中若想實(shí)現(xiàn)某一標(biāo)準(zhǔn)或規(guī)范,可以考慮使用接口.接口的本質(zhì)就是一種標(biāo)準(zhǔn).
技術(shù)指導(dǎo):無(wú)(理論學(xué)習(xí))
知識(shí)總結(jié):JDBC本質(zhì)上是一組Java的類和接口,用于提供一種訪問(wèn)數(shù)據(jù)庫(kù)的規(guī)范.
②JDBC API.為了達(dá)到較為良好的教學(xué)效果,建議將強(qiáng)化理論學(xué)習(xí)轉(zhuǎn)化為構(gòu)建主義學(xué)習(xí).因此,在講解JDBC API時(shí)可以與JDBC開(kāi)發(fā)步驟相結(jié)合,不單獨(dú)設(shè)計(jì)問(wèn)題.
③JDBC開(kāi)發(fā)步驟.問(wèn)題設(shè)計(jì):引用小品臺(tái)詞“將大象裝進(jìn)冰箱總共需要幾步?”,將經(jīng)典臺(tái)詞融入到JDBC開(kāi)發(fā)步驟中.
方向引導(dǎo):教師在做方向引導(dǎo)時(shí)應(yīng)注意培養(yǎng)學(xué)生知識(shí)遷移的能力,將SQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)比作“將大象裝進(jìn)冰箱”,進(jìn)而引導(dǎo)學(xué)生學(xué)習(xí)數(shù)據(jù)庫(kù)操作的三個(gè)重要步驟:注冊(cè)驅(qū)動(dòng)并創(chuàng)建連接、創(chuàng)建并執(zhí)行命令和釋放資源三步.
技術(shù)指導(dǎo):將JDBC API中的常用方法融入開(kāi)發(fā)步驟中,詳細(xì)講解注冊(cè)驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建命令、執(zhí)行命令、處理結(jié)果和釋放資源的技術(shù)實(shí)現(xiàn).
知識(shí)總結(jié):Java反射機(jī)制、DriverManager類、Connection 接口、Statement接口、PreparedStatement接口以及ResultSet接口等知識(shí).
④JDBC優(yōu)化.JDBC的優(yōu)化實(shí)際上是一系列的問(wèn)題,在此部分可以使用問(wèn)題迭代進(jìn)行講解,講授的內(nèi)容可以包含數(shù)據(jù)庫(kù)連接池、數(shù)據(jù)庫(kù)配置文件、封裝數(shù)據(jù)庫(kù)工具類、DAO、設(shè)計(jì)模式等.
問(wèn)題設(shè)計(jì):每次進(jìn)行數(shù)據(jù)庫(kù)操作都需要?jiǎng)?chuàng)建連接并釋放,降低了操作效率,如何解決?將數(shù)據(jù)庫(kù)配置信息寫入代碼中,如果需要修改配置信息,則需重新編譯項(xiàng)目,不利于維護(hù),如何解決?在協(xié)同項(xiàng)目開(kāi)發(fā)中,我們?nèi)绾未_保開(kāi)發(fā)人員對(duì)數(shù)據(jù)庫(kù)操作防范的一致性?如何增加程序的可維護(hù)性、可擴(kuò)展性?
方向引導(dǎo):引導(dǎo)學(xué)生學(xué)習(xí)數(shù)據(jù)庫(kù)連接池、數(shù)據(jù)庫(kù)配置文件、封裝數(shù)據(jù)庫(kù)工具類、DAO、設(shè)計(jì)模式等開(kāi)發(fā)技術(shù).
技術(shù)指導(dǎo):教師根據(jù)實(shí)際情況進(jìn)行指導(dǎo).
知識(shí)總結(jié):Java集合、properties屬性類、Java反射機(jī)制、函數(shù)重載和覆寫、接口、泛型編程以及序列化等知識(shí).
基于問(wèn)題解決的JDBC教學(xué)方法是以學(xué)生為中心的教學(xué)方法,通過(guò)構(gòu)建主義學(xué)習(xí)模式和研究型教學(xué)方法,將JDBC知識(shí)有機(jī)地整合在一起,增加了教學(xué)效果,提升了學(xué)生學(xué)習(xí)效率.除此之外,基于問(wèn)題解決的JDBC教學(xué)方法可提高學(xué)生的積極性,促使學(xué)生主動(dòng)學(xué)習(xí)JDBC的相關(guān)知識(shí);當(dāng)學(xué)生設(shè)計(jì)的問(wèn)題解決方案被采用并實(shí)現(xiàn)時(shí),學(xué)生將獲得成就感;在JDBC開(kāi)發(fā)步驟中,通過(guò)知識(shí)遷移把案例“將大象裝進(jìn)冰箱”比作實(shí)際的JDBC開(kāi)發(fā),能幫助學(xué)生掌握J(rèn)DBC的開(kāi)發(fā)步驟;采用螺旋式問(wèn)題設(shè)計(jì)方式,由淺入深逐步完善JDBC的知識(shí)體系;通過(guò)與實(shí)際工程問(wèn)題相關(guān)聯(lián),減小課程學(xué)習(xí)與實(shí)際工程應(yīng)用的差距;在JDBC優(yōu)化部分,通過(guò)問(wèn)題驅(qū)動(dòng)可以將大量的程序設(shè)計(jì)思維傳授給學(xué)生,為后期Java EE企業(yè)級(jí)開(kāi)發(fā)框架的學(xué)習(xí)奠定基礎(chǔ).
基于問(wèn)題解決的JDBC教學(xué)方法將認(rèn)知主義、行為主義、構(gòu)建主義學(xué)習(xí)理論有機(jī)地結(jié)合在一起,有利于提高學(xué)生解決問(wèn)題和后續(xù)自主研發(fā)的能力.通過(guò)設(shè)計(jì)問(wèn)題、方案設(shè)計(jì)和優(yōu)化、技術(shù)實(shí)現(xiàn)和知識(shí)總結(jié)固化將JDBC知識(shí)融入實(shí)際工程應(yīng)用中,不僅能提高學(xué)生的學(xué)習(xí)效率和學(xué)習(xí)效果,還能為后續(xù)Java EE企業(yè)級(jí)開(kāi)發(fā)框架的學(xué)習(xí)、模塊化程序設(shè)計(jì)思維的培養(yǎng)奠定基礎(chǔ).
赤峰學(xué)院學(xué)報(bào)·自然科學(xué)版2018年12期