Ijo就業(yè)培訓(xùn)jva教材_第1頁
Ijo就業(yè)培訓(xùn)jva教材_第2頁
Ijo就業(yè)培訓(xùn)jva教材_第3頁
Ijo就業(yè)培訓(xùn)jva教材_第4頁
Ijo就業(yè)培訓(xùn)jva教材_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第 三 十 四 章: Hibernate 基 礎(chǔ)學(xué)習(xí)目標(biāo)理解ORM機(jī)希9理解Hibernate的工作原理Hibernate的配置和對(duì)象-映射文件理解對(duì)象持久化Hibernate 簡介Hibernate是Java應(yīng)用和關(guān)系數(shù)據(jù)庫之間的橋梁,它負(fù)責(zé) Java對(duì)象關(guān)系數(shù)據(jù)之間的映射。Hibernate內(nèi)部封裝了通過JDBC訪問數(shù)據(jù)庫的操作,向上層應(yīng)用提供了面向?qū)ο蟮臄?shù)據(jù)訪 問API。在Java應(yīng)用中使用Hibernate包含以下步驟。(1)創(chuàng)建Hibernate的配置文件。(2)創(chuàng)建持久化類。(3)創(chuàng)建對(duì)象-關(guān)系映射文件。(4)通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼。建立簡單的Hiber

2、nate應(yīng)用本章通過一個(gè)簡單的例子customerApp應(yīng)用,演示如何運(yùn)用 Hibernate 來訪問關(guān)系數(shù)據(jù)庫。customerApp應(yīng)用的功能非常簡單:通過 Hibernate 保存、更新、刪除、加載以及查 詢Customer對(duì)象。創(chuàng)建Hibernate 的配置文件Hibernate從其配置文件中讀取和數(shù)據(jù)庫連接有關(guān)的信息,這個(gè)配置文件應(yīng)該位于應(yīng)用的 classpath 中。Hibernate的配置文件有兩種形式:一種是 XML格式的文件;還有一種是 Java屬性文件,采用“健=值”的形式。下面介紹如何以 Java屬性文件的格式來創(chuàng)建Hibernate的配置文件。這種配置文件的默認(rèn)文件名為

3、perties 。perties的內(nèi)容如下:hibernate.show_sql=true以上perties文件包含了一系列屬性及其屬性值,Hibernate將根據(jù)這些屬性來連接數(shù)據(jù)庫,本例為連接 MySQL數(shù)據(jù)庫的配置代碼。下表對(duì)以上perties文件中的所有屬性做了描述。屬性描述hiber nate.dialectSQL指定數(shù)據(jù)庫使用的方言指定數(shù)據(jù)庫的驅(qū)動(dòng)程序URL指定連接數(shù)據(jù)庫的指定連接數(shù)據(jù)庫的用戶名指定連接數(shù)據(jù)庫的口令hiber nate.show_sql如果為true,表示在程序運(yùn)

4、行時(shí),會(huì)在控制臺(tái)輸岀SQL語句,這有利于跟蹤Hibernate的運(yùn)行狀態(tài)。默認(rèn)為false。在應(yīng)用開發(fā)和測(cè)試階段,可以把這個(gè)屬性設(shè)為 true,以便跟蹤和調(diào)試應(yīng)用程序,在應(yīng)用發(fā)布階段, 應(yīng)該把這個(gè)屬性設(shè)為false,以便減少應(yīng)用的輸岀信息,提高運(yùn)行性能。Hibernate能夠訪問多種關(guān)系數(shù)據(jù)庫,如 MySQL Oracle和Sybase等。盡管多數(shù)關(guān)系數(shù)據(jù)庫 都支持標(biāo)準(zhǔn)的SQL語言,但是它們往往還有各自的 SQL方言,就象不同地區(qū)的人既能說標(biāo)準(zhǔn) 的普通話,還能講各自的方言一樣。hibernate.dialect 屬性用于指定被訪問數(shù)據(jù)庫使用的 SQL方言,當(dāng)Hibernate 生成SQL查詢語

5、句,或者使用native 對(duì)象標(biāo)識(shí)符生成策略時(shí), 都會(huì)參考本地?cái)?shù)據(jù)庫的SQL方言。創(chuàng)建持久化類 持久化類是指其實(shí)例需要被 Hibernate 持久化到數(shù)據(jù)庫中的類。持久化類通常都是域模型 中的實(shí)體域類。持久化類符合 JavaBean的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的getXXX()和 setXXX() 方法。以下定義了一個(gè)名為 Customer 的持久化類。package ;public class Customer implements Serializableprivate Long id;private String name;private String email;private

6、String password;private int phone;private boolean married;private String address;private char sex;private String description;private byte image;private Date birthday;private Timestamp registeredTime;public Customer()public Long getId()return id;public void setId(Long id)this.id = id;public String ge

7、tName()return name;public void setName(String name) =name;/ 此處省略 email、password 和 phone 等屬性的 getXXX() 和 setXXX()方法 持久化類符合 JavaBean 的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的 getXXX() 和 setXXX() 方 法。getXXX()和setXXX()方法必須符合特定的命名規(guī)則,“ get ”和“ set ”后面緊跟屬性 的名字,并且屬性名的首字母為大寫,例如 name 屬性的 get 方法為 getName() ,如果把 get方法寫為getna

8、me()或者getNAME(),會(huì)導(dǎo)致Hibernate在運(yùn)行時(shí)拋出以下異常: .Customer如果持久化類的屬性為boolean類型,那么它的get方法名既可以用“ get ”作為前綴,也 可以用“ is ”作為前綴。例如 Customer 類的 married 屬性為 boolean 類型,因此以下兩 種 get 方法是等價(jià)的:public boolean isMarried()return married;或者public boolea n getMarried()return married;創(chuàng)建數(shù)據(jù)庫Schema在本例中,與 Customer類對(duì)應(yīng)的數(shù)據(jù)庫表名為 CUSTOMERS

9、在MySQL數(shù)據(jù)庫中的 DDL 定義如下:create table CUSTOMERS(ID bigi nt not n ull primary key,NAME varchar(15) not null,EMAIL varchar(128) not null,PASSWORD varchar(8) not null,PHONE int ,ADDRESS varchar(255),SEX char(1),IS_MARRIED bit,DESCRIPTION text,IMAGE blob,BIRTHDAY date,REGISTERED_TIME timestamp);CUSTOMERS有一個(gè)

10、ID 字段,它是表的主鍵,它和Customer類的id 屬性對(duì)應(yīng)。CUSTOMERS中的字段使用了各種各樣的 SQL類型,參見下表。字段名SQL類型說明IDBIGINT整數(shù),占8字節(jié),取值范圍為:-2A63 2A63-1NAMEVARCHAR變長字符串,占0 255個(gè)字節(jié)SEXCHAR定長字符串,占0 255 個(gè)字節(jié)IS MARRIEDBIT布爾類型DESCRIPTIONTEXT長文本數(shù)據(jù),占0 65535 255 字節(jié)。如果字 符串長度小于255,可以用VARCHA或 CHAF類 型來表示。如果字符串長度大于 255,可以定 義為TEXT類型。IMAGEBLOB二進(jìn)制長數(shù)據(jù),占 0 6553

11、5 字節(jié),BLOB是Bi nary Large Object的縮與。IMAGE 在本例中,字段用來存放圖片數(shù)據(jù)BIRTHDAYDATE代表日期,格式為“ YYYY-MM-DDREGISTERED TIMETIMESTAMP代表日期和時(shí)間,格式為“ YYYYMMDDHHMMSS創(chuàng)建對(duì)象-關(guān)系映射文件vhibernate-mappi ngv/idvproperty n ame=n ame colu mn=NAME type=stri ng not-n ull=true/ vproperty n ame=emailcolu mn=EMAIL type=stri ng not-n ull=true/v

12、/hibernate-mappi ng映射文件的文檔類型定義(DTD描述頂層元素 vhibernate-mapping 的子元素的代碼如下:vhibernate-mapping元素是對(duì)象-關(guān)系映射文件的根元素,其他元素(即以上 DTD代碼中括 號(hào)以內(nèi)的元素,女口 子元素)必須嵌入在 vhibernate-mapping 元素以內(nèi)。在 元素中又嵌套了好多子元素。在以上 DTD代碼中,還使用了一系列的特殊符號(hào)來修飾元素, 下表描述了這些符號(hào)的作用。在創(chuàng)建自己的對(duì)象-關(guān)系映射文件時(shí),如果不熟悉某種元素的語法,可以參考DTD文件。DTD中特殊符號(hào)的作用符號(hào)含義無符號(hào)該子兀素在父兀素內(nèi)必須存在且只能存在

13、一次。+該子元素在父元素內(nèi)必須存在,可以存在一次或者多次。*該子元素在父元素內(nèi)可以不存在,或者存在一次或者多次。它 是比較常用的符號(hào)。?該子元素在父元素內(nèi)可以不存在,或者只存在一次。它是比較 常用的符號(hào)。表 2-3 可以看出,在 vhibernate-mapping 元素中,meta、import、class 和 query 等子元素可以不存在,或者存在一次或者多次;在class元素中,id子元素必須存在且只能存在一次, 元素可以不存在,或者存在一次或者多次。 此外,在映射文件 中,父元素中的各種子元素的定義必須符合特定的順序。例如根據(jù) 元素的 DTD 可以 看出,必須先定義 子元素,再定義子

14、元素,以下映射代碼顛倒了和 子元素的位置: Hibernate的XML解析器在運(yùn)行時(shí)會(huì)拋出 MappingException :java 21:27:51,610 ERROR XMLHelper:48 - Error parsing XML:把Customer持久化類映射到CUSTOMERS“hbm.xml”。后一種做法更值得推薦,因?yàn)樵趫F(tuán)隊(duì)開發(fā)中,這有利于管理和維護(hù)映射文 件。元素指定類和表的映射,它的name屬性設(shè)定類名,table屬性設(shè)定表名。以下 代碼表明和 Customer類對(duì)應(yīng)的表為 CUSTOMERS如果沒有設(shè)置元素的table屬性,Hibernate將直接以類名作為表名,也就是

15、說,默 認(rèn)情況下,與 mypack.Customer類對(duì)應(yīng)的表為 Customer表。元素包含一個(gè)子 元素以及多個(gè)子元素。子元素設(shè)定持久化類的OID和表的主鍵的映射。以下 代碼表明Customer類的id屬性和CUSTOMERS中的ID字段對(duì)應(yīng)。元素的vgenerator子元素指定對(duì)象標(biāo)識(shí)符生成器,它負(fù)責(zé)為OID生成惟一標(biāo)識(shí)符。 子元素設(shè)定類的屬性和表的字段的映射。 子元素主要包括 name、 type、column 和 not-null 屬性。1. 元素的 name屬性元素的name屬性指定持久化類的屬性的名字。2. 元素的 type 屬性 元素的 type 屬性指定 Hibernate 映

16、射類型。 Hibernate 映射類型是 Java 類型與 SQL 類型的橋梁。3. 元素的 not-null 屬性如果元素的not-null屬性為true,表明不允許為null,默認(rèn)為false。例如以下代碼表明不允許 Customer類的name屬性為null :Hibernate 在持久化一個(gè) Customer 對(duì)象時(shí),會(huì)先檢查它的 name 屬性是否為 null ,如果為 null ,就會(huì)拋出以下異常:a null or transient value: .C如果數(shù)據(jù)庫中CUSTOMER表的NAME字段不允許為 null ,但在映射文件中沒有設(shè)置not-null

17、 屬性: 那么Hibernate在持久化一個(gè)Customer對(duì)象時(shí),不會(huì)先檢查它的 name屬性是否為null而 是直接通過JDBC API向CUSTOMER表插入相應(yīng)的數(shù)據(jù),由于 CUSTOMER表的NAME字段設(shè)置了 not null 約束,因此數(shù)據(jù)庫會(huì)拋出錯(cuò)誤:708 ERROR JDBCExceptionReporter:58 - General error, message from server:Column NAME cannot be null4 元素的 column 屬性 元素的 column 屬性指定與類的屬性映射的表的字段名。以下代碼表明和address屬性對(duì)應(yīng)的字段為A

18、DDRES字段:如果沒有設(shè)置 元素的 column 屬性, Hibernate 將直接以類的屬性名作為字段 名,也就是說,默認(rèn)情況下,與 Customer 類的 address 屬性對(duì)應(yīng)的字段為 address 字段。 vproperty 元素還可以包括 vcolumn子元素,它和 vproperty 元素的 column 屬性一樣,都 可以設(shè)定與類的屬性映射的表的字段名。以下兩種設(shè)置方式是等價(jià)的:或者元素的vcolumn*元素比column屬性提供更多的功能,它可以更加詳細(xì)的描述表的字段。例如以下 vcolumn子元素指定 CUSTOMER表中的NAME字段的SQL類型為 varchar(1

19、5) ,不允許為 null ,并且為這個(gè)字段建立了索引:vproperty name=name type=stringvcolumn name=NAME sql-type=varchar(15) not-null=true index=idx_name/v/property通過 Hibernate API 操縱數(shù)據(jù)庫Hibernate對(duì)JDBC行了封裝,提供了更加面向?qū)ο蟮腁PI。以下兩圖對(duì)比了直接通過 JDBCAPI 以及通過 Hibernate API 來訪問數(shù)據(jù)庫的兩種方式。以下示例的 BusinessService 類演示了通過 Hibernate API 對(duì) Customer 對(duì)象進(jìn)

20、行持久化的 操作。package ;import javax.servlet.*;import java.io.*;import java.util.*;public class BusinessServicepublic static SessionFactory sessionFactory;/* 初始化 Hibernate ,創(chuàng)建 SessionFactory 實(shí)例 */statictry/ 根據(jù)默認(rèn)位置的 Hibernate 配置文件的配置信息,創(chuàng)建一個(gè) Configuration 實(shí)例Configuration config = new Configuration();config.

21、addClass(Customer.class);/ 創(chuàng)建 SessionFactory 實(shí)例 */sessionFactory = config.buildSessionFactory();catch(Exception e)e.printStackTrace();/* 查詢所有的Customer對(duì)象,然后調(diào)用printCustomer() 方法打印Customer對(duì)象信息*/public void findAllCustomers(ServletContext context,OutputStream out) throwsException /* 持久化一個(gè) Customer 對(duì)象 *.

22、/public void saveCustomer(Customer customer) throws Exceptio n/* 按照OID加載一個(gè)Customer對(duì)象,然后修改它的屬性*/public void loadAndUpdateCustomer(Long customer_id,String address) throwsException /* 刪除所有的 Customer 對(duì)象 */public void deleteAllCustomers() throws ExceptionSession session = sessionFactory.openSession();Tra

23、nsaction tx = null;try tx = session.beginTransaction();session.delete(from Customer as c);mit();catch (Exception e) if (tx != null) tx.rollback();throw e; finally session.close();/* 選擇向控制臺(tái)還是動(dòng)態(tài)網(wǎng)頁輸出 Customer 對(duì)象的信息 */private void printCustomer(ServletContext context,OutputStream out,Customer customer)t

24、hrows Exceptionif(out instanceof ServletOutputStream) printCustomer(context,(ServletOutputStream) out,customer);elseprintCustomer(PrintStream) out,customer);/* 把Customer對(duì)象的信息輸出到控制臺(tái),如DOS控制臺(tái)*/privatevoidprintCustomer(PrintStreamout,Customer customer)throwsException /* 把Customer對(duì)象的信息輸出到動(dòng)態(tài)網(wǎng)頁 */private v

25、oid printCustomer(ServletContext context,ServletOutputStream out,Customer customer)throws Exceptio n public void test(ServletContext context,OutputStream out) throws ExceptionCustomer customer=new Customer();customer.setName(Tom););customer.setPassword(1234);customer.setAddress(Shanghai);customer.se

26、tSex(M);customer.setDescription(I am very honest.);/設(shè)置Customer對(duì)象的image屬性,它是字節(jié)數(shù)組,存放 photo.gif 文件中的二進(jìn)/photo.gif 文件和 BusinessService.class 文件位于同一個(gè)目錄下InputStream in=this.getClass().getResourceAsStream(photo.gif);byte buffer = new bytein.available();in.read(buffer);customer.setImage(buffer);customer.setB

27、irthday(Date.valueOf(1980-05-06);saveCustomer(customer);findAllCustomers(context,out);loadAndUpdateCustomer(customer.getId(),Beijing);findAllCustomers(context,out);deleteAllCustomers();public static void main(String args) throws Exception new BusinessService().test(null,System.out);sessionFactory.cl

28、ose();以上例子演示了通過 Hibernate API 訪問數(shù)據(jù)庫的一般流程。首先應(yīng)該在應(yīng)用的啟動(dòng)階段對(duì) Hibernate 進(jìn)行初始化,然后就可以通過 Hibernate 的 Session 接口來訪問數(shù)據(jù)庫。 Hibernate 的初始化BusinessService 類的靜態(tài)代碼塊負(fù)責(zé) Hibernate 的初始化工作,如讀取 Hibernate 的配置 信息以及對(duì)象 - 關(guān)系映射信息,最后創(chuàng)建 SessionFactory 實(shí)例。當(dāng) JVM(Java 虛擬機(jī))加 載 BusinessService 類時(shí),會(huì)執(zhí)行該靜態(tài)代碼塊。初始化過程包括如下步驟。(1) 創(chuàng)建一個(gè) Configur

29、ation 類的實(shí)例, Configuration 類的構(gòu)造方法把默認(rèn)文件路徑下 的 perties 配置文件中的配置信息讀入到內(nèi)存:Configuration config = new Configuration();(2) 調(diào)用 Configuration 類的 addClass(Customer.class) 方法: config.addClass(Customer.class);(3) 調(diào)用 Configuration 類的 buildSessionFactory() 方法:sessionFactory = config.buildSessionFactory

30、();該方法創(chuàng)建一個(gè) SessionFactory 實(shí)例,并把 Configuration 對(duì)象包含的所有配置信息拷貝 到 SessionFactory 對(duì)象的緩存中。 SessionFactory 代表一個(gè)數(shù)據(jù)庫存儲(chǔ)源,如果應(yīng)用只有 一個(gè)數(shù)據(jù)庫存儲(chǔ)源,那么只需創(chuàng)建一個(gè) SessionFactory 實(shí)例。當(dāng) SessionFactory 對(duì)象創(chuàng) 建后,該對(duì)象不和 Configuration 對(duì)象關(guān)聯(lián)。因此如果再修改 Configuration 對(duì)象包含的 配置信息,不會(huì)對(duì) SessionFactory 對(duì)象有任何影響。訪問 Hibernate 的 Session 接口初始化過 程結(jié) 束后,

31、就可 以調(diào)用 SessionFactory 實(shí)例的 openSession() 方法 來獲得 Session 實(shí)例,然后通過它執(zhí)行訪問數(shù)據(jù)庫的操作。 Session 接口提供了操縱數(shù)據(jù)庫的各種 方法,如:save() 方法:把 Java 對(duì)象保存數(shù)據(jù)庫中。update() 方法:更新數(shù)據(jù)庫中的 Java 對(duì)象。delete() 方法:把 Java 對(duì)象從數(shù)據(jù)庫中刪除。load() 方法:從數(shù)據(jù)庫中加載 Java 對(duì)象。find() 方法:從數(shù)據(jù)庫中查詢 Java 對(duì)象。Session 是一個(gè)輕量級(jí)對(duì)象。通常將每一個(gè) Session 實(shí)例和一個(gè)數(shù)據(jù)庫事務(wù)綁定,也就是 說,每執(zhí)行一個(gè)數(shù)據(jù)庫事務(wù),都

32、應(yīng)該先創(chuàng)建一個(gè)新的 Session 實(shí)例。如果事務(wù)執(zhí)行中出現(xiàn)異 常,應(yīng)該撤銷事務(wù)。不論事務(wù)執(zhí)行成功與否,最后都應(yīng)該調(diào)用 Session 的 close() 方法,從 而釋放 Session 實(shí)例占用的資源。以下代碼演示了用 Session 來執(zhí)行事務(wù)的流程,其中 Transaction 類用來控制事務(wù)。Session session = factory.openSession();Transaction tx;try / 開始一個(gè)事務(wù)tx = session.beginTransaction();/ 執(zhí)行事務(wù)/ 提交事務(wù)mit();catch (Exception e) / 如果出現(xiàn)異常,就撤

33、銷事務(wù)if (tx!=null) tx.rollback();throw e;finally / 不管事務(wù)執(zhí)行成功與否,最后都關(guān)閉 Session session.close(); 下圖為正常執(zhí)行數(shù)據(jù)庫事務(wù)(即沒有發(fā)生異常)的時(shí)序圖。 BusinessService 類 提 供 了 保存 、 刪 除 、 查 詢 和 更 新 Customer 對(duì) 象的 各 種 方法 。 BusinessService 類的 main() 方法調(diào)用 test() 方法, test() 方法又調(diào)用以下方法: 1 saveCustomer() 方法 該方法調(diào)用 Session 的 save() 方法,把 Custom

34、er 對(duì)象持久化到數(shù)據(jù)庫中。tx = session.beginTransaction();session.save(customer);mit();當(dāng)運(yùn)行 session.save() 方法時(shí), Hibernate 執(zhí)行以下 SQL 語句:insert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED,DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME) Shanghai,M,0,I am very honest.,?,1980-05-06,null)

35、關(guān)的映射代碼如下: 在 test() 方法中也沒有設(shè)置 Customer 對(duì)象的 registeredTime 屬性,因此在以上 insert 語 句中,REGISTERED_TIM字段的值為null 。但由于REGISTERED_TIM字段的SQL類型為 TIMESTAMPS型,如果insert 語句沒有為TIMESTAMP類型的字段賦值,底層數(shù)據(jù)庫會(huì)自動(dòng)把當(dāng)前的系統(tǒng)時(shí)間賦值給TIMESTAMPS型的字段。因此,執(zhí)行完以上in sert 語句后,REGISTERED_TIMt段的值并不為null,而是插入該記錄時(shí)的系統(tǒng)時(shí)間。2findAllCustomers() 方法該方法調(diào)用 Sessio

36、n 的 find() 方法,查詢所有的 Customer 對(duì)象。tx = session.beginTransaction();List customers=session.find(from Customer as c order by asc);for (Iterator it = customers.iterator(); it.hasNext();) printCustomer(context,out,(Customer) it.next();mit();Session 的 find() 方法有好幾種重載形式,本例中傳遞的是字符串參數(shù)“ from Customer as

37、c order by asc ”,它使用的是 Hibernate 查詢語言。運(yùn)行 session.find() 方法時(shí), Hibernate執(zhí)行以下SQL語句:select * from CUSTOMERS order by NAME asc;3 loadAndUpdateCustomer () 方法該方法調(diào)用 Session 的 load() 方法,加載 Customer 對(duì)象,然后再修改 Customer 對(duì)象的屬 性。tx = session.beginTransaction();Customer c=(Customer)session.load(Customer.clas

38、s,customer_id);c.setAddress(address);mit();以上代碼先調(diào)用 Session 的 load() 方法,它按照參數(shù)指定的 OID 從數(shù)據(jù)庫中檢索出匹配的Customer對(duì)象,Hibernate 會(huì)執(zhí)行以下SQL語句:select * from CUSTOMERS where ID=1;loadAndUpdateCustomer() 方法接著修改 Customer 對(duì)象的 address 屬性。那么, Hibernate 會(huì)不會(huì)同步更新數(shù)據(jù)庫中相應(yīng)的CUSTOMERS記錄呢?答案是肯定的。Hibernate采用臟檢查機(jī)制,按照內(nèi)存中的 Customer 對(duì)象

39、的狀態(tài)的變化,來同步更新數(shù)據(jù)庫中相關(guān)的數(shù)據(jù), Hibernate會(huì)執(zhí)行以下SQL語句:ADDRESS=Beiji ng盡管只有 Customer 對(duì)象的 address 屬性發(fā)生了變化,但是 Hibernate 執(zhí)行的 update 語句 中會(huì)包含所有的字段。 在 BusinessService 類的 test() 方法中 按如下方式調(diào)用 loadAndUpdateCustomer () 方法:saveCustomer(customer);loadAndUpdateCustomer(customer.getId(),Beijing);以上代碼并沒有直接給 customer 對(duì)象的 id 屬性賦

40、值,當(dāng)執(zhí)行 saveCustomer(customer) 方 法時(shí), Session 的 save() 方法把 customer 對(duì)象持久化到數(shù)據(jù)庫中,并自動(dòng)為 id 屬性賦值。 4. printCustomer() 方法該方法打印 Customer 對(duì)象的信息,它有三種重載形式。當(dāng) helloapp 應(yīng)用作為獨(dú)立應(yīng)用程 序運(yùn)行時(shí),將調(diào)用 printCustomer(PrintStream out,Customer customer) 方法,向控制臺(tái) 輸出Customer信息; 當(dāng)customerApp應(yīng)用作為Java Web應(yīng)用運(yùn)行時(shí),將調(diào)用 printCustomer(ServletCon

41、text context,ServletOuputStream out,Customer customer) 方法向 Web客戶輸出Customer信息:private void printCustomer(ServletContext context,ServletOutputStream out,Customer customer)throws Exception/ 把Customer對(duì)象的image屬性包含的二進(jìn)制圖片數(shù)據(jù)保存到 photo_copy.gif 文件中 byte buffer=customer.getImage();String path=context.getRealPath(/);FileOutputStream fout=new FileOutputStream(path+photo_copy.gif); fout.write(buffer);fout.close();out.println( 以下

溫馨提示

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