一、导入分页插件依赖

        <!-- MyBatis 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
        </dependency>

二、在MyBatis全局配置文件中,通过SqlSessionFactoryBean配置MyBatis

<!-- 配置SqlSessionFactoryBean整合MyBatis -->
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定MyBatis全局配置文件位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        
        <!-- 指定Mapper.xml配置文件位置 -->
        <property name="mapperLocations" value="classpath:mybatis/mapper/*Mapper.xml"></property>
        
        <!-- 装配数据源 -->
        <property name="dataSource" ref="dataSource"></property>

        <!-- 配置MyBatis插件 -->
        <property name="plugins">
            <bean class="com.github.pagehelper.PageHelper">
                <property name="properties">
                    <props>
                        <!-- 配置数据库方言,告诉PageHelper当前使用的数据库 -->
                        <prop key="dialect">mysql</prop>

                        <!-- 配置页码的合理化修正,限制在1~总页数之间 -->
                        <prop key="reasonable">true</prop>
                    </props>
                </property>
            </bean>
        </property>
    </bean>

三、创建并在mapper中编写方法,以及编写mapper对应的xml文件的sql语句

public interface AdminMapper {
    List<Admin> selectAdminByKeyWord(String keyword);
}
  <select id="selectAdminByKeyWord" resultMap="BaseResultMap">
    select id, login_acct, user_pwd, user_name, email, create_time
    from t_admin
    where login_acct like concat("%",#{keyword},"%") or
    user_name like concat("%",#{keyword},"%") or
    email like concat("%",#{keyword},"%")
  </select>

四、编写对应的Service及其实现类

public interface AdminService {
    PageInfo<Admin> getPageInfo(String keyword,Integer pageNum,Integer pageSize);
}
@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    AdminMapper adminMapper;

    @Override
    public PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize) {
        // 1、通过pageHelper的静态方法开启分页功能
        PageHelper.startPage(pageNum,pageSize);

        // 2、执行查询
        List<Admin> list = adminMapper.selectAdminByKeyWord(keyword);

        // 3、封装到PageInfo对象中
        return new PageInfo<>(list);
    }

五、编写Controller控制器

@Controller
public class AdminController {

    @Autowired
    private AdminService adminService;

    @RequestMapping("/admin-to-user-page.html")
    public String getPageInfo(
            @RequestParam(value = "keyword", defaultValue = "") String keyword,
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
            ModelMap modelMap
    ) {

        PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);

        modelMap.addAttribute(CrowdConstants.MESSAGE_NAME_PAGE_INFO, pageInfo);

        return "admin/admin-user";
    }
}

六、jsp页面显示数据

<table class="table  table-bordered">
    <thead>
    <tr>
        <th width="30">#</th>
        <th width="30"><input type="checkbox"></th>
        <th>账号</th>
        <th>名称</th>
        <th>邮箱地址</th>
        <th width="100">操作</th>
    </tr>
    </thead>
    <tbody>
    <c:if test="${empty requestScope.pageInfo.list }">
        <tr>
            <td colspan="6" align="center">抱歉!没有查询到您要的数据!</td>
        </tr>
    </c:if>
    <c:if test="${!empty requestScope.pageInfo.list }">
        <c:forEach items="${requestScope.pageInfo.list }" var="admin" varStatus="myStatus">
            <tr>
                <td>${myStatus.count }</td>
                <td><input type="checkbox"></td>
                <td>${admin.loginAcct }</td>
                <td>${admin.userName }</td>
                <td>${admin.email }</td>
                <td>
                    <button type="button" class="btn btn-success btn-xs"><i
                            class=" glyphicon glyphicon-check"></i></button>
                    <button type="button" class="btn btn-primary btn-xs"><i
                            class=" glyphicon glyphicon-pencil"></i></button>
                    <button type="button" class="btn btn-danger btn-xs"><i
                            class=" glyphicon glyphicon-remove"></i></button>
                </td>
            </tr>
        </c:forEach>
    </c:if>
    </tbody>
    <tfoot>
    </tfoot>
</table>

七、分页条的显示

这里使用的 Pagination

1、在jsp页面导入css和js

    <!-- 注意这里Pagination 的 css 和 js 必须在JQuery后面 -->
    <link rel="stylesheet" href="css/pagination.css"/>
    <script type="text/javascript" src="jquery/jquery.pagination.js"/>

2、使用 Pagination 要求的div显示分页条

<table class="table  table-bordered">
    <thead>
    <tr>
        <th width="30">#</th>
        <th width="30"><input type="checkbox"></th>
        <th>账号</th>
        <th>名称</th>
        <th>邮箱地址</th>
        <th width="100">操作</th>
    </tr>
    </thead>
    <tbody>
    <c:if test="${empty requestScope.pageInfo.list }">
        <tr>
            <td colspan="6" align="center">抱歉!没有查询到您要的数据!</td>
        </tr>
    </c:if>
    <c:if test="${!empty requestScope.pageInfo.list }">
        <c:forEach items="${requestScope.pageInfo.list }" var="admin" varStatus="myStatus">
            <tr>
                <td>${myStatus.count }</td>
                <td><input type="checkbox"></td>
                <td>${admin.loginAcct }</td>
                <td>${admin.userName }</td>
                <td>${admin.email }</td>
                <td>
                    <button type="button" class="btn btn-success btn-xs"><i
                            class=" glyphicon glyphicon-check"></i></button>
                    <button type="button" class="btn btn-primary btn-xs"><i
                            class=" glyphicon glyphicon-pencil"></i></button>
                    <button type="button" class="btn btn-danger btn-xs"><i
                            class=" glyphicon glyphicon-remove"></i></button>
                </td>
            </tr>
        </c:forEach>
    </c:if>
    </tbody>
    <tfoot>
    <tr>
        <td colspan="6" align="center">
            <div id="Pagination" class="pagination"><!-- 这里显示分页 --></div>
        </td>
    </tr>
    </tfoot>
</table>

八、编写Pagination生成导航条的jQuery代码

<script type="text/javascript">
        $(function () {
            // 调用后面声明的生成导航条函数进行初始化操作
            initPagination();
        });

        // 生成页码导航条的函数
        function initPagination() {
            // 获取总记录数
            var totalRecord = ${requestScope.pageInfo.total};

            // 声明一个Json对象存储Pagination要设置的属性
            var properties = {
                num_edge_entries: 3,                                    // 边缘页数
                num_display_entries: 5,                                 // 主体页数
                callback: pageSelectCallback,                           // 指定用户点击“翻页”的按钮跳转页面的回调函数
                items_per_page: ${requestScope.pageInfo.pageSize},   // 每页要显示的数据的数量
                current_page: ${requestScope.pageInfo.pageNum - 1},  // Pagination内部使用pageIndex来管理页面,pageIndex的索引从0开始,pageNum从1开始
                prev_text: "上一页",                                    // 上一页按钮显示的文本
                next_text: "下一页"                                     // 下一页按钮显示的文本
            };

            // 生成页码导航条
            $("#Pagination").pagination(totalRecord, properties);
        }

        // 点击“上一页、下一页、1、2、3等”实现翻页操作时,调用的回调函数
        // 这里的pageIndex 是 Pagination 传给我们的从“0”开始的页码
        function pageSelectCallback(pageIndex, jQuery) {

            // 根据pageIndex计算得到pageNum
            var pageNum = pageIndex + 1;

            //跳转页面
            window.location.href = "admin-to-user-page.html?pageNum=" + pageNum;

            //由于每一个页码按钮都是超链接,所以在这个函数最后取消超链接的默认行为
            return false;
        }
    </script>

!!!注意:为防止页面无限刷新,陷入死循环,需在jquery.pagination.js 中注释掉

opts.callback(current_page, this);

最后PageHelper分页插件:充分体现了“非侵入式”设计即原本要做的查询不必有任何修改

最后修改:2021 年 07 月 11 日 11 : 34 AM
如果觉得我的文章对你有用,请随意赞赏