第6章 Jdbc和HIBERNATE_第1頁
第6章 Jdbc和HIBERNATE_第2頁
第6章 Jdbc和HIBERNATE_第3頁
第6章 Jdbc和HIBERNATE_第4頁
第6章 Jdbc和HIBERNATE_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第6章 JDBC/Hibernate技術(jsh)河海大學(h hi d xu)文天學院7/19/20221共六十七頁本章(bn zhn)內容6.1 JDBC技術(jsh)6.2 JavaBean技術6.3 Hibernate技術7/19/20222共六十七頁6.1 JDBC技術(jsh) JDBC(Java Data Base Connectivity,Java數(shù)據庫連接),是Java應用程序連結數(shù)據庫、存取數(shù)據的一種機制(jzh),由一組用Java語言編寫的類和接口組成的API。常用接口:DriverManagerConnectionStatementPreparedStatementRe

2、sultSet存放位置:java.sql,javax.sql包。7/19/20223共六十七頁簡介(jin ji)應用程序、JDBC API、數(shù)據庫驅動(q dn)及數(shù)據庫之間的關系7/19/20224共六十七頁利用(lyng)JDBC操作數(shù)據庫加載JDBC驅動程序(只做一次)創(chuàng)建與數(shù)據庫的連接(Connection) 創(chuàng)建對象(Statement)執(zhí)行SQL語句(execute、executeUpdate、executeQuery)處理結果(ResultSet)釋放(shfng)資源借車確定行駛路線確定司機裝貨、拉貨過程卸貨還車7/19/20225共六十七頁1.加載數(shù)據庫驅動(q dn)通過

3、(tnggu)Class.forName(“”).newInstance();驅動類型(四種類型)SQL Server 2000的JDBC驅動類名: com.microsoft.jdbc.sqlserver.SQLServerDriverOracle的JDBC驅動類名: oracle.jdbc.driver.OracleDriverMysql的JDBC驅動類名: com.mysql.jdbc.DriverSybase的JDBC驅動類名: com.sybase.jdbc2.jdbc.SybDriver7/19/20226共六十七頁2.建立(jinl)連接(Connection)Connectio

4、n conn = DriverManager.getConnection(url, user, password);url格式(g shi):JDBC:子名稱/主機名:端口/數(shù)據庫名或: JDBC:子名稱/主機名:端口/數(shù)據庫名?屬性名=屬性值 例如,Mysql的連接創(chuàng)建: Connection conn = DriverManager.getConnection(“jdbc:mysql:/localhost:3306/testdb?user=root&password=123456”;)7/19/20227共六十七頁2.建立(jinl)連接(Connection)SqlServer2005的

5、連接(linji)創(chuàng)建:Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);cn=DriverManager.getConnection(jdbc:sqlserver:/localhost:1433:databaseName,sUsr,sPwd);Oracle 的連接創(chuàng)建:Class.forName(oracle.jdbc.driver.OracleDriver);cn=DriverManager.getConnection(jdbc:oracle:thin:localhost:1521:databaseName,sUsr,s

6、Pwd);7/19/20228共六十七頁3.創(chuàng)建(chungjin)Statement對象String sql=select * from user where name=+name+;Statement stm=conn.createStatement(int resultSetType,int resultSetConcurrency);/第一個參數(shù)(cnsh)選項如下:/TYPE_FORWARD_ONLY (缺省值)/TYPE_SCROLL_INSENSITIVE/TYPE_SCROLL_SENSITIVE/第二個參數(shù)選項如下:/CONCUR_READ_ONLY (缺省值)/CONCUR

7、_UPDATABLE ResultSet rs = stm.executeQuery(sql);7/19/20229共六十七頁4.執(zhí)行(zhxng) SQL 語句boolean execute(String sql)/返回值為true時,表示執(zhí)行的是查詢語句,通過getResultSet方法獲取(huq)結果;返回值為false時,執(zhí)行的是更新語句,通過getUpdateCount方法獲取(huq)更新的記錄數(shù)量。int executeUpdate(String sql)/執(zhí)行給定 SQL 語句,該語句可以為 INSERT、 DELETE 或 UPDATE語句,返回值是更新的記錄數(shù)量。Resu

8、ltSet executeQuery(String sql) /執(zhí)行給定 SQL 語句,產生結果集。7/19/202210共六十七頁5.釋放(shfng)資源釋放(shfng)ResultSetrs.close();釋放Statementstm.close();釋放Connectionconn.close();7/19/202211共六十七頁用戶注冊、登錄(dn l)登錄頁面login.jsp登錄操作login_action.jsp歡迎頁面welcome.jsp注冊頁面register.jsp注冊操作register_action.jsp退出操作logout.jspJSP頁面流程6個頁面(y

9、min)!7/19/202212共六十七頁Java Web開發(fā)(kif)模式(1)JSP(一層架構(ji u)模式)SystemResponseUserRequestBrowerWebContainerJSP文件(Viewer)DATA圖1:一層架構圖軟件開發(fā)方案7/19/202213共六十七頁JSP開發(fā)模式: 優(yōu)點:邏輯結構簡單、容易理解。 缺點:當應用系統(tǒng)(xtng)功能復雜時,代碼的可讀性差。 結論:通常用于簡單的WEB網站開發(fā)。 7/19/202214共六十七頁Java Web開發(fā)(kif)模式(2)JSP+JavaBean(兩層架構(ji u)模式)SystemResponseUse

10、rRequestBrowerWebContainerJSP(Viewer)DATAJavaBean(Model)圖2:兩層架構模式7/19/202215共六十七頁JSPJavaBean開發(fā)模式: 優(yōu)點:該模式將業(yè)務邏輯與頁面表現(xiàn)(bioxin)進行分離,在一定程度上增加了程序的可調試性和維護性。 缺點:JSP頁面將顯示與控制集于一身。 結論:適合簡單、小型項目的快速構建與運行。7/19/202216共六十七頁Java Web開發(fā)(kif)模式(3)JSP+JavaBean+Servlet(三層架構(ji u)模式)SystemResponseUserRequestBrowerWebContai

11、nerJSP(Viewer)DATAJavaBean(Model)Servlet(Controller)圖3:三層架構模式7/19/202217共六十七頁JSPServletJavaBean開發(fā)模式(msh): 優(yōu)點:JSP負責頁面顯示。Servlet作為控制器,控制程序的流向。JavaBean負責業(yè)務邏輯處理。 遺憾:沒有統(tǒng)一的開發(fā)框架導致開發(fā)周期長。7/19/202218共六十七頁(4)SSH (struts2+spring+hibernate)整合開發(fā)(kif)(多層架構模式)SystemResponseUserRequestBrowerWebContainerJSP(Viewer)DA

12、TADataPersistenceServlet(Controller)DAO圖4:多層架構圖7/19/202219共六十七頁6.2 JavaBean技術(jsh)JavaBean實際上是把一些(yxi)屬性和方法封裝起來的Java類,它遵循一定的編程規(guī)則,把可以重復利用的功能代碼封裝起來提供給其他開發(fā)人員和頁面調用。JavaBean的工作過程:JSPJavaBean調用JavaBean的方法返回處理的結果7/19/202220共六十七頁為什么要在JSP中使用(shyng)JavaBean?原因:代碼重用性差。業(yè)務邏輯和頁面顯示代碼混亂。代碼可讀性差,后期(huq)維護困難。7/19/2022

13、21共六十七頁JavaBean的編程規(guī)范(gufn):遵守四點:1. 如果類的屬性名是xxx,在類中使用兩個方法:getXxx(),用來獲取屬性xxx。setXxx(),用來修改屬性xxx。2. boolean類型的成員變量,允許使用is代替get和set。如:isValid()或getValid()。3. 類中方法的訪問屬性必須是public的。類中如果有構造方法,要求是無參數(shù)(cnsh)的。4. 如果使用Tomcat5.0版本后的引擎服務器,bean必須有包名。如:package tom。7/19/202222共六十七頁package tom;public class TestCounte

14、rprivate int num;public void testCounter() num=1; 類名要首字母大寫,后面的單詞首字母大寫。方法(fngf)名的第一個單詞小寫,后面的單詞首字母大寫。變量名的第一個單詞小寫,后面的單詞首字母大寫。JavaBean命名(mng mng)規(guī)則 7/19/202223共六十七頁在JSP中調用(dioyng)JavaBean 第一步必須有相應的import指令: 第二步是使用下列(xili)三種JSP動作標簽,分別是:jsp:useBean動作標記Jsp:setProperty動作標記Jsp:getProperty動作標記7/19/202224共六十七頁

15、在JSP中調用(dioyng)JavaBean使用jsp:useBean指令聲明JavaBean對象,語法格式(g shi):其中,id是當前頁面中引用JavaBean的名字。scope指定JavaBean的作用范圍,可取4個值: page:JavaBean只能在當前頁面中使用。在JSP頁面執(zhí)行完畢后,該JavaBean將會被進行垃圾回收。 request:JavaBean在相臨的兩個頁面中有效。 session:JavaBean在整個用戶會話過程中都有效。 application:JavaBean在當前整個Web應用的范圍內有效。7/19/202225共六十七頁討論(toln)Javabea

16、n中scope的不同取值和默認值1、先討論(toln)request、session與application區(qū)別?package com;import java.io.*;public class Trick int i=1; public int getI() i+; return i; Trick.javatrick.jsp7/19/202226共六十七頁運行trick.jspRequest: 刷新頁面3次屏幕顯示2,重啟瀏覽器屏幕顯示2;Session: 刷新頁面3次數(shù)字從2開始遞增至4,重啟瀏覽器屏幕重新從2開始遞增;Application: 刷新頁面3次數(shù)字從2開始遞增4,重啟瀏覽器

17、從4開始遞增。結論:應用范圍大小比較(bjio):requestsessionapplicationRequest: 請求期間有效Session: 會話期間有效Application: 服務器運行期間有效7/19/202227共六十七頁2、再討論(toln)page與request區(qū)別? 運行trick1.jsptrick.jsp,trick1.jsp中同取scope=”request”: 屏幕顯示3trick.jsp,trick1.jsp中同取scope=”page”: 屏幕顯示2結論:應用(yngyng)范圍大小:pagerequesttrick.jsp7/19/202228共六十七頁3、

18、scope的默認值測試方法: trick.jsp中scope=“page”; trick.jsp中去掉scope; 運行trick.jsp,屏幕顯示2,與scope=”page”時結果(ji gu)相同,故理論上默認值應為page。7/19/202229共六十七頁架構(ji u)2:JSP+JavaBean架構(ji u)原型架構1:用戶注冊、登錄(JSP)DBAccess.javaUserBean.java架構2:demo(JSP+JavaBean)數(shù)據庫底層(d cn)處理 業(yè)務邏輯操作 7/19/202230共六十七頁架構(ji u)3:JSP+JavaBean+Servlet架構(ji

19、 u)原型UserServlet.java架構3:demo(JSP+JavaBean+Servlet)架構1:用戶注冊、登錄(JSP)DBAccess.javaUserBean.java架構2:demo(JSP+JavaBean)7/19/202231共六十七頁6.3 Hibernate技術(jsh)理論基礎Hibernate開發(fā)流程Hibernate核心(hxn)接口7/19/202232共六十七頁6.3.1 理論(lln)基礎存在(cnzi)的理論基礎:數(shù)據庫操作的三個階段ORM對象關系映射持久化和持久層概念7/19/202233共六十七頁操作(cozu)數(shù)據庫的三個階段1)JDBC階段

20、操作數(shù)據庫需遵6步:加載JDBC驅動程序(只做一次)創(chuàng)建與數(shù)據庫的連接(Connection) 創(chuàng)建語句對象(duxing)(Statement)執(zhí)行語句(execute、executeUpdate、executeQuery)處理結果(ResultSet)釋放資源7/19/202234共六十七頁2)封裝JDBC階段(jidun)開發(fā)數(shù)據庫底層處理JavaBeanDBAccess.javapublic boolean createConn():加載驅動創(chuàng)建連接對象(duxing);public boolean update(String sql):執(zhí)行更新SQL;public void quer

21、y(String sql):執(zhí)行查詢SQL;public void closeRs():public void closeStm();public void closeConn();開發(fā)業(yè)務邏輯操作 JavaBean7/19/202235共六十七頁 3)ORM(Object Relational Mapping,對象關系映射(yngsh))階段 在面向(min xin)對象的編程開發(fā)中,面向(min xin)過程的關系數(shù)據庫數(shù)據庫的操作與面向(min xin)對象的Java代碼操作,顯然是兩種開發(fā)思路。 能否操作數(shù)據庫像操作Java類一樣? 于是,ORM便應運而生了。7/19/202236共六

22、十七頁ORM對象(duxing)關系映射ORM(Object Relational Mapping,對象(duxing)關系映射)是一種為了解決面向對象(duxing)與關系數(shù)據庫存在的互不匹配的現(xiàn)象的技術。用戶實體、數(shù)據表、JAVA類之間映射關系:用戶實體編號 用戶名 密碼 EmailUser表PKIDUsernamePasswordemailUser類-ID-username-password-emailERORM7/19/202237共六十七頁持久(chji)化和持久(chji)層概念持久化(Persistence):是對數(shù)據和程序狀態(tài)的保持,是將數(shù)據在瞬時狀態(tài)和持久狀態(tài)之間轉換的機制。

23、持久層(Persistence Layer):是專注(zhunzh)于實現(xiàn)數(shù)據持久化的一個相對獨立的領域(Domain),是負責向(從)存儲器中存儲(獲取)數(shù)據的一組類和組件。7/19/202238共六十七頁SSH (struts2+spring+hibernate)整合開發(fā)(kif)(多層架構模式)SystemResponseUserRequestBrowerWebContainerJSP(Viewer)DATADataPersistenceServlet(Controller)DAOORM組件(z jin),負責封裝數(shù)據庫訪問的細節(jié)!7/19/202239共六十七頁持久(chji)層可選方

24、案方案優(yōu)點缺點JDBC成熟,流行代碼煩雜,可讀性差,維護困難,移植困難。Entity BeanEJB3不可移植,依賴性強,不可序列化,不支持多態(tài)的關聯(lián)查詢。Apache OJB屬Apache基金組織文檔資源太少。iBATIS可以控制更多的數(shù)據庫操作細節(jié)持久層封裝不夠徹底。Hibernate成熟、流行、功能強大。并逐漸成JAVA持久層標準。不夠透明。7/19/202240共六十七頁6.3.2 Hibernate框架(kun ji)Hibernate是目前非常優(yōu)秀、成熟的O/R Mapping框架,它是對JDBC的輕量級的對象封裝,可以用在任何JDBC使用的場合。Hibernate的工作原理:通過

25、文件把對象和數(shù)據庫表字(bioz)段之間建立起一個映射關系。Hibernate優(yōu)勢開源:/成熟流行自定義API7/19/202241共六十七頁Hibernate開發(fā)(kif)流程圖數(shù)據庫表數(shù)據庫表映射文件持久化類Hibernate配置文件Hibernate APIDAO層Service層7/19/202242共六十七頁Hibernate開發(fā)(kif)步驟在JAVA應用中,Hibernate開發(fā)步驟(bzhu):下載并安裝Hibernate3。創(chuàng)建Hibernate的配置文件。創(chuàng)建Hibernate映射文件。創(chuàng)建持久化(POJO)類。編寫DAO層代碼。編寫Service層代碼。7/19/2022

26、43共六十七頁1.安裝(nzhung)配置Hibernate下載(xi zi)并安裝hibernate3。 將下載的hibernate3.jar和/lib下的所有文件都復制到項目的lib子目錄下:hibernate3.jarcglib.jarasm.jarcommons-collections.jarcommons-logging.jarjta.jardom4j.jar7/19/202244共六十七頁2.創(chuàng)建(chungjin)Hibernate的配置文件Hibernate配置文件:主要用于配置(pizh)數(shù)據庫連接和Hibernate運行時所需的各種屬性。支持兩種形式:XML和propert

27、ies格式的配置文件,推薦使用XML格式。pertieshibernate.cfg.xml7/19/202245共六十七頁hibernate.cfg.xml文件(wnjin) com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/testdb root 123456 org.hibernate.dialect.MySQLDialect true 7/19/202246共六十七頁3.編寫(binxi)映射文件User.hbm.xml /定義(dngy)主鍵 /主鍵字段為自增類型 7/19/202247共六十七頁4.編寫(binxi)持久化類(POJO類

28、)User.java持久化類POJO(Plain Old Java Objects,簡單的Java對象),實際就是普通JavaBeans。遵循4條規(guī)則:為屬性字段創(chuàng)建對應的getXXX()和setXXX()方法。實現(xiàn)(shxin)一個默認的無參構造方法。提供一個標識屬性,該屬性映射數(shù)據庫表的主鍵字段。使用非final的類。7/19/202248共六十七頁5.編寫(binxi)DAO類UserDAO.javaDAO(Data Access Object,數(shù)據訪問(fngwn)對象):負責調用hibernate API,實現(xiàn)CRUD操作。7/19/202249共六十七頁6.編寫Service層代碼

29、(di m)并運行Service層代碼,面向用戶服務(fw)并定義與實際業(yè)務相關的方法,主要是面向用戶負責調用DAO層的代碼。7/19/202250共六十七頁舉例(j l):請參照課堂中所舉的具體(jt)案例。7/19/202251共六十七頁6.3.3 Hibernate核心(hxn)接口和類Hibernate 的核心(hxn)接口和類有5個:配置Hibernate的類:Configuration。訪問數(shù)據庫操作的接口:SessionFactory、Session、 Query、Transaction接口。pertiesConfiguration 配置hibernateSessionFacto

30、ry 初始化hibernateSession 負責對象操作Java EE 應用Hibernate.cfg.xml*.hbm.xmlCriteria 條件查詢Transaction管理事務Query HQL查詢圖:Hibernate常用的接口和類7/19/202252共六十七頁Configuration類Configuration負責配置并啟動Hibernate(解析Hibernate的配置文件(wnjin)和持久化映射文件(wnjin))。創(chuàng)建SessionFactoty對象。7/19/202253共六十七頁SessionFactory接口(ji ku)SessionFactory可以生成Se

31、ssion對象。一般一個(y )項目只有一個(y )SessionFactory對象。 Configuration cfg=new Configuration().configure(); SessionFactory factory=cfg.buildSessionFactory(); Session session=factory.getCurrentSession();7/19/202254共六十七頁Session 接口(ji ku)session對象 用于執(zhí)行(zhxng)被持久化對象的CRUD操作7/19/202255共六十七頁獲取(huq)session對象Configuratio

32、n cfg=new Configuration().configure();SessionFactory factory=cfg.buildSessionFactory();Session session=factory.openSession();使用session對象方法:save() 保存對象update() 更新持久化對象。 delete() 移除持久化對象beginTransaction() 開始事務操作方法:getCurrentSession()注:使用getCurrentSession()需要(xyo)在hibernate.cfg.xml中加入如下配置: thread7/19/2

33、02256共六十七頁Transaction接口(ji ku)負責(fz)事務相關的操作事務操作:獲取Transaction對象Transaction trans=session.beginTransaction()事務提交mit();事務回滾trans.rollback();7/19/202257共六十七頁Query接口(ji ku)創(chuàng)建并執(zhí)行面向對象的標準化查詢(chxn)可以使用HQL可以使用SQL7/19/202258共六十七頁HQL(Hibernate Query Language)語言(yyn) HQL是完全面向對象的查詢語言, HQL語法簡單,類似(li s)于普通SQL的語法。與

34、SQL唯一不同的是,HQL將SQL中的表名變成了Hibernate中的持久化類的名稱??傮w語法結構是selectfromwheregroup by havingorder by7/19/202259共六十七頁Query查詢(chxn)步驟this.session = factory.openSession() ;/獲取Session對象;String hql= FROM Person WHERE id=? ;/編寫HQL語句;Query q = this.session.createQuery(hql) ;/以HQL語句作為參數(shù),調用Session的createQuery方法創(chuàng)建(chungj

35、in)查詢對象;q.setString(0,id) ;/如果HQL語句包含參數(shù),調用Query的setXxx方法為參數(shù)賦值;List l = q.list() ;/調用Query對象的list方法遍歷查詢結果 Iterator iter = l.iterator() ; if(iter.hasNext() p = (Person)iter.next() ; return p ;7/19/202260共六十七頁HQL語法(yf)from 子句所有的查詢語句至少有from語句。例如(lr):要查詢Person持久化類: from Person 可以為Person起個別名 from Person as pe7/19/202261共六十七頁select子句選擇哪些(nxi)對象或屬性返回到查詢結果中。select id, name from Person 可以使用的聚集函數(shù):avg(.) 求均值,sum(.) 求和,min(.)最小值,max(.)最大值 count(.) 求個數(shù)使用distinct 去除重復的數(shù)據。如:計算age的總和?select cou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論