SSH框架網上商城項目第5戰之商品種別級聯查詢和分頁功效。本站提示廣大學習愛好者:(SSH框架網上商城項目第5戰之商品種別級聯查詢和分頁功效)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第5戰之商品種別級聯查詢和分頁功效正文
上文我們完成了EasyUI菜單的完成,點擊這裡檢查,這一節我們重要來寫一下CategoryServiceImpl完成類,完成數據庫的級聯查詢。普通項目從後往前做,先做service(我們沒有抽取Dao,最初再抽取),做完了再做下面層。
在寫之前,先看一下數據庫中的表的情形:
drop database if exists shop; /*創立數據庫,並設置編碼*/ create database shop default character set utf8; use shop; /*刪除治理員表*/ drop table if exists account; /*刪除商品種別表*/ drop table if exists category; /*============================*/ /* Table:治理員表構造 */ /*============================*/ create table account ( /* 治理員編號,主動增加 */ id int primary key not null auto_increment, /* 治理員登錄名 */ login varchar(20), /* 治理員姓名 */ name varchar(20), /* 治理員暗碼 */ pass varchar(20) ); /*============================*/ /* Table:商品種別表構造 */ /*============================*/ create table category ( /* 種別編號,主動增加 */ id int primary key not null auto_increment, /* 種別稱號 */ type varchar(20), /* 種別能否為熱門種別,熱門種別才有能夠顯示在首頁*/ hot bool default false, /* 外鍵,此種別由哪位治理員治理 */ account_id int, constraint aid_FK foreign key(account_id) references account(id) );
重要有兩張表,商品種別表和治理員表,而且商品種別表中供給了一個外鍵聯系關系治理員表。也就是商品和治理員是多對一的關系。如今我們開端編寫查詢商品的種別信息,須要級聯治理員。
1. 完成級聯查詢辦法
起首在CategoryService接口中界說該辦法:
public interface CategoryService extends BaseService<Category> { //查詢種別信息,級聯治理員 public List<Category> queryJoinAccount(String type); //應用種別的稱號查詢 }
然後我們在CategoryService的完成類CategoryServiceImpl中完成這個辦法:
@Service("categoryService") public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { @Override public List<Category> queryJoinAccount(String type) { String hql = "from Category c where c.type like :type"; return getSession().createQuery(hql) .setString("type", "%" + type + "%").list(); } }
在兩個Model中我們配一下聯系關系注解:
//Category類中 @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "account_id") public Account getAccount() { return this.account; } //Account類中 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "account") public Set<Category> getCategories() { return this.categories; }
然後我們在測試類中測試一下:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:beans.xml") public class CategoryServiceImplTest { @Resource private CategoryService categoryService; @Test public void testQueryJoinAccount() { for(Category c : categoryService.queryJoinAccount("")) { System.out.println(c); System.out.println(c.getAccount()); } } }
2. 級聯查詢存在的成績
我們看一下掌握台的輸入可以看出,它發了不止一條SQL語句,然則我們明明只查詢了一次,為何會發這麼多語句呢?這就是罕見的1+N成績。所謂的1+N成績,就是起首收回一條語句查詢以後對象,然後收回N條語句查詢聯系關系對象,是以效力變得很低。這裡就兩個對象,假如有更多的對象,那效力就會年夜打扣頭了,我們該若何處理這個成績呢?
能夠年夜家會想到將fetch設置生FetchType.LAZY就不會發多條語句了,然則這確定不可,由於設置成LAZY後,我們就拿不到Account對象了,比擬好的處理辦法是我們本身寫hql語句,應用join fetch。詳細看修正後的CategoryServiceImpl完成類:
@Service("categoryService") public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { @Override public List<Category> queryJoinAccount(String type) { String hql = "from Category c left join fetch c.account where c.type like :type"; return getSession().createQuery(hql) .setString("type", "%" + type + "%").list(); } }
left join表現聯系關系Account一路查詢,fetch表現將Account對象加到Category中去,如許就只會發一條SQL語句了,而且前往的Category中也包括了Account對象了。
3. 完成份頁功效
Hibernate中的分頁很簡略,只須要挪用兩個辦法setFirstResult和setMaxResults便可:我們修正一下CategoryService接口和它的完成類CategoryServiceImpl:
//CategoryService public interface CategoryService extends BaseService<Category> { //查詢種別信息,級聯治理員 public List<Category> queryJoinAccount(String type, int page, int size); //並完成分頁 } //CategoryServiceImpl @Service("categoryService") public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService { @Override public List<Category> queryJoinAccount(String type, int page, int size) { String hql = "from Category c left join fetch c.account where c.type like :type"; return getSession().createQuery(hql) .setString("type", "%" + type + "%") .setFirstResult((page-1) * size) //從第幾個開端顯示 .setMaxResults(size) //顯示幾個 .list(); } }
我們在測試類中測試一下:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:beans.xml") public class CategoryServiceImplTest { @Resource private CategoryService categoryService; @Test public void testQueryJoinAccount() { for(Category c : categoryService.queryJoinAccount("",1,2)) { //顯示第一頁,每頁2條數據 System.out.println(c + "," + c.getAccount()); } } }
為此,我們寫完了Service的辦法了,完成了對商品種別的級聯查詢和分頁功效。
(注:到最初我會供給全部項目標源碼下載!迎接年夜家珍藏或分享)
原文地址:http://blog.csdn.net/eson_15/article/details/51320212
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。