开发工具:IDEA
使用框架:mybatis+Struts2+spring
项目类型:BBS论坛
原始的分页方式需要在sql语句中进行控制分页,但是在使用中,我们期待更好的方式来实现分页,比如mybatis的pagehelper或者sqlhelper(支持更多类型数据库)。 以下简单示例 pagehelper :
1.添加依赖
我使用的是5.1.10,注意版本,4和5在操作中有区别,springboot项目请添加 pagehelper-spring-boot-starter ,其他依赖请自行补全
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.10</version> </dependency>
2. 配置文件
2.1 mybatis配置文件mybatis_config.xml(自定义名)中配置
<plugins> <!--注意这里要写成PageInterceptor, 5.0之前的版本都是写PageHelper, 5.0之后要换成PageInterceptor,所有要注意版本--> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql" /> <!--其他数据库自行更改 --> <property name="reasonable" value="true" /> </plugin> </plugins>
2.2 spring配置文件中配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 --> <property name="dataSource" ref="dataSource"/> <!-- 给实体类起别名 --> <property name="typeAliasesPackage" value="cn.javamap.pojo"/> <!-- ***配置分页插件pagehelper*** --> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <prop key="helperDialect">mysql</prop> <prop key="reasonable">true</prop> <prop key="autoRuntimeDialect">true</prop> </props> <!-- 下面注释的写法也是可以的,但是总感觉不好看 --> <!--<value> helperDialect=mysql reasonable=true autoRuntimeDialect=true </value>--> </property> </bean> </array> </property> <!-- 加载mybatis配置文件 --> <!-- <property name="configLocation" value="classpath:mybatis_config.xml"></property>--> <!-- 自动扫描cn/javamap/dao/包下的所有配置文件 --> <property name="mapperLocations"> <list> <value>classpath:cn/javamap/dao/*Mapper.xml</value> </list> </property> <!-- 当mybatis的xml文件和mapper接口不在相同包下时,需要用mapperLocations属性指定xml文件的路径。 *是个通配符,代表所有的文件,**代表所有目录下 --> <!-- <property name="mapperLocations" value="classpath:cn/javamap/dao/*.xml" />--> </bean>
**** dao层 *和* service层自行补全,sql语句中不需要进行分页操作
3. 方法操作(由于使用的Struts2,所有事在action中操作,springmvc需稍作变化)
3.1 操作分页的实体类(可省略)
@Component public class Page { private Long totalNum; //查询总共记录数 private Integer pageCount; //总共页数 private Integer pageNo; //当前页数 private Integer pageSize; //每页数量 //变量可以直接定义为 int,包装类我在使用中报了类型装换异常,所以下面把 pageNo 的get+set方法改成了int,别的没变 public Page() { this.pageNo = 1; //初始化当前页面为第一页 this.pageSize = 4; //初始化每页个数4个 } public int getPageNo() { return pageNo; } // pageNo在页面中需要进行运算,改成int型,不然会报类型装换异常,很坑 public void setPageNo(int pageNo) { this.pageNo = pageNo; } }
3.2 分页方法
//如果没有创建分页实体类的,可以直接在类里给出变量 public String boardList() { //第一步至关重要,开启分页,注意 page.getPageNo() 我是在构造方法里给值的 PageHelper.startPage(page.getPageNo(), 5); //查询语句,返回的是List集合,写自己的查询 topicList = topicService.selectByBoardId(board.getBoardid()); // 分页操作,创建 PageInfo 对象,泛型写上面List的,参数就给上面List PageInfo<Topic> topicPageInfo = new PageInfo<Topic>(topicList); }
================================================================
4. 页面操作
共${page.totalNum}条 第${page.pageNo}/${page.pageCount}页 <c:if test="${page.pageNo<=1}"> 首页 上一页 </c:if> <%-- 页码不是首页时,“首页”和“上一页”可跳转访问 --%> <c:if test="${page.pageNo>1}"> <a href="TopicAction_boardList?page.pageNo=1 & board.boardid=${board.boardid}">首页</a> <a href="TopicAction_boardList?page.pageNo=${page.pageNo-1} & board.boardid=${board.boardid}">上一页</a> </c:if> <%-- 定义数字页码 --%> <c:forEach var="p" begin="1" end="${page.pageCount}"> <c:if test="${p == page.pageNo}"> ${p} </c:if> <c:if test="${p != page.pageNo}"> <a href="TopicAction_boardList?page.pageNo=${p} & board.boardid=${board.boardid}">${p} </a> </c:if> </c:forEach> <%-- 页码为尾页时,“尾页”和“下一页”不可访问 --%> <c:if test="${page.pageNo>=page.pageCount}"> 下一页 尾页 </c:if> <%-- 页码不是尾页时,“尾页”和“下一页”可跳转访问 --%> <c:if test="${page.pageNo<page.pageCount}"> <a href="TopicAction_boardList?page.pageNo=${page.pageNo+1} & board.boardid=${board.boardid}">下一页</a> <a href="TopicAction_boardList?page.pageNo=${page.pageCount} & board.boardid=${board.boardid}">尾页</a> </c:if>
上述页面其实很麻烦,可以参考附加链接朋友的页面操作 https://blog.csdn.net/qq_28316183/article/details/78122696
总结:操作并不难,但是在使用中,总感觉有时候有点小问题,可能是自己写的不好吧