在使用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进行分页显示。