一、PageHelper插件簡介
PageHelper是一個基於Mybatis或者Spring JDBC的分頁插件,它可以快速地將大數據量的查詢結果進行分頁處理。
在傳統的分頁模式下,如果查詢結果集非常龐大,應用程序需要將所有數據一次性取回,並且通過程序邏輯手動分頁,這樣會導致內存佔用增大、性能下降。而PageHelper的分頁插件可以直接在SQL層面完成分頁操作,降低了內存消耗,提高了分頁效率。
// Spring Boot中配置PageHelper的示例代碼 @Configuration public class PageHelperConfig { @Bean public PageHelper pageHelper() { PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("dialect", "mysql"); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); return pageHelper; } }
二、PageHelper實現原理
PageHelper的原理主要是通過對PreparedStatement進行攔截,動態地修改SQL語句的內容,從而實現分頁效果。
當我們在使用PageHelper進行分頁查詢的時候,PageHelper會將我們傳入的SQL語句進行攔截,並根據我們傳遞的分頁參數動態地修改SQL語句的內容,將原本的查詢語句變成一個分頁查詢語句。
例如,我們有如下SQL查詢語句:
SELECT * FROM user WHERE age > 18
當我們在使用PageHelper進行分頁查詢的時候,PageHelper會將這個查詢語句動態地修改為:
SELECT * FROM user WHERE age > 18 limit 10, 20
當我們執行這個SQL語句的時候,就可以得到從第10條記錄開始的20條記錄,從而實現了分頁查詢。
三、PageHelper的核心介面
PageHelper的核心介面是com.github.pagehelper.PageInterceptor和com.github.pagehelper.PageHelper,其中PageInterceptor是Mybatis的SQL攔截器,PageHelper是Spring JDBC的分頁切面。
使用PageInterceptor的示例代碼:
// Mybatis中配置PageInterceptor的示例代碼 @Configuration @AutoConfigureAfter(MybatisConfig.class) public class PageInterceptorConfig { @Autowired private MybatisProperties mybatisProperties; @Bean public PageInterceptor pageInterceptor() { PageInterceptor pageInterceptor = new PageInterceptor(); Properties properties = new Properties(); properties.setProperty("helperDialect", "mysql"); properties.setProperty("offsetAsPageNum", "true"); properties.setProperty("rowBoundsWithCount", "true"); properties.setProperty("pageSizeZero", "true"); properties.setProperty("reasonable", "true"); pageInterceptor.setProperties(properties); return pageInterceptor; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); Resource[] resources = new PathMatchingResourcePatternResolver() .getResources(mybatisProperties.getMapperLocations()[0]); factoryBean.setMapperLocations(resources); Interceptor[] interceptors = {pageInterceptor()}; factoryBean.setPlugins(interceptors); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
使用PageHelper的示例代碼:
// Spring JDBC中配置PageHelper的示例代碼 @Configuration public class PageHelperConfig { @Bean public PageHelper pageHelper() { PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("dialect", "mysql"); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); return pageHelper; } @Bean(name = "dataSource") @Profile({"dev", "test", "pre", "stg", "prod"}) @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().type(DruidDataSource.class).build(); } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }
四、PageHelper的常見問題
1、PageHelper的不支持Spring Data JPA
因為Spring Data JPA是基於JPA規範的,而PageHelper是在Mybatis或Spring JDBC的基礎上實現的,所以PageHelper並不支持Spring Data JPA。
2、PageHelper的不支持子查詢
PageHelper的分頁插件在實現原理上是基於SQL語句的攔截和修改,而子查詢本身就比較複雜,因此PageHelper的插件默認是不支持子查詢的。如果需要在子查詢中使用PageHelper,需要手動開啟或者自定義實現。
3、PageHelper的兼容性問題
PageHelper的插件需要和框架本身進行兼容,因此在進行升級和使用新版本的PageHelper的時候需要注意框架兼容性和配置的問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/298163.html