一、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
微信掃一掃
支付寶掃一掃