一、引言
虽然每个人几乎都用过分页查询,但是一些同学不理解物理分页和逻辑分页。
物理分页:相当于执行limit分页语句并返回部分数据。 分页仅适用于某些数据占用内存和获取数据库最新状态、可实施性强、数据量大、数据更新频繁的场景。
逻辑页面www.cppcns.com :一次检索所有数据,通过程序筛选数据。 如果在数据量大的情况下消耗大量内存,逻辑分页只需读取数据库一次,因此非常适合无法获取数据库最新状态、实施性差、数据量少、数据稳定的情况。
那么,如何实现MP的物理寻呼呢? 往下看往下看
二.部署
要创建MybatisPlusConfig配置类,必须设置页面插件、小编使用的Spring boot配置方法。
//*
* @Auther: IT贱男人
* @Date: 2019/6/12 15:06
* @Description: MybatisPlus设置类
*/
@Configuration
公共类mybatisplusconfig {
//*
*页面插件
* @return
*/
@Bean
publicpaginationinterceptorpaginationinterceptor {
返回新页面中断器(
}
}
三.实现具体分页
MP的Wrapper有两种分页查询方法:
//*
根据实体条件查询所有记录(翻页) ) ) )。
*
* @param page分页条件(也可以是RowBounds.DEFAULT ) ) ) ) ) ) ) )。
* @param queryWrapper实体对象包操作类(可为null ) )。
*/
ipageselectpage(ipagepage,@param ) constants.wrapper ) Wrapper queryWrapper );
//*
根据Wrapper条件查询所有记录(翻页) ) ) )。
*
* @ param分页条件
* @ param查询wrapper实体对象包操作类
*/
ipageselectmapspage(ipagepage,@param ) constants.wrapper ) Wrapper queryWrapper );
您可以看到这两种分页方法的参数是一致的,但返回参数略有不同,具体选择基于实际业务。
//*
分页查询
*/
@Test
公共语音选择字节页(
querywrapperwrapper=newquerywrapper (;
wapper.like('name ','雨').lt ) ' age ',40 );
page page=new page (1,2 );
//ipageuseripage=user mapper.select page (page,wrapper );
ipagemapipage=user mapper.selectmapspage (page,wrapper );
System.out.println ('总页数' mapIPage.getPages ) );
System.out.println (总记录数) mapIPage.getTotal );
list records=mapi page.getrecords (;
records.foreach (system.out :3360 println;
}
上述分页查询按以下方式运行sql : 首先查询一次总记录数,然后查询查询中的数据。
debug==preparing :选择计数(1) FROM user WHERE name LIKE? AND age?
调试==parameters : %雨%(string ),40 ) integer () ) ) ) ) ) ) ) ) )。
跟踪==columns 3360 count (1) )。
TRACE==Row: 2
DEBUG==Preparing: SELECT id,name,age,email,manager_id,create _ timefromuserwherenamelike? AND age? LIMIT?
DEBUG==
Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)TRACE<== Columns: id, name, age, email, manager_id, create_time
TRACE<== Row: 2, xsdzfj, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<== Row: 3, 腼腆的画笔, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<== Total: 2
总页数1
总记录数2
现在我们有需求只要查询数据即可, 不关
Page page = new Page<>(1,2,false);
四、自定义sql分页查询
有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,
先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。
步骤一:在mapper文件中,编写对应的分页查询接口。
步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。
/**
* 自定义sql分页
* @param page
* @param queryWrapper 看这里看这里,如果自定义的方法中需要用到wrapper查询条件,需要这样写
* @return
*/
IPage selectMyPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
SELECT * FROM user ${ew.customSqlSegment}
/**
* 自定义sql分页查询
*/
@Test
public void selectByMyPage() {
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
Pagewww.cppcns.com page = new Page<>(1,2);
IPage mapIPage = userMapper.selectMyPage(page, wrapper);
System.out.println("总页数"+mapIPage.getPages());
System.out.println("总记录数"+mapIPage.getTotal());
List records = mapIPage.getRecords();
records.forEach(System.out::println);
}
五、多表sql分页查询
看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。
小编以简单的为主,sql如下: his_ipd_encounter、his_user 两张表
select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象
/**
*
* 用户 Mapper 接口
*
*
* @author IT贱男
* @since 2019-06-14
*/
public interface UserMapper extends MyMapper {
/**
* 多表查询分页
* @param page
* @return
*/
IPage selectByHisName(IPage page);
}
测试如下:通过查看日志,执行的sql加了分页条件的。
@Test
public void select(){
// 创建分页参数
Page page = new Page<>(1,2);
IPage result = userMapper.selectByHisName(page);
// 获取数据
List records = result.getRecords();
records.forEach(System.out::println);
System.out.println("总页数 = "+ result.getPages());
}
ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
INFO
迷人的白开水
csdxg
总页数 = 59
到此这篇关于MyBatis-Plus 分页查询以及自定义sql分页的实现的文章就介绍到这了,更多相关MyBatis-Plus 自定义sql分页内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题: MyBatis-Plus 分页查询以及自定义sql分页的实现
本文地址: http://www.cppcns.com/ruanjian/java/338172.html