Mybatis四种分页方式 数组分页 查询出全部数据,然后再list中截取需要的部分。 mybatis接口 List<Student> queryStudentsByArray();
xml配置文件 <selectid="queryStudentsByArray" resultMap="studentmapper">
select * from student
</select>
service 接口
List<Student> queryStudentsByArray(int currPage, int pageSize);
实现接口
@Override
public List<Student> queryStudentsByArray(int currPage, intpageSize) {
//查询全部数据
List<Student> students =studentMapper.queryStudentsByArray();
//从第几条数据开始
int firstIndex = (currPage - 1) * pageSize;
//到第几条数据结束
int lastIndex = currPage * pageSize;
return students.subList(firstIndex,lastIndex); //直接在list中截取
}
controller @ResponseBody
@RequestMapping("/student/array/{currPage}/{pageSize}")
public List<Student>getStudentByArray(@PathVariable("currPage") int currPage,@PathVariable("pageSize") int pageSize) {
List<Student> student =StuServiceIml.queryStudentsByArray(currPage, pageSize);
return student;
}
sql分页 mybatis接口 List<Student>queryStudentsBySql(Map<String,Object> data);
xml文件 <select id="queryStudentsBySql"parameterType="map" resultMap="studentmapper">
select * from student limit #{currIndex} ,#{pageSize}
</select>
service 接口
List<Student> queryStudentsBySql(int currPage, int pageSize);
实现类
public List<Student> queryStudentsBySql(int currPage, int pageSize) {
Map<String, Object> data = new HashedMap();
data.put("currIndex",(currPage-1)*pageSize);
data.put("pageSize", pageSize);
returnstudentMapper.queryStudentsBySql(data);
}
拦截器分页 创建拦截器,拦截mybatis接口方法id以ByPage结束的语句 package com.autumn.interceptor;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
/**
* @Intercepts 说明是一个拦截器
* @Signature 拦截器的签名
* type 拦截的类型 四大对象之一(Executor,ResultSetHandler,ParameterHandler,StatementHandler)
* method 拦截的方法
* args 参数,高版本需要加个Integer.class参数,不然会报错
*/
@Intercepts({@Signature(type = StatementHandler.class, method ="prepare", args = {Connection.class})})
public class MyPageInterceptor implements Interceptor {
//每页显示的条目数
private int pageSize;
//当前现实的页数
private int currPage;
//数据库类型
private String dbType;
@Override
public Object intercept(Invocation invocation) throws Throwable {
//获取StatementHandler,默认是RoutingStatementHandler
StatementHandler statementHandler =(StatementHandler) invocation.getTarget();
//获取statementHandler包装类
MetaObject MetaObjectHandler =SystemMetaObject.forObject(statementHandler);
//分离代理对象链
while(MetaObjectHandler.hasGetter("h")) {
Object obj =MetaObjectHandler.getValue("h");
MetaObjectHandler =SystemMetaObject.forObject(obj);
}
while(MetaObjectHandler.hasGetter("target")) {
Object obj =MetaObjectHandler.getValue("target");
MetaObjectHandler =SystemMetaObject.forObject(obj);
}
//获取连接对象
//Connection connection = (Connection)invocation.getArgs()[0];
//object.getValue("delegate"); 获取StatementHandler的实现类
//获取查询接口映射的相关信息
MappedStatement mappedStatement =(MappedStatement) MetaObjectHandler.getValue("delegate.mappedStatement");
String mapId = mappedStatement.getId();
//statementHandler.getBoundSql().getParameterObject();
//拦截以.ByPage结尾的请求,分页功能的统一实现
if (mapId.matches(".+ByPage$")) {
//获取进行数据库操作时管理参数的handler
ParameterHandler parameterHandler =(ParameterHandler)MetaObjectHandler.getValue("delegate.parameterHandler");
//获取请求时的参数
Map<String, Object> paraObject =(Map<String, Object>) parameterHandler.getParameterObject();
//也可以这样获取
//paraObject = (Map<String, Object>)statementHandler.getBoundSql().getParameterObject();
//参数名称和在service中设置到map中的名称一致
currPage = (int) paraObject.get("currPage");
pageSize = (int)paraObject.get("pageSize");
String sql = (String)MetaObjectHandler.getValue("delegate.boundSql.sql");
//也可以通过statementHandler直接获取
//sql =statementHandler.getBoundSql().getSql();
//构建分页功能的sql语句
String limitSql;
sql = sql.trim();
limitSql = sql + " limit " +(currPage - 1) * pageSize + "," + pageSize;
//将构建完成的分页sql语句赋值个体'delegate.boundSql.sql',偷天换日
MetaObjectHandler.setValue("delegate.boundSql.sql",limitSql);
}
//调用原对象的方法,进入责任链的下一级
return invocation.proceed();
}
//获取代理对象
@Override
public Object plugin(Object o) {
//生成object对象的动态代理对象
return Plugin.wrap(o, this);
}
//设置代理对象的参数
@Override
public void setProperties(Properties properties) {
//如果项目中分页的pageSize是统一的,也可以在这里统一配置和获取,这样就不用每次请求都传递pageSize参数了。参数是在配置拦截器时配置的。
String limit1 =properties.getProperty("limit", "10");
this.pageSize = Integer.valueOf(limit1);
this.dbType =properties.getProperty("dbType", "mysql");
}
}
配置文件SqlMapConfig.xml <configuration> <plugins> <plugininterceptor="com.autumn.interceptor.MyPageInterceptor"> <propertyname="limit" value="10"/> <property name="dbType" value="mysql"/> </plugin> </plugins> </configuration>
mybatis配置 <!--接口--> List<AccountExt>getAllBookByPage(@Param("currPage")IntegerpageNo,@Param("pageSize")Integer pageSize); <!--xml配置文件--> <sqlid="getAllBooksql" > acc.id,acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time </sql> <selectid="getAllBook" resultType="com.autumn.pojo.AccountExt"> select <includerefid="getAllBooksql" /> from accountas acc </select>
service publicList<AccountExt> getAllBookByPage(String pageNo,String pageSize) { returnaccountMapper.getAllBookByPage(Integer.parseInt(pageNo),Integer.parseInt(pageSize)); }
controller @RequestMapping("/getAllBook") @ResponseBody public PagegetAllBook(String pageNo,String pageSize,HttpServletRequestrequest,HttpServletResponse response){ pageNo=pageNo==null?"1":pageNo; //当前页码 pageSize=pageSize==null?"5":pageSize; //页面大小 //获取当前页数据 List<AccountExt> list =bookService.getAllBookByPage(pageNo,pageSize); //获取总数据大小 inttotals = bookService.getAllBook(); //封装返回结果 Pagepage = new Page(); page.setTotal(totals+""); page.setRows(list); returnpage; }
Page实体类 package com.autumn.pojo; import java.util.List; /** * Created byAutumn on 2018/6/21. */ public class Page { privateString pageNo = null; privateString pageSize = null; privateString total = null; private Listrows = null; publicString getTotal() { returntotal; } public voidsetTotal(String total) { this.total = total; } public ListgetRows() { returnrows; } public voidsetRows(List rows) { this.rows = rows; } publicString getPageNo() { returnpageNo; } public voidsetPageNo(String pageNo) { this.pageNo = pageNo; } publicString getPageSize() { returnpageSize; } public voidsetPageSize(String pageSize) { this.pageSize = pageSize; } }
前端 bootstrap-table接受数据格式 { "total": 3, "rows": [ { "id": 0, "name": "Item 0", "price": "$0" }, { "id": 1, "name": "Item 1", "price": "$1" } }
boostrap-table用法 var $table = $('#table');
$table.bootstrapTable({
url:"/${appName}/manager/bookController/getAllBook",
method: 'post',
contentType:"application/x-www-form-urlencoded",
dataType: "json",
pagination: true, //分页
sidePagination: "server", //服务端处理分页
pageList: [5, 10, 25],
pageSize: 5,
pageNumber:1,
//toolbar:"#tb",
singleSelect: false,
queryParamsType : "limit",
queryParams: function queryParams(params) { //设置查询参数
var param = {
pageNo: params.offset/params.limit+1, //offset为数据开始索引,转换为显示当前页
pageSize: params.limit //页面大小
};
console.info(params); //查看参数是什么
console.info(param); //查看自定义的参数
return param;
},
cache: false,
//data-locale: "zh-CN", //表格汉化
//search: true, //显示搜索框
columns: [
{
checkbox:true
},
{
title: '消费类型',
field:'cate_name',
valign:'middle'
},
{
title: '消费金额',
field:'money',
valign:'middle',
formatter:function(value,row,index){
if(!isNaN(value)){ //是数字
return value/100;
}
}
},
{
title: '备注',
field:'remark',
valign:'middle'
},
{
title: '消费时间',
field:'time',
valign:'middle'
},
{
title: '操作',
field: '',
formatter:function(value,row,index){
var f = '<a href="#" class="btn btn-gmtx-define1"onclick="delBook(\''+ row.id +'\')">删除</a> ';
return f;
}
}
]
});
});
RowBounds分页 数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。 mybatis接口加入RowBounds参数 public List<UserBean> queryUsersByPage(StringuserName, RowBounds rowBounds); service @Override @Transactional(isolation = Isolation.READ_COMMITTED, propagation =Propagation.SUPPORTS) publicList<RoleBean> queryRolesByPage(String roleName, int start, int limit) { returnroleDao.queryRolesByPage(roleName, new RowBounds(start, limit)); }
|