开发工具: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.youkuaiyun.com/qq_28316183/article/details/78122696
总结:操作并不难,但是在使用中,总感觉有时候有点小问题,可能是自己写的不好吧
本文介绍如何在MyBatis中使用PageHelper插件实现高效分页,包括依赖添加、配置文件设置及代码示例。适用于多种数据库,如MySQL,并详细解释了在Struts2框架下具体实现过程。
2500

被折叠的 条评论
为什么被折叠?



