Mybatis的分页查询
示例1:查询业务员的联系记录

1.控制器代码(RelationController.java)
//分页列出联系记录
@RequestMapping(value="toPage/customerRecord")
public String listRelationRecord(Map map,String beginTime,String endTime,
String uname,Long curPage){
Map<String,Object> map1 = new HashMap<String, Object>();
if(beginTime!= null && !"".equals(beginTime)){
map1.put("beginTime",beginTime);
}
if(endTime != null && !"".equals(endTime)){
map1.put("endTime",endTime);
}
if(uname != null && !"".equals(uname)){
map1.put("uname","%"+uname+"%");
}
if(curPage == null){
curPage=(long) 1;
}
Page page = relationService.getPageDataRecord(curPage, 4, map1);
map.put("page", page);
return "Relation/ListRelationRecord";
}
2.服务层代码(RelationService.java)
//分页列出联系记录
public Page getPageDataRecord(long curPage , long pageRows ,Map map){
return relationDaoImpl.getPageDataRecord(curPage, pageRows, map);
}
3.模型层代码(RelationDaoImpl.java)
/**
* 分页列出联系记录
* @param curPage 当前页
* @param pageRows 每页的行数
* @param map 传给mybatis的参数Map
* @return
*/
public Page getPageDataRecord(long curPage , long pageRows ,Map map){
//初始化Page
Page page = new Page(); //获取联系记录的总记录数
long count = session.selectOne(Relation.class.getName()+".getCountRecord",map); //获取总页数=(总记录数+每页的行数-1)/每页的行数。如:总记录数为24条,每页的行数为4条,则共有:(24+4-1)/4=6页
long allPage = (count+pageRows -1)/pageRows; //设置当前页
if(curPage < 1)curPage = 1;//如果当前页小于1则设当前页为第1页
if(allPage > 0 && curPage > allPage ) curPage = allPage;//如果当前页大于总页数则设当前页为总页数(即尾页) //将查询的开始记录偏移量、最大查询记录数放到map中
map.put("start", (curPage -1)* pageRows);//查询记录的偏移量=(当前页-1)*每页的行数。如当前页为2,则查询记录的偏移量为(2-1)*4=4
map.put("stop", pageRows);//最大查询数=每页的行数 //获取联系记录数据
List<Relation> dataList = session.selectList(Relation.class.getName()+".getDataListRecord",map);
//设置page的当前页
page.setCurPage(curPage);
//设置page的每页的行数
page.setPageRows(pageRows);
//设置page的总页数
page.setPageNum(allPage);
//设置page的数据
page.setDataList(dataList);
//返回page
return page;
}
4.Mybatis的映射文件(Relation.xml)
4.1 获取联系记录的总记录数。即在getPageDataRecord方法中long count = session.selectOne(Relation.class.getName()+".getCountRecord",map);语句对应的xml文件中的SQL
<!-- 获取联系记录的总记录数 -->
<select id="getCountRecord" resultType="long" parameterType="Map">
select count(*) from user u,relation r,linkman l,customer c where
r.lid=l.lid and r.uid=u.uid and l.cid=c.cid
<if test="beginTime != null">
<![CDATA[AND redate >= #{beginTime}]]>
</if>
<if test="endTime != null">
<![CDATA[AND redate <= #{endTime}]]>
</if>
<if test="uname != null">
and username like #{uname}
</if>
</select>
4.2 获取联系记录数据。即在getPageDataRecord方法中List<Relation> dataList = session.selectList(Relation.class.getName()+".getDataListRecord",map);语句对应的xml文件中的SQL
<!-- 列出联系记录分页 -->
<select id="getDataListRecord" resultMap="listRelation" parameterType="Map">
select reid,r.lid,content,c.cid,cname,redate,nextdate,nextremark,l.lname,r.uid,u.username,
l.phone,c.statues,c.address from user u,relation r,linkman l,customer c where
r.lid=l.lid and r.uid=u.uid and l.cid=c.cid
<if test="beginTime != null">
<![CDATA[AND redate >= #{beginTime}]]>
</if>
<if test="endTime != null">
<![CDATA[AND redate <= #{endTime}]]>
</if>
<if test="uname != null">
and username like #{uname}
</if>
order by redate desc limit #{start},#{stop}
</select>
说明:因为在控制器RelationController.java中有另一个分页方法,所以在模型层代码(RelationDaoImpl.java)中没有调用父类(BaseDaoImpl.java)的分页方法,下面贴一下此控制器中另一个分页方法——分页列出联系计划。
jsp代码:(ListRelationRecord.jsp)
<jsp:include page="../page.jsp">
<jsp:param value="customerRecord" name="url"/>
</jsp:include>
page.jsp
<body>
<c:set var="url" value="${param.url}"></c:set>
<form name="form" action="${url}" method="post">
<input id="currentPage" type="hidden" name="curPage" />
</form>
<div>
<a href="javascript:toPage(1)">首页</a>
<a href="javascript:toPage(${page.curPage-1})">上一页</a>
<a href="javascript:toPage(${page.curPage+1})">下一页</a>
<a href="javascript:toPage(${page.pageNum})">尾页</a>
一共有【${page.pageNum}】页   
当前第【${page.curPage}】页   
<%-- 当前第
<select onchange="toPage(this.value)">
<c:forEach begin="1" end="${page.pageNum}" var="v">
<option value="${v}"
<c:if test="${v==page.curPage}">
selected="selected"
</c:if>
> ${v}</option>
</c:forEach>
</select> 页 --%>
</div>
<script type="text/javascript">
function toPage(curPage){
//把当前页设置出来
document.getElementById("currentPage").value=curPage;
//提交action
document.forms['form'].submit();
}
</script>
</body>
示例2:分页列出联系计划
1.控制器代码(RelationController.java)
//分页列出联系计划
@RequestMapping(value="toPage/customerPlan")
public String listRelation(Map map,String beginTime,String endTime,
String uname,Long curPage){
Map<String,Object> map1 = new HashMap<String, Object>();
if(beginTime!= null && !"".equals(beginTime)){
map1.put("beginTime",beginTime);
}
if(endTime != null && !"".equals(endTime)){
map1.put("endTime",endTime);
}
if(uname != null && !"".equals(uname)){
map1.put("uname","%"+uname+"%");
}
if(curPage == null){
curPage=(long) 1;
}
Page page = relationService.getRePlanList(curPage, 4, map1);
map.put("page", page);
return "Relation/listRelation";
}
2.服务层代码(RelationService.java)
//分页列出联系计划
public Page getRePlanList(long curPage, long pageRows, Map map){
return relationDaoImpl.getRePlanList(curPage,pageRows,map);
}
3.模型层代码(RelationDaoImpl.java)
@Repository
public class RelationDaoImpl extends BaseDaoImpl<Relation>{
//分页列出联系计划
public Page getRePlanList(long curPage, long pageRows, Map map){
return super.getPageData(curPage, pageRows, map);
} }
4.模型层代码(父类BaseDaoImpl.java)
public class BaseDaoImpl<T>  {
/**
     * 分页
     * @param curPage 当前页
     * @param pageRows 每页的条数
     * @param map
     * @return
     */
    public Page getPageData(long curPage , long pageRows ,Map map){
        Page page = new Page();
        long count = session.selectOne(clazz.getName()+".getCount",map);//获取数据的总条数
        long allPage = (count+pageRows -1)/pageRows;//根据每页的行数+总条数获取总页数
        //设置当前页
        if(curPage < 1)curPage = 1;//如果当前页小于1则设当前页的值为1
        if(allPage > 0 && curPage > allPage ) curPage = allPage;//如果当前页大于总页数则设当前页为总页数
        map.put("start", (curPage -1)* pageRows);//设置查询的起始值
        map.put("stop", pageRows);//设置返回的最大条数——即每页的行数
        //获取数据
        List<T> dataList = session.selectList(clazz.getName()+".getDataList",map);
        page.setCurPage(curPage);//当前页
        page.setPageRows(pageRows);//每页的行数
        page.setPageNum(allPage);//总页数
        page.setDataList(dataList);//数据
        return page;
    }
}
5.Mybatis的映射文件(Relation.xml)
5.1 获取联系计划的总记录数。即在getPageData方法中 long count = session.selectOne(clazz.getName()+".getCount",map);语句对应的xml文件中的SQL
<!-- 获取联系计划的总记录数 -->
<select id="getCount" resultType="long" parameterType="Map">
select count(*) from
linkman l,relation r,customer c,user u where
r.lid=l.lid and r.uid=u.uid and l.cid=c.cid and nextdate>now()
<if test="beginTime != null">
<![CDATA[AND nextdate >= #{beginTime}]]>
</if>
<if test="endTime != null">
<![CDATA[AND nextdate <= #{endTime}]]>
</if>
<if test="uname != null">
and username like #{uname}
</if>
</select>
5.2获取联系计划的数据。即在getPageData方法中 List<T> dataList = session.selectList(clazz.getName()+".getDataList",map);语句对应的xml文件中的SQL
<!-- 获取联系计划分页数据 -->
<select id="getDataList" resultMap="listRelation" parameterType="Map">
Select reid,redate,content,nextdate, nextremark,u.uid,username,
l.lid,l.lname,lsex,l.phone,c.cid,cname,c.statues,c.address from
linkman l,relation r,customer c,user u where
r.lid=l.lid and r.uid=u.uid and l.cid=c.cid and nextdate>now()
<if test="beginTime != null">
<![CDATA[AND nextdate >= #{beginTime}]]>
</if>
<if test="endTime != null">
<![CDATA[AND nextdate <= #{endTime}]]>
</if>
<if test="uname != null">
and username like #{uname}
</if>
order by nextdate desc limit #{start},#{stop}
</select>
Mybatis的分页查询的更多相关文章
- Mybatis包分页查询java公共类
		
Mybatis包分页查询java公共类 分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...
 - springmvc+mybatis 实现分页查询
		
为简化分页功能,设计了一个分页的JSP标签,只需要在页面使用分页标签,就可以完成所有页面的分页功能. 1. 项目结构和数据库设计 (1) 项目结构: (2) 数据库设计 2. PageModel.ja ...
 - spring-boot 集合mybatis 的分页查询
		
spring-boot 集合mybatis 的github分页查询 一.依赖包 <!-- mysql 数据库驱动. --> <dependency> <groupId&g ...
 - 使用mybatis实现分页查询示例代码分析
		
*******************************************分页查询开始*************************************************** ...
 - mybatis之分页查询
		
1)StudentDao.java /** * 持久层*/ public class StudentDao { /** * 增加学生 */ public void add(Student studen ...
 - SpringBoot整合Mybatis关于分页查询的方法
		
最近公司在用到SpringBoot整合Mybatis时当web端页面数据增多时需要使用分页查询以方便来展示数据.本人对分页查询进行了一些步骤的总结,希望能够帮助到有需要的博友.如有更好的方式,也希望评 ...
 - Mybatis 使用分页查询亿级数据 性能问题 DB使用ORACLE
		
一般用到了mybatis框架分页就不用自己写了 直接用RowBounds对象就可以实现,但这个性能确实很低 今天我用到10w级得数据分页查询,到后面几页就迭代了很慢 用于记录 1.10万级数据如下 [ ...
 - mybatis中分页查询
		
1 如果在查询方法中有多个参数,可以使用map对象将所有数据都存储进去.比如分页查询,需要用到两个参数,可以将这两个参数包装到map中. 例子:分页查询 dao层方法 public List<S ...
 - MyBatis学习总结(12)——Mybatis+Mysql分页查询
		
package cn.tsjinrong.fastfile.util; /** * @ClassName: Page * @Description: TODO(分页组件的父类,用来封装分页的 通用 ...
 
随机推荐
- linux/centos下安装nginx(rpm安装和源码安装)详细步骤
			
Centos下安装nginx rpm包 ...
 - Amoeba For MySQL入门:实现数据库水平切分
			
当系统数据量发展到一定程度后,往往需要进行数据库的垂直切分和水平切分,以实现负载均衡和性能提升,而数据切分后随之会带来多数据源整合等等问题.如果仅仅从应用程序的角度去解决这类问题,无疑会加重应用程度的 ...
 - C++ 的隱式型別轉換
			
先上一段代碼, 這段代碼竟然可以編譯過,我的老天! class Boo { Boo(int c){ cout << "I'm Boo"; } }; void do_so ...
 - 多进程之间的互斥信号量实现(Linux和windows跨平台)
			
多线程之间实现互斥操作方式很多种,临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),事件(Event)等方式 其中临界区,互斥量,信号量算是严格意义的实现 ...
 - Adobe Photoshop CS4 Extended CS4 激活序列号
			
Adobe Photoshop CS4 Extended CS4 激活序列号(SN):1330-1779-4488-2103-6954-09161330-1170-1002-7856-5023-077 ...
 - 小技巧:SystemTray中进行操作提示
			
SystemTray中进行操作提示在wp中应用比较广泛,截图如下. 实现方法也十分简单 1.xaml代码中写入: shell:SystemTray.IsVisible="True" ...
 - Ueditor中增加迅雷下载支持
			
在项目中有遇到需要在Ueditor中加一个链接,迅雷的开头是thunder 会被默认加上http:// 最后的 结果就变成了http://thunder://xxxxx 导致用户点击失败: 其实在 ...
 - 【NetOffice Excel】Excel合并单元格【原】
			
CSharp操作Excel采用开源的原生.NET程序集NetOffice,格式兼容性更好. 在操作Excel的时候有时候需要合并单元格 using ExcelOffice = NetOffice.Ex ...
 - 【转】sqlserver查询数据库中有多少个表
			
sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects ...
 - maven增量编译
			
最近由于不清楚maven(2.2.x)增量编译的机制,导致应用出现了一个当时觉得非常诡异的一个问题.先描述一下问题. 背景是应用A有一个公用的base包,版本为1.6.6-SNAPSHOT,应 ...