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类的是因为引入的依赖不一样