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://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条数据
来源:https://www.cnblogs.com/lgg20/p/12023246.html