上一节银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站完成了EasyUI菜单的实现。这一节银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站浸要来写一下CategoryServiceImpl实现类,完成数据库的级联查询。一般项目从后往前做,先做service(银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站没有抽取Dao,着末再抽取),做完了再做上面层。

  正正在写之前,先看一下数据库中的表的情况:

SQL代码
  1. drop database if exists shop;    
  2. /*创建数据库,并设置编码*/    
  3. create database shop default character set utf8;    
  4.     
  5. use shop;    
  6. /*删除牵制员表*/    
  7. drop table if exists account;    
  8. /*删除商种种别表*/    
  9. drop table if exists category;    
  10.     
  11. /*============================*/    
  12. /*      Table:牵制员表构制                       */    
  13. /*============================*/    
  14. create table account    
  15. (    
  16.     /* 牵制员编号,自动增加 */    
  17.     id int primary key not null auto_increment,    
  18.     /* 牵制员银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站名 */    
  19.     login varchar(20),    
  20.     /* 牵制员姓名 */    
  21.     name varchar(20),    
  22.     /* 牵制员密码 */    
  23.     pass varchar(20)    
  24. );    
  25.     
  26. /*============================*/    
  27. /*     Table:商种种别表构制                      */    
  28. /*============================*/    
  29. create table category    
  30. (    
  31.    /* 种别编号,自动增加 */    
  32.    id  int primary key not null auto_increment,    
  33.    /* 种别名称 */    
  34.    type varchar(20),    
  35.    /* 种别是否为热点种别,热点种别才有可能显现正正在银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站*/    
  36.    hot  bool default false,    
  37.    /* 外键,此种别由哪位牵制员牵制 */    
  38.    account_id int,    
  39.    constraint aid_FK foreign key(account_id) references account(id)    
  40. );    

  浸要有两张表,商种种别表和牵制员表,而且商种种别表中提供了一个外键联系牵制员表。也就是商品和牵制员是众对一的关系。现正正在银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站开始编写查询商品的种别信歇,需要级联牵制员。

  1. 实现级联查询方法

  起首正正在CategoryService接口中定义该方法:

Java代码
  1. public interface CategoryService extends BaseService<Category> {    
  2.     //查询种别信歇,级联牵制员    
  3.     public List<Category> queryJoinAccount(String type); //运用类另外名称查询    
  4. }   

   然后银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站正正在CategoryService的实现类CategoryServiceImpl中实现这个方法:

Java代码
  1. @Service("categoryService")    
  2. public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService {    
  3.     
  4.     @Override    
  5.     public List<Category> queryJoinAccount(String type) {    
  6.         String hql = "from Category c where c.type like :type";    
  7.         return getSession().createQuery(hql)    
  8.                 .setString("type""%" + type + "%").list();    
  9.     }    
  10. }    

   正正在两个Model中银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站配一下联系证明:

Java代码
  1. //Category类中    
  2. @ManyToOne(fetch = FetchType.EAGER)    
  3. @JoinColumn(name = "account_id")    
  4. public Account getAccount() {    
  5.     return this.account;    
  6. }    
  7. //Account类中    
  8. @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "account")    
  9. public Set<Category> getCategories() {    
  10.     return this.categories;    
  11. }    

  然后银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站正正在测试类中测试一下:

Java代码
  1. @RunWith(SpringJUnit4ClassRunner.class)    
  2. @ContextConfiguration(locations="classpath:beans.xml")    
  3. public class CategoryServiceImplTest {    
  4.     
  5.     @Resource    
  6.     private CategoryService categoryService;    
  7.         
  8.     @Test    
  9.      public void testQueryJoinAccount() {    
  10.         for(Category c : categoryService.queryJoinAccount("")) {    
  11.              System.out.println(c);    
  12.              System.out.println(c.getAccount());    
  13.         }    
  14.     }    
  15. }    

  2. 级联查询存正正在的问题

  银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站看一下控制台的输出可以看出,它发了不止一条SQL语句,但是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站明明只查询了一次,为什么会发这么众语句呢?这就是常睹的1+N问题。所谓的1+N问题,就是起首发出一条语句查询当前对象,然后发出N条语句查询联系对象,于是效率变得很低。这里就两个对象,如果有更众的对象,那效率就会大打折扣了,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站该怎样解决这个问题呢?

  可能大家会想到将fetch设置生FetchType.LAZY就不会发众条语句了,但是这肯定不行,由于设置成LAZY后,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站就拿不到Account对象了,比拟好的解决方法是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站自己写hql语句,运用join fetch。举座看修改后的CategoryServiceImpl实现类:

Java代码
  1. @Service("categoryService")    
  2. public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService {    
  3.     
  4.     @Override    
  5.     public List<Category> queryJoinAccount(String type) {    
  6.         String hql = "from Category c left join fetch c.account where c.type like :type";    
  7.         return getSession().createQuery(hql)    
  8.                 .setString("type""%" + type + "%").list();    
  9.     }    
  10. }    

  left join表示联系Account一起查询,fetch表示将Account对象加到Category中去,这样就只会发一条SQL语句了,而且返回的Category中也包含了Account对象了。

  3. 完因素页功能

  Hibernate中的分页很简单,只需要调用两个方法setFirstResult和setMaxResults即可:银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站修改一下CategoryService接口和它的实现类CategoryServiceImpl:

Java代码
  1. //CategoryService    
  2. public interface CategoryService extends BaseService<Category> {    
  3.     //查询种别信歇,级联牵制员    
  4.     public List<Category> queryJoinAccount(String type, int page, int size); //并实现分页    
  5. }    
  6.     
  7. //CategoryServiceImpl    
  8. @Service("categoryService")    
  9. public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService {    
  10.     
  11.     @Override    
  12.     public List<Category> queryJoinAccount(String type, int page, int size) {    
  13.         String hql = "from Category c left join fetch c.account where c.type like :type";    
  14.         return getSession().createQuery(hql)    
  15.                 .setString("type""%" + type + "%")    
  16.                 .setFirstResult((page-1) * size) //从第几个开始显现    
  17.                 .setMaxResults(size) //显现几个    
  18.                 .list();    
  19.     }    
  20. }    

  银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站正正在测试类中测试一下:

Java代码
  1. @RunWith(SpringJUnit4ClassRunner.class)    
  2. @ContextConfiguration(locations="classpath:beans.xml")    
  3. public class CategoryServiceImplTest {    
  4.     
  5.     @Resource    
  6.     private CategoryService categoryService;    
  7.     
  8.     @Test    
  9.     public void testQueryJoinAccount() {    
  10.         for(Category c : categoryService.queryJoinAccount("",1,2)) { //显现第一页,每页2条数据    
  11.             System.out.println(c + "," + c.getAccount());    
  12.         }    
  13.     }    
  14. }    

  为此,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站写完了Service的方法了,完成了对商种种别的级联查询和分页功能。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/764.html
2017年9月13日
作家:鸡啄米 分类:软件开发 浏览: 评论:0