SSM框架中集成TKMybatis+PageHelper实现高效查询和分页

Mybatis 通用 Mapper  极其方便的使用 Mybatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询
优点:
通用 Mapper 可以极大的方便开发人员。 

通用 Mapper 可以缓存,全部针对单表操作,每个实体类都需要继承通用 Mapper 接口来获得通用方法。


TKMybatis依赖包:

javax.persistence-2.1.0.jar

mapper-3.3.8.jar

PageHelper依赖包:

pagehelper-4.0.0.jar

jsqlparser-0.9.1.jar

在pom.xml增加

    tk.mybatis
    mapper
    3.3.8

 
    org.eclipse.persistence
    javax.persistence
    2.1.0

  


    com.github.pagehelper
    pagehelper
    4.0.0


spring-mybatis.xml修改






改为:

tk.mybatis.spring.mapper.MapperScannerConfigurer">
   
   
        
           mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.special.InsertListMapper
       

   

   


给model增加注释

@Table(name = "slee") 
public class SLee implements Serializable {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id;


    private static final long serialVersionUID = 1L;


    public Integer getId() {
        return id;
    }


    public void setId(Integer id) {
        this.id = id;
    }
}


新建一个BaseMapper接口类(名称自定义)并继承Mapper,InsertListMapper

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.special.InsertListMapper;

public interface  BaseMapper extends Mapper,InsertListMapper{

}

修改mapper接口类并注释掉常用方法。也需要注释掉对应mapper.xml里的相关查询

package com.tk.dao; 

import com.tk.entity.SBaby;

import com.tk.util.BaseMapper;

public interface SBabyMapper extends BaseMapper{

 //int deleteByPrimaryKey(Integer id); 

 //int insert(SBaby record);

 //int insertSelective(SBaby record);

}





  
    
  





















 



对应service


package com.tk.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.tk.dao.SBabyMapper;
import com.tk.dao.SLeeMapper;
import com.tk.entity.SBaby;
import com.tk.entity.SLee;
import com.tk.service.ISBabyService;


@Service("sbabyService")
public class SBabyServiceImpl implements ISBabyService{


@Resource
private SBabyMapper babyDao;



public int insertbaby(SBaby baby) {
return babyDao.insertSelective(baby);
}


public List getAll() {
// TODO Auto-generated method stub
return babyDao.selectAll();
}


}
以上就是实现了tkmybatis的过程。通过dao可以直接调用已有的方法,不需要再去写mapper.xml查询就可以直接实现过程接下来配置pagehelper有两种方式:
 第一种:直接在spring-mybatis.xml里配置







   
     
       
         
           dialect=mysql
         

       

     

   





 


第二种:configLocation属性指向的mybatis-config.xml文件,有关分页插件的配置都在mybatis-config.xml 在mybatis-config.xml新增


 
         
         
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
       
 
   
 


通过spring-mybatis.xml进行mybatis-config.xml的引用


 
 
 
 
 
 
 


现在在Controller进行测试


package com.tk.controller;
import java.util.List;




import javax.servlet.http.HttpServletRequest;




import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
 




import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.tk.entity.SBaby;
import com.tk.service.ISBabyService;








@Controller
public class SBabyController {


@Autowired
private ISBabyService sbabyService;




@RequestMapping("getSBaby") 
public String  getAll(HttpServletRequest request)  {
try {
SBaby baby=new SBaby(); 
int a=sbabyService.insertbaby(baby);//插入数据
//获取第2页,5条内容,默认查询总数count
PageHelper.startPage(2, 5);
//PageHelper只对紧跟着的第一个SQL语句起作用
List list=sbabyService.getAll(); //调用service对应的方法
//后面的不会被分页,除非再次调用PageHelper.startPage
List list2=sbabyService.getAll(); //调用service对应的方法
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);




request.setAttribute("STypeLists", list ); 
} catch (Exception e) {
e.printStackTrace();
}


return "listAll";
}




}
对PageHelper的说明:
PageHelper只对紧跟着的第一个SQL语句起作用
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句


如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页


PageHelper.startPage(pageNum, pageSize)
PageHelper.startPage(pageNum, pageSize, count)
PageHelper.startPage(pageNum, pageSize, count, reasonable)
PageHelper.startPage(pageNum, pageSize, count, reasonable, pageSizeZero)
参数说明
pageNum 页码
pageSize 每页显示数量
count 是否进行count查询
reasonable 分页合理化,null时用默认配置
pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
PageInfo page = new PageInfo(list);
//PageInfo全部属性
//PageInfo包含了非常全面的分页属性
page.getPageNum();
page.getPageSize();
page.getStartRow();
page.getEndRow();
page.getTotal();
page.getPages();
page.getFirstPage();
page.getLastPage(); 
page.isIsFirstPage();
page.isIsLastPage();
page.isHasPreviousPage();
page.isHasNextPage();


分页的两种方式:
第一种RowBounds:在mapper.java中的方法中传入RowBounds对象。
第二种PageHelper:在调用查询方法之前调用。PageHelper只对紧跟着的第一个SQL语句起作用.上面主要介绍的是第二种

 
  
 
 

你可能感兴趣的:(mybatis)