关于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();
@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拦截器分页的方法和思路。