Mengimport pergantungan mp terbaharu ialah langkah pertama, jika tidak, tiada apa yang boleh dilakukan dengan versi yang terlalu rendah Nampaknya pemalam paging tidak ditambahkan pada versi di bawah 3 dan 1, jadi kami menggunakan 3.5 terkini. untuk memastikan semuanya disertakan:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency>
Di sini kita perlu mengetahui dua pemalam: pemalam teras mp MybatisPlusInterceptor dan pemalam paging automatik PaginationInnerInterceptor.
Kod sumber MybatisPlusInterceptor (mengalih keluar kod pemprosesan perantaraan):
public class MybatisPlusInterceptor implements Interceptor { private List<InnerInterceptor> interceptors = new ArrayList(); public MybatisPlusInterceptor() {} public Object intercept(Invocation invocation) throws Throwable {} public Object plugin(Object target) {} public void addInnerInterceptor(InnerInterceptor innerInterceptor) {} public List<InnerInterceptor> getInterceptors() {} public void setProperties(Properties properties) {} public void setInterceptors(final List<InnerInterceptor> interceptors) {} }
Kami dapati ia mempunyai senarai atribut peribadi Senarai
Kod sumber InnerInterceptor:
public interface InnerInterceptor { default boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { return true; } default void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { } default boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { return true; } default void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { } default void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { } default void beforeGetBoundSql(StatementHandler sh) { } default void setProperties(Properties properties) { } }
Tidak sukar untuk mencari kandungan antara muka ini secara kasar untuk menetapkan atribut lalai Maksud kod adalah untuk menyediakan beberapa logik untuk dilaksanakan sebelum dan selepas tempoh pelaksanaan operasi pangkalan data lalai Siapakah kaedah yang melaksanakannya mendapat fungsi baharu?
Lihat kod sumber pemalam PaginationInnerInterceptor:
public class PaginationInnerInterceptor implements InnerInterceptor { protected static final List<SelectItem> COUNT_SELECT_ITEM = Collections.singletonList((new SelectExpressionItem((new Column()).withColumnName("COUNT(*)"))).withAlias(new Alias("total"))); protected static final Map<String, MappedStatement> countMsCache = new ConcurrentHashMap(); protected final Log logger = LogFactory.getLog(this.getClass()); protected boolean overflow; protected Long maxLimit; private DbType dbType; private IDialect dialect; protected boolean optimizeJoin = true; public PaginationInnerInterceptor(DbType dbType) { this.dbType = dbType; } public PaginationInnerInterceptor(IDialect dialect) { this.dialect = dialect; } public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { IPage<?> page = (IPage)ParameterUtils.findPage(parameter).orElse((Object)null); if (page != null && page.getSize() >= 0L && page.searchCount()) { MappedStatement countMs = this.buildCountMappedStatement(ms, page.countId()); BoundSql countSql; if (countMs != null) { countSql = countMs.getBoundSql(parameter); } else { countMs = this.buildAutoCountMappedStatement(ms); String countSqlStr = this.autoCountSql(page, boundSql.getSql()); MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql); countSql = new BoundSql(countMs.getConfiguration(), countSqlStr, mpBoundSql.parameterMappings(), parameter); PluginUtils.setAdditionalParameter(countSql, mpBoundSql.additionalParameters()); } CacheKey cacheKey = executor.createCacheKey(countMs, parameter, rowBounds, countSql); List<Object> result = executor.query(countMs, parameter, rowBounds, resultHandler, cacheKey, countSql); long total = 0L; if (CollectionUtils.isNotEmpty(result)) { Object o = result.get(0); if (o != null) { total = Long.parseLong(o.toString()); } } page.setTotal(total); return this.continuePage(page); } else { return true; } } public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {...........省略之后全部的内容........}
Kita boleh dengan mudah mendapati kaedah ini melaksanakan kaedah dalam antara muka InnerInterceptor, jadi kita perlu menyemak kod sumbernya untuk menjelaskan logiknya.
Kami mengetahui hubungan antara pemalam paging dan pemalam teras, iaitu, kami boleh menambah pemalam paging pada senarai dipautkan pemalam di dalam teras pemalam, dengan itu menyedari penggunaan pemalam pelbagai fungsi.
Konfigurasikan pemalam mp dan biarkan spring menguruskan pemalam (kami menggunakan springboot untuk ujian supaya tidak perlu menggunakan fail xml):
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MpConfig { /*分页插件的配置*/ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { /*创建mp拦截器*/ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); /*创建分页插件*/ PaginationInnerInterceptor pagInterceptor = new PaginationInnerInterceptor(); /*设置请求的页面大于最大页容量后的请求操作,true回调第一页,false继续翻页,默认翻页*/ pagInterceptor.setOverflow(false); /*设置单页分页的条数限制*/ pagInterceptor.setMaxLimit(500L); /*设置数据库类型*/ pagInterceptor.setDbType(DbType.MYSQL); /*将分页拦截器添加到mp拦截器中*/ interceptor.addInnerInterceptor(pagInterceptor); return interceptor; } }
Selepas konfigurasi, tulis Mapper antara muka:
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hlc.mp.entity.Product; import org.apache.ibatis.annotations.Mapper; @Mapper public interface ProductMapper extends BaseMapper<Product> { }
Buat kelas perkhidmatan untuk antara muka (mesti mengikut gaya pengekodan mp):
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hlc.mp.entity.Product; import com.hlc.mp.mapper.ProductMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service(value = "ProductService") public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IService<Product> { @Autowired ProductMapper productMapper; /** * 根据传入的页码进行翻页 * * @param current 当前页码(已经约定每页数据量是1条) * @return 分页对象 */ public Page<Product> page(Long current) { /*current首页位置,写1就是第一页,没有0页之说,size每页显示的数据量*/ Page<Product> productPage = new Page<>(current, 1); /*条件查询分页*/ QueryWrapper<Product> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 0); productMapper.selectPage(productPage, queryWrapper); return productPage; } }
Di sini kita dapat melihat bahawa kaedah khusus paging adalah dengan membuat objek paging dahulu, nyatakan nombor halaman dan setiap halaman Saiz data pada satu halaman, dan kemudian tentukan skop operasi pertanyaan, dan gunakan kaedah paging pertanyaan selectPage(Halaman E, Wapper Kelas ujian: Jalankan untuk melihat hasil halaman: Kami dapati bahawa pertanyaan dilakukan secara normal mengikut nombor halaman yang kami lalui dalam Data halaman yang sepadan ada di sana, kerana setiap halaman yang saya sediakan hanya memaparkan satu keping data, jadi jika ID sepadan dengan nombor halaman, ini bermakna paging berjaya. @Test
public void testPage(){
IPage<Product> productIPage = productService.page(2L);
productIPage.getRecords().forEach(System.out::println);
System.out.println("当前页码"+productIPage.getCurrent());
System.out.println("每页显示数量"+productIPage.getSize());
System.out.println("总页数"+productIPage.getPages());
System.out.println("数据总量"+productIPage.getTotal());
}
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan ujian pertanyaan mudah halaman SpringBoot MP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!