在使用SSM整合项目时,经常会遇到分页展示数据的情况,我们可以自己构建页面对象,其中需要包含几个关键属性,比如总记录数,当前页面数,页面的显示条数,以及从数据库查询到数据。另外,我们还可以使用PageHelper插件来辅助完成分页查询的功能,接下来总结一下全注解方式实现PageHelper分页查询功能。
pom.xml文件中的依赖注入:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
配置类中配置PageInterceptor插件的bean对象,并且在SqlSessionfactory中设置plugins属性:
/**项目整体环境搭建*/ @PropertySource("classpath:configs.properties") public class AppRootConfig { /**配置mybatis*/ @Bean("druidDataSource") public DruidDataSource getDruidDataSource( @Value("${jdbcDriver}")String driver, @Value("${jdbcUrl}")String url, @Value("${jdbcUser}")String username, @Value("${jdbcPassword}")String password){ DruidDataSource dataSource=new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } /**配置PageInterceptor插件*/ @Bean public PageInterceptor getPageInterceptor(){ PageInterceptor pageIntercptor=new PageInterceptor(); Properties properties=new Properties(); properties.setProperty("value", "true"); pageIntercptor.setProperties(properties); return pageIntercptor; } @Bean("sqlSessionFactory") public SqlSessionFactoryBean getSqlSessionFactory( DruidDataSource ds, PageInterceptor pageInterceptor) throws IOException{ SqlSessionFactoryBean factory=new SqlSessionFactoryBean(); factory.setDataSource(ds); ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver(); Resource[] mapperLocations=resolver.getResources("classpath:mapper/*.xml"); factory.setMapperLocations(mapperLocations); Interceptor[] plugins={pageInterceptor}; factory.setPlugins(plugins); return factory; } @Bean public MapperScannerConfigurer getScanner(){ MapperScannerConfigurer scanner=new MapperScannerConfigurer(); scanner.setBasePackage("com.jt.**.dao"); return scanner; } }
配置完成之后,进行一个测试,对数据库中的sys_configs表格进行分页查询,先在mapper.xml文件编写sql语句:
<select id="findAllObjects" resultType="com.jt.sys.entity.SysConfig"> select * from sys_configs </select>
dao层接口:
/**dao层接口*/ public interface SysConfigDao { List<SysConfig> findAllObjects(@Param("name")String name); }
业务层接口:
/**业务逻辑层接口*/ public interface SysConfigService { PageInfo<SysConfig> findAllObjects(String name,Integer pageNum); }
业务层实现类,这里的PageInfo是核心对象,它封装了分页查询时所需要的关键数据:
/**业务逻辑层实现类*/ @Service public class SysConfigServiceImpl implements SysConfigService{ @Autowired private SysConfigDao sysConfigDao; @Override public PageInfo<SysConfig> findAllObjects(String name,Integer pageNum) { Integer pageSize=3; PageHelper.startPage(pageNum, pageSize); List<SysConfig> list = sysConfigDao.findAllObjects(name); PageInfo<SysConfig> pageInfo=new PageInfo<>(list); return pageInfo; } }
请求控制层:
/**请求控制层*/ @Controller @RequestMapping("/config/") public class SysConfigController { @Autowired private SysConfigService sysConfigService; @RequestMapping("doConfigListUI") public String doConfigListUI(){ return "sys/config_list"; } @RequestMapping("doFindPageObjects") @ResponseBody public JsonResult doFindPageObjects(String name,Integer pageNum){ PageInfo<SysConfig> po = sysConfigService.findAllObjects(name,pageNum); return new JsonResult(po); } }
可以看到最后将一个PageInfo对象传递给了客户端,在客户端输出这个对象,如图下图所示。其中包含了许多分页查询所需要的关键数据,比如list是数据库数据的集合,pageNum是当前页码数,pageSize是每页显示条数,pages是页面总数,total是总记录数,有了这些数据可以通过js进行分页显示。