当前位置: 首页 > 编程笔记 >

SSH框架网上商城项目第5战之商品类别级联查询和分页功能

卫招
2023-03-14
本文向大家介绍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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍SSH框架网上商城项目第8战之查询和删除商品类别功能实现,包括了SSH框架网上商城项目第8战之查询和删除商品类别功能实现的使用技巧和注意事项,需要的朋友参考一下 上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加、更新、删除和查询。首先我们实现下前台的显示,然后再做后台获取数据。 1. 添加、更新、删除和查询功能的前台实现 DataGrid控件里有个

  • 本文向大家介绍SSH框架网上商城项目第11战之查询和删除商品功能实现,包括了SSH框架网上商城项目第11战之查询和删除商品功能实现的使用技巧和注意事项,需要的朋友参考一下 在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做了,原理和第8节一模一样,只是修改一些参数,比如请求不同的action等。由于查询和删除商品不需要弹出新的UI窗口,所以我们只要完成完成quer

  • 本文向大家介绍SSH框架网上商城项目第27战之申请域名空间和项目部署及发布,包括了SSH框架网上商城项目第27战之申请域名空间和项目部署及发布的使用技巧和注意事项,需要的朋友参考一下   前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响项目的部署和发布,我们可以先来玩一把,这一节主要介绍下域名空间的申请以及项目的部署和发布流程。 1. 域名空间的申请   作为一个伟

  • 本文向大家介绍java商城项目实战之购物车功能实现,包括了java商城项目实战之购物车功能实现的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下 1 需要实现 1、实现淘淘商城的购物车功能 2 购物车功能 2.1 功能说明 1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。 2、计算购物车中商品的总

  • 本文向大家介绍javaweb实战之商城项目开发(一),包括了javaweb实战之商城项目开发(一)的使用技巧和注意事项,需要的朋友参考一下 一.项目功能结构 1.功能 2.实体 3.对应sql语句 二.项目准备 1.实体类实现 分别建立dao,filter,model,util的包,并在model中实现实体类,这里以User.java为例. 注意对于数据库中外键,比如adress表中有外键user

  • 本页面完成项目后台管理的商品类别信息模块操作 (1). 商品类别信息数据表:type 在数据库 shopdb 中创建type表,若此表已存在请跳过 CREATE TABLE `type` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(