最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SSH框架網上商城項目第5戰(zhàn)之商品類別級聯(lián)查詢和分頁功能

 更新時間:2016年05月26日 17:05:55   作者:eson_15  
SSH框架網上商城項目第5戰(zhàn)之商品類別級聯(lián)查詢和分頁功能,寫一下CategoryServiceImpl實現(xiàn)類,完成數據庫的級聯(lián)查詢,感興趣的小伙伴們可以參考一下

上文我們完成了EasyUI菜單的實現(xiàn),點擊這里查看,這一節(jié)我們主要來寫一下CategoryServiceImpl實現(xiàn)類,完成數據庫的級聯(lián)查詢。一般項目從后往前做,先做service(我們沒有抽取Dao,最后再抽取),做完了再做上面層。
在寫之前,先看一下數據庫中的表的情況:

drop database if exists shop; 
/*創(chuàng)建數據庫,并設置編碼*/ 
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) 
); 

主要有兩張表,商品類別表和管理員表,并且商品類別表中提供了一個外鍵關聯(lián)管理員表。也就是商品和管理員是多對一的關系。現(xiàn)在我們開始編寫查詢商品的類別信息,需要級聯(lián)管理員。
1. 實現(xiàn)級聯(lián)查詢方法
首先在CategoryService接口中定義該方法:

public interface CategoryService extends BaseService<Category> { 
  //查詢類別信息,級聯(lián)管理員 
  public List<Category> queryJoinAccount(String type); //使用類別的名稱查詢 
} 

然后我們在CategoryService的實現(xiàn)類CategoryServiceImpl中實現(xiàn)這個方法:

@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中我們配一下關聯(lián)注解:

//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. 級聯(lián)查詢存在的問題
我們看一下控制臺的輸出可以看出,它發(fā)了不止一條SQL語句,但是我們明明只查詢了一次,為什么會發(fā)這么多語句呢?這就是常見的1+N問題。所謂的1+N問題,就是首先發(fā)出一條語句查詢當前對象,然后發(fā)出N條語句查詢關聯(lián)對象,因此效率變得很低。這里就兩個對象,如果有更多的對象,那效率就會大打折扣了,我們該如何解決這個問題呢?
可能大家會想到將fetch設置生FetchType.LAZY就不會發(fā)多條語句了,但是這肯定不行,因為設置成LAZY后,我們就拿不到Account對象了,比較好的解決方法是我們自己寫hql語句,使用join fetch。具體看修改后的CategoryServiceImpl實現(xiàn)類:

@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表示關聯(lián)Account一起查詢,fetch表示將Account對象加到Category中去,這樣就只會發(fā)一條SQL語句了,并且返回的Category中也包含了Account對象了。
3. 完成分頁功能
Hibernate中的分頁很簡單,只需要調用兩個方法setFirstResult和setMaxResults即可:我們修改一下CategoryService接口和它的實現(xiàn)類CategoryServiceImpl:

//CategoryService 
public interface CategoryService extends BaseService<Category> { 
  //查詢類別信息,級聯(lián)管理員 
  public List<Category> queryJoinAccount(String type, int page, int size); //并實現(xiàn)分頁 
} 
 
//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的方法了,完成了對商品類別的級聯(lián)查詢和分頁功能。
(注:到最后我會提供整個項目的源碼下載!歡迎大家收藏或分享)
原文地址:http://blog.csdn.net/eson_15/article/details/51320212
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java中Collections.emptyList()的注意事項

    Java中Collections.emptyList()的注意事項

    這篇文章主要給大家介紹了關于Java中Collections.emptyList()的注意事項,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Linux下java環(huán)境配置圖文方法

    Linux下java環(huán)境配置圖文方法

    這篇文章主要介紹了Linux下java環(huán)境配置圖文方法,需要的朋友可以參考下
    2023-06-06
  • 簡單了解Java方法的定義和使用實現(xiàn)

    簡單了解Java方法的定義和使用實現(xiàn)

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • Mybatis中的@Select、foreach用法

    Mybatis中的@Select、foreach用法

    這篇文章主要介紹了Mybatis中的@Select、foreach用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Mybatis 開發(fā)注解快速入門

    Mybatis 開發(fā)注解快速入門

    mybatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。這篇文章主要介紹了Mybatis 開發(fā)注解快速入門的相關資料,需要的朋友可以參考下
    2016-11-11
  • Springboot訪問html頁面步驟解析

    Springboot訪問html頁面步驟解析

    這篇文章主要介紹了Springboot訪問html頁面過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Java實現(xiàn)ECDSA簽名算法

    Java實現(xiàn)ECDSA簽名算法

    這篇文章主要介紹了Java實現(xiàn)ECDSA簽名算法,幫助大家更好得利用Java實現(xiàn)機器學習算法,感興趣的朋友可以了解下
    2020-10-10
  • SpringBoot處理跨域請求(CORS)的五種方式

    SpringBoot處理跨域請求(CORS)的五種方式

    跨域資源共享(CORS)是現(xiàn)代Web開發(fā)中常見的問題,Spring?Boot提供了多種方式來處理CORS請求,下面我將詳細介紹各種實現(xiàn)方式及其適用場景,需要的朋友可以參考下
    2025-04-04
  • 流式圖表拒絕增刪改查之kafka核心消費邏輯下篇

    流式圖表拒絕增刪改查之kafka核心消費邏輯下篇

    這篇文章主要為大家介紹了流式圖表拒絕增刪改查之kafka核心消費邏輯講解的下篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java并發(fā)編程中的CompletableFuture使用詳解

    Java并發(fā)編程中的CompletableFuture使用詳解

    這篇文章主要介紹了Java并發(fā)編程中的CompletableFuture使用詳解,Future接口定義了操作異步任務執(zhí)行的一些方法,如獲取異步任務執(zhí)行的結果、取消任務的執(zhí)行、判斷任務是否被取消,判斷任務是否執(zhí)行完畢等,需要的朋友可以參考下
    2023-12-12

最新評論

固镇县| 龙泉市| 嘉善县| 康定县| 威远县| 罗甸县| 南乐县| 黄大仙区| 合川市| 昭觉县| 闵行区| 遵义市| 密云县| 晋江市| 武汉市| 象州县| 江孜县| 南投市| 焦作市| 衡南县| 邻水| 临潭县| 静宁县| 昌吉市| 台东市| 桐梓县| 新建县| 成武县| 栾城县| 平江县| 泽州县| 汉寿县| 横山县| 蓬安县| 崇文区| 闻喜县| 潮安县| 凉城县| 罗田县| 井陉县| 营口市|