mybatis的四种分页方式:
第一种.数组分页;查询所有数据,放到list里面。调接口取数据的时候通过参数页数,和条数在list里面截取出需要的数据。
第二种.sql分页;通过查询sql的limit限制,limit5,8;从第六条数据开始取出8条数据。
第三种.拦截器分页;实际上是把接口拦截下来,重新组装数据,把需要查询的页数,和条数通过sql查询出来,再返回出去。
第四种.rowbounds分页;使用 RowBounds 分页,非常方便,不需要在 sql 语句中写 limit,mybatis 会自动拼接 sql ,添加 limit。
数组分页:
mybatis接口:List<Student> queryStudentsByArray();
xml配置文件:
<select id="queryStudentsByArray" resultMap="studentmapper"> select * from student </select>
service:
接口 List<Student> queryStudentsByArray(int currPage, int pageSize); 实现接口 @Override public List<Student> queryStudentsByArray(int currPage, int pageSize) { //查询全部数据 List<Student> students = studentMapper.queryStudentsByArray(); //从第几条数据开始 int firstIndex = (currPage - 1) * pageSize; //到第几条数据结束 int lastIndex = currPage * pageSize; return students.subList(firstIndex, lastIndex); //直接在list中截取 }
sql分页:
mybatis接口:List<Student> queryStudentsBySql(Map<String,Object> data);
xml配置文件:
//currIndex:查询起始条 pageSize:返回的条数
<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); return studentMapper.queryStudentsBySql(data); }
拦截器分页:
相关链接:
分页插件:https://segmentfault.com/a/1190000018200373
实现https://www.cnblogs.com/aeolian/p/9229149.html
配置文件SqlMapConfig.xml:
<configuration> <plugins> <plugin interceptor="com.autumn.interceptor.MyPageInterceptor"> <property name="limit" value="10"/> <property name="dbType" value="mysql"/> </plugin> </plugins> </configuration>
/** * @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); }
..........
mybatis配置:
<!--接口--> List<AccountExt> getAllBookByPage(@Param("currPage")Integer pageNo,@Param("pageSize")Integer pageSize);
<!--xml配置文件--> <sql id="getAllBooksql" > acc.id, acc.cateCode, cate_name, user_id,u.name as user_name, money, remark, time </sql> <select id="getAllBook" resultType="com.autumn.pojo.AccountExt" > select <include refid="getAllBooksql" /> from account as acc </select>
controller:
@RequestMapping("/getAllBook") @ResponseBody public Page getAllBook(String pageNo,String pageSize,HttpServletRequest request,HttpServletResponse response){ pageNo=pageNo==null?"1":pageNo; //当前页码 pageSize=pageSize==null?"5":pageSize; //页面大小 //获取当前页数据 List<AccountExt> list = bookService.getAllBookByPage(pageNo,pageSize); //获取总数据大小 int totals = bookService.getAllBook(); //封装返回结果 Page page = new Page(); page.setTotal(totals+""); page.setRows(list); return page; }
Rowbounds分页:
mybatis 中,使用 RowBounds 分页,非常方便,不需要在 sql 语句中写 limit,mybatis 会自动拼接 sql ,添加 limit。
最核心的是在 mapper 接口层,传参时传入 RowBounds(int offset, int limit) 对象,即可完成分页。
接口层: List<Book> selectBookByName(Map<String, Object> map, RowBounds rowBounds); mapper层: List<Book> list = bookMapper.selectBookByName(map, new RowBounds(0, 5)); // new RowBounds(0, 5),即第一页,每页取5条数据