当前位置: 首页 > 后端技术 > Java

如何实现一个mybaits分页插件

时间:2023-04-01 15:03:38 Java

前言:分页功能在javaweb项目中经常用到,以常用的持久层框架mybatis为例,它没有提供原生的物理分页功能相关接口,但是mybaits提供了相应的插件功能让我们去做一些相应的扩展。这里我们选择mysql作为数据库。一般我们会直接使用mybatis-helper、mybatis-plus等第三方插件。它们都提供分页功能。我们如何做这些类库?实现:首先我们说到mysql中的分页,就会想到limit关键字;那么在前台使用分页的时候,需要有总页数。分页+条目总数这是一个简单的demo.cache.CacheKey;导入org.apache.ibatis.executor.Executor;导入org.apache.ibatis.mapping.BoundSql;导入org.apache.ibatis.mapping.MappedStatement;导入org.apache.ibatis.mapping.ParameterMapping;导入org.apache.ibatis.plugin.Interceptor;导入org.apache.ibatis.plugin.Intercepts;导入org.apache.ibatis.plugin.Invocation;导入org.apache.ibatis.plugin.Signature;导入org.apache.ibatis.session.ResultHandler;导入org.apache.ibatis.session.RowBounds;导入org.springframework.jdbc.core.JdbcTemplate;导入org.springframework.stereotype.Component;导入java.lang.reflect.Field;导入java.util.ArrayList;导入java.util.List;导入java.util。stream.Collectors;/***@authoryangrd*@date2021/12/7*/@RequiredArgsConstructor@Component@Intercepts({@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class,CacheKey.class,BoundSql.class})})publicclassMyTestInterceptorimplementsInterceptor{privatefinalJdbcTemplatejdbcTemplate;@OverridepublicObjectintercept(Invocationinvocation)throwsThrowable{BoundSqlboundSql=(BoundSql)invocation.getArgs()[5];StringtempSql=boundSql.getSql();MapperMethod.ParamMapparameterObject=(MapperMethod.ParamMap)boundSql.getParameterObject();列表<字符串>argNames=boundSql.get参数映射()。溪流()。地图(参数映射::获取属性)。收集(收集器。toList());对象[]参数=参数名称。溪流()。映射(参数对象::获取)。=计数(tempSql,参数);字段字段=BoundSql.class.getDeclaredField("sql");field.setAccessible(true);field.set(boundSql,String.format("%slimit1,10",tempSql));返回Page.of(count,(ArrayList)invocation.proceed());}@Data@AllArgsConstructor(staticName="of")publicstaticclassPageimplementsList{privateLongtotal;@Delegate私有列表列表;}privateLongcount(StringtempSql,Object[]args){StringcountSql=String.format("selectcount(*)from(%s)t",tempSql);返回jdbcTemplate.queryForObject(countSql,Long.class,args);}}总结:这是一个极其简单的demo,可以作为起点,比如判断是否需要分页,页数,每页的项目数等。这些东西仍然需要改进,但它向我们展示了如何在mybatis中进行分页的核心原则,我想我们到此为止了这个例子,但如果它能给你一些在这个例子之外思考的东西,那就太好了。