mybatis分页(基于springboot+maven)

mybatis分页(基于springboot+maven)

一、引入mybatis依赖和分页插件的依赖

       <!-- SpringBoot集成mybatis框架 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        
       <!--mybaits分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>

二、需要一段查询sql

<select id="queryRecordByPage" resultMap="RegisterMap">
        select
        <include refid="userColumns"></include>
        from t_vistor_register where is_delete='0'
        order by gmt_create desc
</select>

三、需要mapper接口映射xml文件

public interface RegisterMapper{
        /*方法名称与xml中的id相同**/
        List<RegisterInfo> queryRecordByPage();
}

四、 service层的接口和实现类

@Service
public interface VisitorService {
	   
	    /**
	     * 分页查询
	     * @param page 页号
	     * @param limit 每页显示记录数
	     * @return
	     */
	    List< RegisterInfo> findByPage();
}

下面是实现类:

@Service
public class VisitorServiceImpl implements VisitorService{

   	@Override
    public List< RegisterInfo> findByPage(){
        List< RegisterInfo> list = visitorRegisterMapper.queryRecordByPage();
        return list;
     }
}

四、controller

@Controller
public class pageController{
    //pageIndex是要查询的页标识,即页码,页号
	@RequestMapping(value = "/register/list/{pageIndex}",method = RequestMethod.GET)
	    public String findByPage(@PathVariable Integer pageIndex,Model model){
	       //查询第几页,每页几条记录
	       //以下两行代码需紧跟,中间不能有其他查询的代码
	        Page page = PageHelper.startPage(pageIndex, 10);
	        List<RegisterInfo> list  = visitorService.findByPage(pageIndex,10);
	        //设置返回的总记录
	        //这里需要说明以下,如果是new PageInfo<list>则pageInfo.getTotal返回10
	        //条记录,及list的记录数,如果是new PageInfo<Page> 则
	        //pageInfo.getTotal()返回的是符合该查询的所有的记录数,实际情况下我们
	        //需要的是这种,故推荐用new PageInfo<Page>
	        PageInfo<RegisterInfo> pageInfo=new PageInfo<>(list);
	        model.addAttribute("pageInfo",pageInfo);
	        return "pages_register_list";
	    }
}

PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。

但是如果你写出下面这样的代码,就是不安全的用法:

PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。

上面这个代码,应该写成下面这个样子:

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

五、Html页面,我使用的thymeleaf模板

具体的表格里面的内容我就不贴了,下面是分页条的内容,点击可实现分页

<!--显示分页信息-->
<div class="row">
    <!--文字信息-->
    <div class="col-md-6">
        当前第<span th:text="${pageInfo.pageNum}"></span>页 总共 <span th:text="${pageInfo.pages}"></span>页 共<span th:text="${pageInfo.total}"></span>条记录
    </div>

    <!--点击分页-->
    <div class="col-md-6">
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <li>
                    <a th:href="@{/visitor/register/list/1}">首页</a>
                </li>
                <!--上一页-->
                <li th:if="${pageInfo.hasPreviousPage}">
                        <a th:href="@{/visitor/register/list/{page}(page=${pageInfo.pageNum-1})}" aria-label="Previous">
                            <span aria-hidden="true">«</span>
                        </a>
                </li>
                <!--循环遍历连续显示的页面,若是当前页就高亮显示,并且没有链接-->
                <li th:each="list:${pageInfo.navigatepageNums}"
                    th:classappend="${pageInfo.pageNum} eq ${list}?'active'">
                    <a th:href="@{/visitor/register/list/{page}(page=${list})}" th:text="${list}"></a>
                </li>
                <!--下一页-->
                <li th:if="${pageInfo.hasNextPage}">
                    <a th:href="@{/visitor/register/list/{page}(page=${pageInfo.pageNum+1})}" aria-label="Next">
                        <span aria-hidden="true">»</span>
                    </a>
                </li>
                <li>
                    <a th:href="@{/visitor/register/list/{page}(page=${pageInfo.pages})}">尾页</a>
                </li>
            </ul>
        </nav>
    </div>

</div><!--分页end-->

以下是相关图片

在这里插入图片描述
下面是打印的pageInfo的信息
在这里插入图片描述
网上的教程比较杂,这个是自己亲测并在使用,那些要写自己写page类的是因为引入的依赖不一样

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值