Java ee 企業(yè)應(yīng)用開發(fā):第5章 顯示圖書_第1頁
Java ee 企業(yè)應(yīng)用開發(fā):第5章 顯示圖書_第2頁
Java ee 企業(yè)應(yīng)用開發(fā):第5章 顯示圖書_第3頁
Java ee 企業(yè)應(yīng)用開發(fā):第5章 顯示圖書_第4頁
Java ee 企業(yè)應(yīng)用開發(fā):第5章 顯示圖書_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第5章 顯示圖書5.1 開發(fā)步驟5.2 知識點(diǎn):Hibernate高級特性第5章 顯示圖書網(wǎng)上書店左邊為圖書的分類如圖5-1所示,圖書的分類信息是存放在數(shù)據(jù)庫表中的,由程序自動到數(shù)據(jù)庫取得相應(yīng)的數(shù)據(jù)。用戶可以根據(jù)不同的分類,選擇自己感興趣的圖書。圖5-1 頁面左邊的分類目錄第5章 顯示圖書當(dāng)用戶點(diǎn)擊頁面左邊的目錄時(shí),會在頁面右面顯示這種目錄下的所有圖書。如圖5-2所示.:生活類的圖書。圖5-2 顯示生活類圖書第5章 顯示圖書雖然完成了顯示分類圖書的功能,但是如果一個(gè)分類下的圖書數(shù)量很多的話,一次全部顯示出來不管在性能還是用戶瀏覽上都是不好的,所以,將每個(gè)分類的圖書通過分頁的方式顯示出來。效果如

2、圖5-3所示:圖5-3 分頁顯示第5章 顯示圖書用戶在搜索欄輸入書名,可以出現(xiàn)相關(guān)的書籍信息,如圖5-4所示。圖5-4 搜索圖書5.1 開發(fā)步驟5.1.1 顯示圖書分類開發(fā)的步驟:步驟1 DAO步驟2 Service步驟3 Action步驟4 Spring步驟5 JSP具體操作如下:步驟1 DAO在這層,主要涉及到的類和接口是ICatalogDAO和CatalogDAO。在接口ICatalogDAO中定義了getAllCatalogs(),用來得到所有的圖書類別。在類CatalogDAO的getAllCatalogs()方法實(shí)現(xiàn)這個(gè)方法,它到數(shù)據(jù)庫表catalog中得到所有的類別。如圖5-5所

3、示。5.1.1 顯示圖書分類圖5-5 DAO主要類圖5.1.1 顯示圖書分類這兩個(gè)類和接口在工程中的位置如圖5-6所示。圖5-6 文件在項(xiàng)目中的位置 5.1.1 顯示圖書分類ICatalogDAO.java,代碼如下:package org.apex.bookstore.dao; /包名org.apex.bookstore.daoimport java.util.List; /引入所需要的類public interface ICatalogDAO public List getAllCatalogs();/得到所有圖書類別5.1.1 顯示圖書分類CatalogDAO.java,代碼如下:pac

4、kage org.apex.bookstore.dao.impl; /包名org.apex.bookstore.dao.impl/引入所需要的類import java.util.List;import org.apex.bookstore.dao.BaseDAO;import org.apex.bookstore.dao.ICatalogDAO;import org.hibernate.Query;import org.hibernate.classic.Session;public class CatalogDAO extends BaseDAO implements ICatalogDAO

5、/得到所有的圖書種類public List getAllCatalogs() Session session=getSession(); Query query=session.createQuery(from Catalog c); List catalogs=query.list(); session.close(); return catalogs; 5.1.1 顯示圖書分類步驟2 ServiceService層主要涉及ICatalogService接口和CatalogService類。ICatalogSevice中定義了一個(gè)getAllCatalogs()方法,用來獲取所有的圖書種類,

6、而CatalogService則通過ICatalogDAO具體實(shí)現(xiàn)了這個(gè)方法。如圖5-7所示。圖5-7 Service層主要類5.1.1 顯示圖書分類文件在項(xiàng)目中的位置如圖5-8所示圖5-8 文件在項(xiàng)目中的位置5.1.1 顯示圖書分類ICatalogService.java代碼如下:package org.apex.bookstore.service; /包名org.apex.bookstore.serviceimport java.util.List; /引入需要的類public interface ICatalogService public List getAllCatalogs();

7、/得到所有的圖書種類CatalogService.java代碼如下:package org.apex.bookstore.service.impl;import java.util.List;import org.apex.bookstore.dao.ICatalogDAO;import org.apex.bookstore.service.ICatalogService;5.1.1 顯示圖書分類public class CatalogService implements ICatalogService private ICatalogDAO catalogDAO; /屬性catalogDAO

8、/得到素有圖書種類public List getAllCatalogs()return catalogDAO.getAllCatalogs(); /屬性catalogDAO的get方法public ICatalogDAO getCatalogDAO() return catalogDAO;/屬性catalogDAO的set方法public void setCatalogDAO(ICatalogDAO catalogDAO) this.catalogDAO = catalogDAO;5.1.1 顯示圖書分類步驟3 ActionAction層的類為BookAction,類通過browseCatal

9、og()方法來執(zhí)行應(yīng)用程序。如圖5-9所示。圖5-9 Action類圖5.1.1 顯示圖書分類 文件在項(xiàng)目中的位置如圖5-10所示。圖5-10 文件在項(xiàng)目中的位置5.1.1 顯示圖書分類BookAction.java代碼如下:步驟4 Spring配置applicationContext.xml如下:5.1.1 顯示圖書分類步驟5 JSPMenu.jsp在項(xiàng)目中的位置,如圖5-11所示。圖5-11 文件在項(xiàng)目中的位置5.1.1 顯示圖書分類在index.jsp中,將存放menu.jsp的位置修改為以下語句。menu.jsp主要代碼如下 a href=browseBook.action?catal

10、ogid= target=_self 5.1.1 顯示圖書分類為了檢測效果,在MySQL中增加幾條種類記錄:insert into catalog(catalogname) values(生活);insert into catalog(catalogname) values(計(jì)算機(jī));insert into catalog(catalogname) values(少兒);insert into book(bookname,catalogid,price,picture) values(美容護(hù)膚經(jīng),1,22, a11.GIF);insert into book(bookname,catalogi

11、d,price,picture) values(一個(gè)人上東京,1,34, a15.jpgv);insert into book(bookname,catalogid,price,picture) values(可不可以不上班,1,24, a17.jpg);insert into book(bookname,catalogid,price,picture) values(你今天不開心么,1,34, a19.gif);insert into book(bookname,catalogid,price,picute) values(荒漠天使,1,21, a22.gif);insert into bo

12、ok(bookname,catalogid,price,picute) values(我愛你媽媽,1,21, a25.gif);insert into book(bookname,catalogid,price,picture) values(精通J2EE-Eclipse.Struts.Hibernate.Spring整合應(yīng)用案例,2,55, b1.jpg);insert into book(bookname,catalogid,price,picture) values(J2EE權(quán)威指南,2,35, b2.jpg);insert into book(bookname,catalogid,pr

13、ice,picture) values(操作系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),2,40, b3.jpg);insert into book(bookname,catalogid,price,picture) values(Excel應(yīng)用大全,2,88, b4.jpg);insert into book(bookname,catalogid,price,picture) values(網(wǎng)絡(luò)工程師教程,2,66, b5.jpg);insert into book(bookname,catalogid,price,picture) values(神奇的窗子,3,33, c1.jpg);insert into book

14、(bookname,catalogid,price,picture) values(窗邊的小豆豆,3,20, c2.jpg);insert into book(bookname,catalogid,price,picture) values(小狗錢錢,3,16, c3.jpg);insert into book(bookname,catalogid,price,picture) values(朗格彩色童話精選愛心故事,3,18, c4.jpg);insert into book(bookname,catalogid,price,picture) values(我來畫(套裝全十冊)(適合3-6歲

15、小讀者),3,99, c5.jpg);5.1.2 顯示指定類型圖書開發(fā)的步驟:步驟1 DAO步驟2 Service步驟3 Action步驟4 Spring步驟5 JSP具體操作如下步驟1 DAO這層涉及到的主要類如圖5-12所示。IBookDAO接口getBookByCatalogid(),通過某一個(gè)圖書類別id,得到這個(gè)類別下的所有相關(guān)圖書。BookDAO類的getBookByCatalogid()實(shí)現(xiàn)了這個(gè)方法。5.1.2 顯示指定類型圖書圖5-12 DAO主要類5.1.2 顯示指定類型圖書IBookDAO.java代碼如下:package org.apex.bookstore.dao;

16、/包org.apex.bookstore.dao/引入包import java.util.List;import org.bookstore.vo.Book;public interface IBookDAO public List getBookByCatalogid(Integer catalogid); /通過圖書種類id號,得到相應(yīng)的圖書類別BookDAO.java代碼如下:package org.apex.bookstore.dao.impl;import java.util.List;import org.apex.bookstore.dao.BaseDAO;import org.

17、apex.bookstore.dao.IBookDAO;import org.apex.bookstore.vo.Book;import org.apex.hibernate.Query;import org.hibernate.classic.Session;public class BookDAO extends BaseDAO implements IBookDAOprotected Integer catalogid;5.1.2 顯示指定類型圖書public Integer getCatalogid() return catalogid;public void setCatalogid

18、(Integer catalogid) this.catalogid = catalogid;public List getBookByCatalogid(Integer catalogid)Session session=getSession();String hql=from Book b where b.catalog.catalogid=?;Query query=session.createQuery(hql);query.setParameter(0, catalogid);List books=query.list();session.close();return books;5

19、.1.2 顯示指定類型圖書步驟2 ServiceService層主要涉及接口IBookService和類BookService。在IBookService中定義了getBookByCatalogid()方法,用來根據(jù)圖書種類的id號得到相應(yīng)種類的圖書集合。BookService中通過IBookDAO實(shí)現(xiàn)了這個(gè)方法。如圖5-13所示。圖5-13 Service層主要類5.1.2 顯示指定類型圖書IBookService.java代碼如下:public interface IBookService public List getBookByCatalogid(Integer catalogid);

20、 /根據(jù)圖書種類id,得到該種類的所有圖書BookService.java代碼如下:package org.apex.bookstore.service.impl; /包名org.apex.bookstore.service.impl/引入需要的類import java.util.List;import org.bookstore.dao.IBookDAO;import org.bookstore.service.IBookService;import org.bookstore.vo.Book;public class BookService implements IBookService

21、protected IBookDAO bookDAO; /屬性bookDAO /根據(jù)圖書種類id,得到該種類的所有圖書public List getBookByCatalogid(Integer catalogid) 5.1.2 顯示指定類型圖書 /根據(jù)圖書id,得到該圖書 public Book getBookById(Integer bookid)return bookDAO.getBookById(bookid); /屬性bookDAO的get方法public IBookDAO getBookDAO() return bookDAO; /屬性bookDAO的set方法 public vo

22、id setBookDAO(IBookDAO bookDAO) this.bookDAO = bookDAO;步驟3 Action該層用到BookAction類,主要用到browseBook方法得到相應(yīng)的圖書。BookAction.java代碼如下:5.1.2 顯示指定類型圖書步驟4:Spring配置spring applicationContext.xml如下: 步驟5:JSPbrowseBook.jsp代碼如下: 書名: 價(jià)格: img src=/bookstore/picture/5.1.3 分頁顯示指定類型圖書開發(fā)的步驟:步驟1:創(chuàng)建Pager步驟2:DAO步驟3:Service步驟4

23、:Action步驟5:Spring步驟6:JSP具體操作如下:步驟1 創(chuàng)建Pager創(chuàng)建Pager類,類圖如圖5-14所示。該類主要用于存儲分頁的信息。5.1.3 分頁顯示指定類型圖書圖5-14 Pager類圖5.1.3 分頁顯示指定類型圖書Pager類所在的位置,如圖5-15所示。圖5-15 Pager所在位置 5.1.3 分頁顯示指定類型圖書Pager.java代碼如下:步驟2 DAO在此,主要涉及到的接口和類是IBookDAO接口和BookDAO類。如圖5-12所示。IBookDAO接口定義了getBookByCatalogPaging方法,通過圖書的目錄id,得到分頁的圖書。BookD

24、AO實(shí)現(xiàn)了這個(gè)接口方法。主要類和接口在工程中的位置如圖5-13所示。IBookDAO.java代碼如下:public interface IBookDAOpublic List getBookByCatalogid(Integer catalogid); public List getBookByCatalogidPaging(Integer catalogid,int currentPage,int pageSize); public int getTotalByCatalog(Integer catalogid); 5.1.3 分頁顯示指定類型圖書BookDAO.java代碼如下:publ

25、ic List getBookByCatalogidPaging(Integer catalogid,int currentPage,int pageSize)Session session=getSession();Query query=session.createQuery(from Book b where b.catalog.catalogid=?);query.setParameter(0, catalogid); /確定起始游標(biāo)的位置,參看知識點(diǎn)9.3int startRow=(current1)*pageSize;query.setFirstResult(startRow);

26、query.setMaxResults(pageSize);List books=query.list();session.close();return books;public int getTotalByCatalog(Integer catalogid)Session session=getSession();Query query=session.createQuery(from Book b where b.catalog.catalogid=?);query.setParameter(0,catalogid);List books=query.list();int totalSiz

27、e=books.size();session.close();return totalSize;5.1.3 分頁顯示指定類型圖書步驟3 ServiceService層主要涉及到兩個(gè)接口和類:IBookService接口和BookService類。BookService定義的getBookByCatalogidPaging方法,BookService來實(shí)現(xiàn)。IBookService.java代碼如下:package org.apex.bookstore.service;import java.util.List;import org.apex.bookstore.vo.Book;public i

28、nterface IBookService public List getBookByCatalogid(Integer catalogid);public List getBookByCatalogidPaging(Integer catalogid,int currentPage,int pageSize);public int getTotalByCatalog(Integer catalogid);BookService.java代碼如下:5.1.3 分頁顯示指定類型圖書步驟4 ActionBookAction的broweBookPaging方法可以分頁顯示圖書。BookAction.

29、java代碼如下:private Integer currentPage=1;/分頁顯示圖書public String browseBookPaging() throws Exceptionint totalSize=bookService.getTotalByCatalog(catalogid);Pager pager=new Pager(currentPage,totalSize);/List books=bookService.getBookByCatalogid(catalogid);Listbooks=bookService.getBookByCatalogidPaging(cata

30、logid,currentPage, pager.getPageSize();Map request=(Map)ActionContext.getContext().get(request);request.put(books, books);request.put(pager,pager);return SUCCESS;/瀏覽圖書public String browseBook() throws ExceptionList books=bookService.getBookByCatalogid(catalogid);Map request=(Map)ActionContext.getCon

31、text().get(request);request.put(books,books);return SUCCESS;5.1.3 分頁顯示指定類型圖書注冊struts.xml代碼如下: /browseBook.jsp /browseBookPaging.jsp步驟5 SpringapplicationContext.xml不需要配置,前面已經(jīng)配置好。步驟6 JSP修改menu.jsp, 代碼如下: a href=browseBookPaging.action?catalogid= target=_self 創(chuàng)建browseBookPage.jsp,代碼如下5.1.4 搜索圖書開發(fā)的步驟:步驟

32、1:DAO步驟2:Service步驟3:Action步驟4:Spring步驟5:JSP具體操作如下:步驟1 DAOIBookDAO的getRequiredBookByHql定義了搜索圖書的方法,BookDAO具體實(shí)現(xiàn)了這個(gè)方法。IBookDAO.java代碼如下:public interface IBookDAO /根據(jù)種類id得到該種類所有圖書public List getBookByCatalogid(Integer catalogid);/分頁顯示圖書public List getBookByCatalogidPaging(Integer catalogid,int currentPag

33、e,int pageSize);/得到某種類型圖書的圖書數(shù)目public int getTotalByCatalog(Integer catalogid); /得到某種圖書public Book getBookById(Integer bookid); /搜索圖書public List getRequiredBookByHql(String hql);5.1.4 搜索圖書BookDAO.java代碼如下: public List getRequiredBookByHql(String hql) Session session = getSession();Query query = sessi

34、on.createQuery(hql);List books = query.list();return books;步驟2 ServiceIBookService的getRequiredBookByHql定義了搜索方法,BookService具體實(shí)現(xiàn)了這個(gè)方法。IBookService.java代碼如下:public interface IBookService public List getBookByCatalogid(Integer catalogid);public List getBookByCatalogidPaging(Integer catalogid,int current

35、Page,int pageSize);public int getTotalByCatalog(Integer catalogid);public Book getBookById(Integer bookid);public List getRequiredBookByHql(String hql);5.1.4 搜索圖書BookService.javapublic List getRequiredBookByHql(String hql) return bookDAO.getRequiredBookByHql(hql);步驟3 ActionBookAction類通過searchBook方法實(shí)

36、現(xiàn)搜索業(yè)務(wù)邏輯。BookAction.java代碼如下:private int minPrice; /最低價(jià)private int maxPrice; /最高價(jià)private String bookname; /書名/搜索圖書public String searchBook() throws Exception StringBuffer hql = new StringBuffer(from Book b where 1=1 );if(bookname!=null&bookname.length()!=0)hql.append(and b.bookname like % + bookname

37、+%);if(minPrice !=0 & maxPrice !=0)hql.append( and b.price +minPrice + and b.price +maxPrice);List books = bookService.getRequiredBookByHql(hql.toString();Map request = (Map)ActionContext.getContext().get(request);request.put(books,books);return SUCCESS;5.1.4 搜索圖書配置struts.xml,代碼如下:searchBook_result.

38、jsp步驟4 Spring前面章節(jié)已經(jīng)配好步驟5 JSP修改head.jsp, 代碼如下:書名: 創(chuàng)建searchBook_result.jsp, 代碼如下:以下是所有符合條件的圖書:5.1.4 搜索圖書 書名:價(jià)格:img src=/input type=hidden name=bookid value=/ 對不起,沒有合適的圖書!5.1.4 搜索圖書注意: MySQL的亂碼問題模塊完成以后,發(fā)現(xiàn)瀏覽到的信息是一些亂碼。MySQL的亂碼效果的解決,在MySQL中做如下操作步驟1show variables like character_set_%;查看當(dāng)前字符集設(shè)定步驟2 將characte

39、r_set_results和charcter_set_contection設(shè)置為utf8set character_set_results=utf8;set character_set_connection=utf8步驟3 刪除數(shù)據(jù)庫bookstore中的表,重新創(chuàng)建,注意默認(rèn)的字符集為utf8CREATE TABLE XXX( )default charset=utf8;set names gb2312;注意:Struts 2中form提交到action中的中文參數(shù)亂碼問題 /ok.jsp 5.2 知識點(diǎn):HIBERNATE高級特性5.2.1 實(shí)體對象生命周期實(shí)體對象的生命周期,是Hiber

40、nate應(yīng)用中的一個(gè)關(guān)鍵概念。對生命周期的理解和把握,不僅對Hibernate的正確應(yīng)用頗有裨益,而且對Hibernate實(shí)現(xiàn)原理的探索也很有意義。這里的實(shí)體對象,特指Hibernate O/R映射關(guān)系中的域?qū)ο螅碠/R中的“O”)。實(shí)體對象生命周期中的3種狀態(tài) Transient(瞬時(shí)態(tài))瞬時(shí)態(tài),即實(shí)體對象在內(nèi)存中的存在,與數(shù)據(jù)庫中的記錄無關(guān),如:User user=new User();user.setUsername(“Tom“);這里的user對象,與數(shù)據(jù)庫中的記錄沒有任何關(guān)聯(lián)。 Persisent(持久態(tài))持久態(tài)是指對象處于由Hibernate框架所管理的狀態(tài)。這種狀態(tài)下,實(shí)體對象

41、的引用被納入Hibernate實(shí)體容器中加以管理。處于持久狀態(tài)的對象,其變更將由Hibernate固化到數(shù)據(jù)庫中。如:5.2.1 實(shí)體對象生命周期User user=new User();User anotherUser=new User();user.setUsername(“Tom“); /此時(shí)user處于瞬時(shí)態(tài)anotherUser.setUsername(“Grace“); /此時(shí)anotherUser處于瞬時(shí)態(tài)Transaction tx=session.beginTransaction();/通過save()方法,user對象轉(zhuǎn)換為持久態(tài),由Hibernate納入實(shí)體管理容器/而a

42、notherUser仍然處于瞬時(shí)態(tài)session.save(user);/事務(wù)提交之后,庫表中插入一條用戶“Tom”的記錄/對于anotherUser則無任何操作mit();Transaction tx2=session.beginTransaction();user.setUserName(“Tom1“); anotherUser.setUsername(“Grace1“);/雖然這個(gè)事務(wù)中沒有顯示調(diào)用session.save()方法保存user對象/但是由于user為持久態(tài),將自動被固化到數(shù)據(jù)庫/因此數(shù)據(jù)庫的用戶記錄已被更改為“Tom1”/此時(shí)anotherUser仍然是一個(gè)普通Java對

43、象,對數(shù)據(jù)庫產(chǎn)生任何影響mit();5.2.1 實(shí)體對象生命周期處于瞬時(shí)狀態(tài)的對象,可以通過Session的save()方法轉(zhuǎn)換成Persistent狀態(tài)。同樣,如果一個(gè)實(shí)體對象是由Hibernate加載,那么,它也處于持久狀態(tài)。如/由Hibernate返回的持久對象User user=(User)Session.load(User.class,new Integer(1);持久對象對應(yīng)了數(shù)據(jù)庫中的一條記錄,可以看作是數(shù)據(jù)庫記錄的對象化操作接口,其狀態(tài)的變更將對數(shù)據(jù)庫中的記錄產(chǎn)生影響。 Detached(脫管狀態(tài))處于持久狀態(tài)的對象,其對應(yīng)的Session實(shí)例關(guān)閉之后,此對象就處于脫管狀態(tài)。S

44、ession實(shí)例可以看作是持久對象的宿主,一旦此宿主失效,其從屬的持久對象進(jìn)入脫管狀態(tài)。來看實(shí)例:/user處于瞬時(shí)態(tài)User user=new User();User.setUsername(“Tom“);Transaction tx=session.beginTransaction();/user對象由Hibernate納入管理容器,處于持久狀態(tài)session.save(user);mit();/user對象狀態(tài)為脫管態(tài),因?yàn)榕c其關(guān)聯(lián)的session已經(jīng)關(guān)閉session.close();5.2.1 實(shí)體對象生命周期上面的例子中,user對象從瞬時(shí)態(tài)轉(zhuǎn)變?yōu)槌志脩B(tài),又從持久態(tài)轉(zhuǎn)變?yōu)槊摴軕B(tài)。那

45、么,這里的脫管態(tài)和瞬時(shí)態(tài)有什么區(qū)別?區(qū)別在于脫管對象可以再次與某個(gè)Session實(shí)例相關(guān)聯(lián)而成為持久對象。更為重要的是,當(dāng)瞬時(shí)對象執(zhí)行Session.save方法時(shí),user對象的內(nèi)容已經(jīng)發(fā)生了變化。Hibernate對user對象持久化,并為其賦予了主鍵值。這個(gè)user對象自然可以與庫表中具備相同id值的記錄相關(guān)聯(lián)。瞬時(shí)狀態(tài)的user對象與庫表中的數(shù)據(jù)缺乏對應(yīng)關(guān)系,而脫管狀態(tài)的user對象,卻在庫表中存在相對應(yīng)的記錄,只不過由于脫管對象脫離Session這個(gè)數(shù)據(jù)操作平臺,其狀態(tài)的改變無法更新到庫表中對應(yīng)記錄。有時(shí)候,為了方便,將處于瞬時(shí)和脫管狀態(tài)的對象統(tǒng)稱為值對象(Value Object,

46、VO),將處于持久狀態(tài)的對象稱為持久對象(Persistent Object,PO)。這是站在“實(shí)體對象是否被納入Hibernate實(shí)體管理容器”的立場加以區(qū)別的,非管理的實(shí)體對象統(tǒng)稱VO,被管理的對象稱為PO。5.2.2 緩存管理 緩存是提高系統(tǒng)性能的重要手段。在大并發(fā)量的情況下,如果每次程序都需要從數(shù)據(jù)庫直接做查詢操作,它們帶來的性能開銷是顯而易見的。頻繁的數(shù)據(jù)庫磁盤的讀寫操作會大大降低系統(tǒng)的性能。此時(shí),如果能讓數(shù)據(jù)庫在本地內(nèi)存中保留一個(gè)鏡像,下次訪問的時(shí)候只需要從內(nèi)存中直接獲取,顯然可以帶來不小的性能提升。引入緩存機(jī)制的難點(diǎn)是如何保證內(nèi)存中數(shù)據(jù)的有效性,否則,臟數(shù)據(jù)的出現(xiàn)將會給系統(tǒng)帶來難

47、以預(yù)知的嚴(yán)重后果。對于應(yīng)用程序,緩存通過內(nèi)存或磁盤保存了數(shù)據(jù)庫的當(dāng)前有關(guān)數(shù)據(jù)狀態(tài),它是一個(gè)存儲在本地的數(shù)據(jù)備份。緩存位于數(shù)據(jù)庫和應(yīng)用程序之間,從數(shù)據(jù)庫更新數(shù)據(jù),并給程序提供數(shù)據(jù)。Hibernate實(shí)現(xiàn)了良好的緩存機(jī)制,借助Hibernate內(nèi)部的緩存循序提高數(shù)據(jù)讀取性能。Hibernate中的緩存可分為兩層:一級緩存和二級緩存。1一級緩存Session實(shí)現(xiàn)了一級緩存,它是事務(wù)級數(shù)據(jù)緩存。一旦事務(wù)結(jié)束,這個(gè)緩存也就失效。一個(gè)Session的生命周期對應(yīng)一個(gè)數(shù)據(jù)庫事務(wù)或一個(gè)程序事務(wù)。Session-cache 保證一個(gè)Session中兩次請求同一個(gè)對象時(shí),取得的對象是同一個(gè)Java實(shí)例。5.2.2

48、 緩存管理2二級緩存二級緩存是SessionFactory范圍的緩存,所有的Session共享一個(gè)二級緩存。Session在進(jìn)行數(shù)據(jù)查詢操作時(shí),會首先在自身內(nèi)部的一級緩存中進(jìn)行查找,如果一級緩存未能命中,則將在二級緩存中查詢,如果二級緩存命中,則將此數(shù)據(jù)作為結(jié)果返回。在引入二級緩存時(shí),需要考慮是否能使用緩存?哪些數(shù)據(jù)應(yīng)用二級緩存?顯然,若數(shù)據(jù)庫中所有的數(shù)據(jù)都實(shí)施緩存是最簡單的方法,但是,這樣的方式有時(shí)反而會對性能造成影響。比如以下情況:一個(gè)電信話務(wù)系統(tǒng),客戶可以通過這套系統(tǒng)查詢自己的歷史通話記錄。對于每個(gè)客戶,庫表中可能都有成千上萬條數(shù)據(jù),而不同客戶之間,基本不可能共享數(shù)據(jù)(客戶只能查詢自身的

49、通話記錄),如果對此表施以緩存管理,內(nèi)存會迅速被幾乎不可能重復(fù)的數(shù)據(jù)充斥,系統(tǒng)性能急劇下降。因此,在考慮緩存機(jī)制應(yīng)用策略的時(shí)候,應(yīng)該對當(dāng)前系統(tǒng)的數(shù)據(jù)邏輯進(jìn)行考察,以確定最佳的解決方案。在確定了緩存策略后,要挑選一個(gè)高效的緩存,它將作為插件被Hibernate調(diào)用。Hibernate允許使用下述緩存插件:EhCache:可以在JVM中作為一個(gè)簡單進(jìn)程范圍內(nèi)的緩存,它可以把緩存的數(shù)據(jù)放入內(nèi)存或磁盤,并支持Hibernate中可選用的查詢緩存。OpenSymphony OSCache:和EhCache相似,并且提供了豐富的緩存過期策略。SwarmCache:可作為集群范圍的緩存,但不支持查詢緩存。J

50、BossCache:可作為集群范圍的緩存,但不支持查詢緩存。OSCache:可作為集群范圍的緩存,能用于任何Java應(yīng)用程序的普通的緩存解決方案。5.2.3 事務(wù) 事務(wù)是一個(gè)非常重要的概念。本節(jié)將講述JDBC事務(wù),JTA事務(wù)的基本概念,以及并發(fā)數(shù)據(jù)庫訪問過程中要注意的問題。事務(wù)(Transaction)是工作中的基本邏輯單位,可以用于確保數(shù)據(jù)庫能夠被正確修改,避免數(shù)據(jù)只修改了一部分而導(dǎo)致數(shù)據(jù)不完整,或者在修改時(shí)受到用戶干擾。作為一名軟件設(shè)計(jì)師,必須了解事務(wù)并合理利用,以確保數(shù)據(jù)庫保存正確完整的數(shù)據(jù)。1. 基于JDBC的事務(wù)管理Hibernate是JDBC的輕量級封裝,本身并不具備事務(wù)管理能力。

51、在事務(wù)管理層,Hibernate將其委托給底層的JDBC或者JTA,以實(shí)現(xiàn)事務(wù)管理和調(diào)度功能。在JDBC的數(shù)據(jù)庫操作中,一項(xiàng)事務(wù)是由一條或者多條表達(dá)式組成的不可分割的工作單元。我們通過提交commit()或者回滾rollback()來結(jié)束事務(wù)的操作。在JDBC中,事務(wù)默認(rèn)是自動提交。也就是說,一條對數(shù)據(jù)庫的更新表達(dá)式代表一項(xiàng)事務(wù)操作。操作成功后,系統(tǒng)將自動調(diào)用commit()來提交。否則,將調(diào)用rollback()來回滾。在JDBC中,可以通過調(diào)用setAutoCommit(false)來禁止自動提交。之后就可以把多個(gè)數(shù)據(jù)庫操作的表達(dá)式作為一個(gè)事務(wù),在操作完成后調(diào)用commit()來進(jìn)行整體提

52、交。將事務(wù)管理委托給JDBC進(jìn)行處理是最簡單的實(shí)現(xiàn)方式,Hibernate對于JDBC事務(wù)的封裝也比較簡單。5.2.3 事務(wù)看下面這段代碼:Session session=sessionFactory.openSession();Transaction tx=session.beginTransaction();session.save(room);mit();從JDBC層面而言,上面的代碼實(shí)際上對應(yīng)著:Connection cn=getConnection;cn.setAutoCommit(false);/JDBC調(diào)用相關(guān)的SQL語句mit();在sessionFactory.open()語句中,Hibernate會初始化數(shù)據(jù)庫連接。與此同時(shí),將其AutoCommit設(shè)為關(guān)閉狀態(tài)(false)。即一開始從SessionFactory獲得的session,其自動提交屬性已經(jīng)被關(guān)閉。下面的代碼不會對數(shù)據(jù)庫產(chǎn)生任何效果:session session=session.Factory.openSession();session.save(room);session.close();這實(shí)際上相于JDBC Connection的AutoCommit屬性被設(shè)為false,執(zhí)行了若干JDBC操作之后,沒有調(diào)用commit操作。如果要是代碼真正作用到數(shù)據(jù)庫,必須顯示地調(diào)用Transact

溫馨提示

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

評論

0/150

提交評論