SSH框架网上商城项目第5战之商品类别级联查询和分页功能
上文我们完成了EasyUI菜单的实现,点击这里查看,这一节我们主要来写一下CategoryServiceImpl实现类,完成数据库的级联查询。一般项目从后往前做,先做service(我们没有抽取Dao,最后再抽取),做完了再做上面层。
在写之前,先看一下数据库中的表的情况:
dropdatabaseifexistsshop; /*创建数据库,并设置编码*/ createdatabaseshopdefaultcharactersetutf8; useshop; /*删除管理员表*/ droptableifexistsaccount; /*删除商品类别表*/ droptableifexistscategory; /*============================*/ /*Table:管理员表结构*/ /*============================*/ createtableaccount ( /*管理员编号,自动增长*/ idintprimarykeynotnullauto_increment, /*管理员登录名*/ loginvarchar(20), /*管理员姓名*/ namevarchar(20), /*管理员密码*/ passvarchar(20) ); /*============================*/ /*Table:商品类别表结构*/ /*============================*/ createtablecategory ( /*类别编号,自动增长*/ idintprimarykeynotnullauto_increment, /*类别名称*/ typevarchar(20), /*类别是否为热点类别,热点类别才有可能显示在首页*/ hotbooldefaultfalse, /*外键,此类别由哪位管理员管理*/ account_idint, constraintaid_FKforeignkey(account_id)referencesaccount(id) );
主要有两张表,商品类别表和管理员表,并且商品类别表中提供了一个外键关联管理员表。也就是商品和管理员是多对一的关系。现在我们开始编写查询商品的类别信息,需要级联管理员。
1.实现级联查询方法
首先在CategoryService接口中定义该方法:
publicinterfaceCategoryServiceextendsBaseService<Category>{
//查询类别信息,级联管理员
publicList<Category>queryJoinAccount(Stringtype);//使用类别的名称查询
}
然后我们在CategoryService的实现类CategoryServiceImpl中实现这个方法:
@Service("categoryService")
publicclassCategoryServiceImplextendsBaseServiceImpl<Category>implementsCategoryService{
@Override
publicList<Category>queryJoinAccount(Stringtype){
Stringhql="fromCategorycwherec.typelike:type";
returngetSession().createQuery(hql)
.setString("type","%"+type+"%").list();
}
}
在两个Model中我们配一下关联注解:
//Category类中
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="account_id")
publicAccountgetAccount(){
returnthis.account;
}
//Account类中
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="account")
publicSet<Category>getCategories(){
returnthis.categories;
}
然后我们在测试类中测试一下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
publicclassCategoryServiceImplTest{
@Resource
privateCategoryServicecategoryService;
@Test
publicvoidtestQueryJoinAccount(){
for(Categoryc:categoryService.queryJoinAccount("")){
System.out.println(c);
System.out.println(c.getAccount());
}
}
}
2.级联查询存在的问题
我们看一下控制台的输出可以看出,它发了不止一条SQL语句,但是我们明明只查询了一次,为什么会发这么多语句呢?这就是常见的1+N问题。所谓的1+N问题,就是首先发出一条语句查询当前对象,然后发出N条语句查询关联对象,因此效率变得很低。这里就两个对象,如果有更多的对象,那效率就会大打折扣了,我们该如何解决这个问题呢?
可能大家会想到将fetch设置生FetchType.LAZY就不会发多条语句了,但是这肯定不行,因为设置成LAZY后,我们就拿不到Account对象了,比较好的解决方法是我们自己写hql语句,使用joinfetch。具体看修改后的CategoryServiceImpl实现类:
@Service("categoryService")
publicclassCategoryServiceImplextendsBaseServiceImpl<Category>implementsCategoryService{
@Override
publicList<Category>queryJoinAccount(Stringtype){
Stringhql="fromCategorycleftjoinfetchc.accountwherec.typelike:type";
returngetSession().createQuery(hql)
.setString("type","%"+type+"%").list();
}
}
leftjoin表示关联Account一起查询,fetch表示将Account对象加到Category中去,这样就只会发一条SQL语句了,并且返回的Category中也包含了Account对象了。
3.完成分页功能
Hibernate中的分页很简单,只需要调用两个方法setFirstResult和setMaxResults即可:我们修改一下CategoryService接口和它的实现类CategoryServiceImpl:
//CategoryService
publicinterfaceCategoryServiceextendsBaseService<Category>{
//查询类别信息,级联管理员
publicList<Category>queryJoinAccount(Stringtype,intpage,intsize);//并实现分页
}
//CategoryServiceImpl
@Service("categoryService")
publicclassCategoryServiceImplextendsBaseServiceImpl<Category>implementsCategoryService{
@Override
publicList<Category>queryJoinAccount(Stringtype,intpage,intsize){
Stringhql="fromCategorycleftjoinfetchc.accountwherec.typelike:type";
returngetSession().createQuery(hql)
.setString("type","%"+type+"%")
.setFirstResult((page-1)*size)//从第几个开始显示
.setMaxResults(size)//显示几个
.list();
}
}
我们在测试类中测试一下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
publicclassCategoryServiceImplTest{
@Resource
privateCategoryServicecategoryService;
@Test
publicvoidtestQueryJoinAccount(){
for(Categoryc:categoryService.queryJoinAccount("",1,2)){//显示第一页,每页2条数据
System.out.println(c+","+c.getAccount());
}
}
}
为此,我们写完了Service的方法了,完成了对商品类别的级联查询和分页功能。
(注:到最后我会提供整个项目的源码下载!欢迎大家收藏或分享)
原文地址:http://blog.csdn.net/eson_15/article/details/51320212
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。