mybatis分页查询需要注意的问题
一般对mybatis的分页查询的关键代码就两行:
#currentPage代表当前页,pageSize代表每页的行数 PageHelper.startPage(currentPage, pageSize); #查询的语句 mapper.select();
一般代码在走到mapper.select()之后,会进入AbstractParser的实现类里面,加入你用的数据库是oracle数据库则会进入OracleParse类里面的
getPageSql(String sql)这个方法里面,得到拼接会的分页sql语句是:
select * from ( select tmp_page.*, rownum row_id from ( sql ) tmp_page where rownum <= ? ) where row_id > ?
其中这个sql变量就是你mapper.select()中对应的sql语句。
但是这个sql分页有一个前提条件:每次mapper.select()查询的结果都是一样的。
你有可能会问mapper.select()这个查询结果又不一样的情况吗?
答案是有的,例如你查询一张表people,这张有一个字段是state ,这个state字段的值有1,2,3 ,你的sql
语句是 select * from people where state in (1,2),每次执行过这条语句之后,这条语句的某些列的值的状态会变成0,那么下次你再执行这条sql语句时,总数将会发生变化。
所以,用pagehelper进行分页会出错。