程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第5戰之商品種別級聯查詢和分頁功效

SSH框架網上商城項目第5戰之商品種別級聯查詢和分頁功效

編輯:關於JAVA

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
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved