版权声明:欢迎转载,注明作者和出处就好!如果不喜欢或文章存在明显的谬误,请留言说明原因再踩哦,谢谢,我也可以知道原因,不断进步! https://blog.csdn.net/csonst1017/article/details/85064029
1.首先导入依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.7</version>
</dependency>
2.编写pagehelper自动配置类
package com.qianxun.config;
import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
mport java.util.Properties;
@Configuration//将该类加到spring容器里
public class PageHelperConfig {
@Bean//加上该注解spring容器自动配置
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount", "true");
properties.setProperty("reasonable", "true");
properties.setProperty("dialect","mysql");
pageHelper.setProperties(properties);
return pageHelper;
}
}
3.编写service层接口及其实现类
public interface IMenuService {
//这里请无视参数menu,分页查询不需要menu参数,page表示当前页数,limit表示用户设置的每页显示多少条数据
List<Menu> getMenus(Integer menu,Integer page, Integer limit);
}
@Service
public class MenuServiceImpl implements IMenuService {
private static final Logger log = LogManager.getLogger(MenuServiceImpl.class);
@Autowired
private MenuMapper menuMapper;
/**
* 查询菜单列表(分页)
* @param menu 为1时只返回菜单类型 其它值时返回所有类型(这里请无视该参数)
* @return
*/
@Override
public List<Menu> getMenus(Integer menu, Integer page, Integer limit) {
List<Menu> menuList = null;
if (menu == 1){
menuList = menuMapper.selectMenu();
}else{
menuList = menuMapper.selectAll();//分页查询执行mapper接口的方法
//注意一定要用mapper接口调用执行里面的对应方法!!!调用service接口的方法插件识别不了,会报错!!!
}
return menuList;
}
}
4.编写controller接口
@RestController
public class MenuController extends BaseController {
private static final Logger log = LogManager.getLogger(MenuController.class);
@Autowired
private IMenuService menuService;
/**
* 查询菜单列表
* @paam menu 为1时只返回菜单类型 其它值时返回所有类型(这里请无视该参数)
* @return
*/
@GetMapping("/menu/list/{menu}/{page}/{limit}")
public ResponseBean getMenus(@PathVariable Integer menu,@PathVariable("page") Integer page,@PathVariable("limit") Integer limit){
JSONObject map = new JSONObject();//创建JSONmap来存放JSON数据传到前台
PageHelper.startPage(page -1, limit);//设置数据库分页查询的范围
List<Menu> menus = menuService.getMenus(menu, page, limit);//执行service层的方法
PageInfo<Menu> pageInfo=new PageInfo<>(menus);
map.put("count",pageInfo.getTotal());//获取查询总条数,这里我会在后面解释
map.put("data",menus);
return new ResponseBean(200,"查询成功",map);
}
}
5.使用postman工具测试controller
发送get请求,设置page和limit为3(表示当前页数为3,每页显示3条)
如果已经写好了mapper接口和对应xml,那么这两个是不需要修改的。在这里贴上以上代码执行的mapper接口方法和xml对应的sql。
public interface MenuMapper {
List<Menu> selectAll();
}
<select id="selectAll" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from sys_menu order by num,id
</select>
我们可以看到mapper对应的select语句是没有limit限制的。我们再来看看控制台的输出语句:
可以看到pagehelper插件自动根据传入的page和limit参数拼接上了"limit ?,?"。不用再在mapper接口和xml添加对应的分页查询方法了。
这里可能有人就会要问了,分页是需要获取总记录数的,既然插件只查询要显示的数据,那么它是怎么获取总记录数的呢?
请看图:
可以看到这里执行了一条"SELECT count(0) FROM sys_menu"语句,但是我mapper.xml是没有配置这条语句的。当我们查询分页数据的时候,插件会自动执行一条对应的查询count的sql,不需要我们去额外配置,怎么样,方便吧。
在上面我也在controller接口执行了getTotal()的方法来获取总记录数,具体它是怎么setTotal的有兴趣的朋友可以去看看,我就不贴源码了。
注:
如果没用springboot的话则需要把自动配置类的里的配置写到mybatis-cofig.xml文件里。