mybatis分页(不用拦截器)

关于mabatis的分页 在网上看了 好多资料 

基本都是mybatis拦截器分页

在这里 先来做个不用拦截器的分页 当然这个 有自己的缺点 下面到不好的地方我会详细解释的

好啦 我们开始 

我的项目是 用Spring3+Mybatis3开发的  

当然第一步就是搭好环境  建立数据库 这里用的是 SQLServer数据库

这里就不详细介绍这几步了 下面我们开始进入正题:

我们先说说思路  :

1.我们写好我们的分页语句  

2.然后在建立我们的page类 (分也类)

3.在我们的接口里面定义两个 方法  一个是 查询分页数据的 传入的参数是我们的page类  返回的参数是我们的要分页数据的集合

然后在定义一个方法 是获取我们的 总记录数 返回int

4.开始在我们的mapper类里面定义我们的执行SQL的方法  同样也是两个 

5.下面在我们的 spring控制器里面 执行我们具体操作 

   第一就是 请求执行我们的查询数据的方法  返回list 集合

  第二就是 请求执行我们获取总条数的方法   返回的int总条数 放入我们的page类中

6.就是 前台的取值和传值的方法


下面我来说说详细的:

1.sqlserver的分页语句 当然这里贴出来的是放在mybatis配置文件中的sql

<select id="findPageUser"  parameterType="Page" resultType="User">
SELECT top ${pageSize}  t.id, t.name, t.code, t.password, t.status, convert(varchar, t.cdate, 20) as cdate, convert(varchar, t.udate, 20) as udate, convert(varchar, t.ddate, 20) as ddate
FROM t_user t
WHERE t.id NOT IN
          (
          SELECT TOP (${pageSize}*(${pageNo}-1)) id FROM t_user where status=1  ORDER BY id
          )
         and t.status=1 ORDER BY t.id
</select>

   这里我们说说这样写的缺点 虽然这样是可以的mybatis的写法是 #{} 因为在执行的时候 如果用#{}取值的形式写

我们的值会无法识别 报错,用${}代替就可以了 

#{}的取值方法是mybatis封装的防止SQL注入的 如果用上面的方法写的话可能是不安全的 

个人的一点意见:如果做的项目是属于内部网络的那种我感觉这样写还是方便一些的.

2.我们的page类

package com.netmarch.bean; 

import java.io.Serializable;

/** 
 * 对分页的基本数据进行一个简单的封装 
 */  
public class Page implements Serializable{  
   
    /**
	 * 
	 */
	private static final long serialVersionUID = 3668223378839675358L;
	private int pageNo = 1;//页码,默认是第一页  
    private int pageSize = 15;//每页显示的记录数,默认是5  
    private int totalRecord;//总记录数  
    private int totalPage;//总页数  
    public int getPageNo() {  
       return pageNo;  
    }  
   
    public void setPageNo(int pageNo) {  
       this.pageNo = pageNo;  
    }  
   
    public int getPageSize() {  
       return pageSize;  
    }  
   
    public void setPageSize(int pageSize) {  
       this.pageSize = pageSize;  
    }  
   
    public int getTotalRecord() {  
       return totalRecord;  
    }  
   
    public void setTotalRecord(int totalRecord) {  
       this.totalRecord = totalRecord;  
       //在设置总页数的时候计算出对应的总页数,在下面的三目运算中加法拥有更高的优先级,所以最后可以不加括号。  
       int totalPage = totalRecord%pageSize==0 ? totalRecord/pageSize : totalRecord/pageSize + 1;  
       this.setTotalPage(totalPage);  
    }  
   
    public int getTotalPage() {  
       return totalPage;  
    }  
   
    public void setTotalPage(int totalPage) {  
       this.totalPage = totalPage;  
    }

   
} 
3. 开始进行我们的接口的定义 (当然你也要在imp里面实现自己的接口)

/**
	 * 分页查询
	 * @param user
	 * @return
	 */
	public List<User> findPageUser(Page page)throws Exception;
	/**
	 * 获取总行数
	 * @return
	 */
	public int getTotalPage() throws Exception;
imp里的实现方法          userMapper 调用你的mapper执行SQL操作的 方法 下面会有

public List<User> findPageUser(Page page) throws Exception {
		return userMapper.findPageUser(page);
	}

public int getTotalPage() throws Exception {
		return userMapper.getTotalPage();
	}

4.userMapper 定义两个方法

/**
	 * 分页查询
	 * @param user
	 * @return
	 */
	public List<User> findPageUser(Page page);
	/**
	 * 获取总行数
	 * @return
	 */
	public int getTotalPage(); 


5.好了 开始我们controller 处理的方法

@RequestMapping(value = "/user/list", method = RequestMethod.GET)
	public String userList(HttpServletRequest req, Model model,
			RedirectAttributes attr) {
         
		try {
			Page page=new Page();//这里是分页类
<strong></strong><pre name="code" class="java">                        //这边是获取的页面参数传来的是 pageno 也就是当前页  本项目登录的时候就直接进入这个里面所以获取不到pageno要判断一下
                        //在你的page类中已经有默认的值了所以不必担心因为值没有而报错
if(req.getParameter("pageno")!=null && !req.getParameter("pageno").equals("") ){page.setPageNo(Integer.parseInt(req.getParameter("pageno")));}List<User> users=userService.findPageUser(page);//这里就是获取我们的分也后的数据page.setTotalRecord(userService.getTotalPage());//这边是获取总的条数model.addAttribute("pages", page);model.addAttribute("list", users);return "main";} catch (Exception e) {return ExceptionHandler.handle(UserController.class, e, attr);}}

 

6. 前台取值 和上一页下一页的方法(这里没有用ajax 用的话自己修改一下就好了 思路就是那样的不会有多大的变动的)

<img alt="上一页" 
            		src="<c:url value="/images/prev.gif" />" 
            		style="cursor:pointer;" 
            		 onClick="findPage('S')"
            		height="25" /> 
            		当前第${pages.pageNo }页 //共${pages.totalPage }页||<span >
            	共 ${pages.totalRecord }条</span>	
            		<img alt="下一页" 
            		src="<c:url value="/images/next.gif" />" 
            		style="cursor:pointer;" 
            		onClick="findPage('X')"
            		height="25" /> 
            	
            		<input type="hidden" id="pageno" name="pageno" value="${pages.pageNo }"/>
            		<input type="hidden" id="totalpage" name="totalpage" value="${pages.totalPage }"/>	
这里用了两个隐藏域 一个保存最大的页数 一个是保存当前页 方便取值

下面是JS方法

function findPage(page){
	var pageno=document.getElementById("pageno").value*1;//获取页面当前页
	var totalpage=document.getElementById("totalpage").value*1;//获取最大页数
	if(page=="X"){//这是下一页的判断
		if(pageno==totalpage){
			showmsg("已经是最后一页了!");
			return;
		}
		pageno=pageno+1;//满足条件当前页要加一页才能是下一页
	}
	if(page=="S"){//这是上一页的判断
			if(pageno==1){
				showmsg("已经是第一页了!");
				return;
		}
	pageno=pageno-1;//满足条件 当前页减去一页
}
location.href="<c:url value="/user/list" />?pageno="+pageno;//请求与后台的交互
}

这样 整个流程就完成了 

虽然此方法有点漏洞但是 可以更加的有助于我们理解mybatis的拦截器的原理 

明天好好研究一下mybatis拦截器分页的方法和思路。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值