0 插入数据
因之前删除了部分数据,要体现分页查询的效果,最好添加一些数据。
1 增加插件
在项目中创建一个配置类,在其中增加 MybatisPlus 中用于分页查询的插件,并引入相关类。
因为不同的数据库,用于分页的关键字也有差异,所以需要指定数据库类型:DbType.MYSQL
。
需要在类及方法上添加注解,否则不会被 SpringBoot 扫描到。
类名上添加注解 @Configuration
,方法上添加注解 @Bean
。
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfigureUtil {
//配置分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2 执行查询
2.1 selectPage() 方法查询
在执行查询时,可以调用 selectPage()
方法,该方法中需要使用 Page 对象及 QueryWrapper 对象。
在 Page 对象中,可以指定分页查询时的当前页号、每页条数等信息。如果当前页号是0或者1时,查询的结果都是第1页的内容。
在 QueryWrapper 对象中,可以指定查询条件,这个和普通查询是一样的用法。
例如:查询所有用户中 remark 内容包含 “老师” 的记录:
代码语言:java复制//分页查询
@Test
public void selectUserByPage(){
Page<User> page = new Page<>(2, 2);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("remark", "老师");
IPage<User> iPage = userMapper.selectPage(page, wrapper);
//总页数
System.out.println(iPage.getPages());
//总条数
System.out.println(iPage.getTotal());
//每页条数
System.out.println(iPage.getSize());
//当前页的结果集
System.out.println(iPage.getRecords());
//当前页号
System.out.println(iPage.getCurrent());
}
在控制台中可以看到,实际执行了两次查询:
第一次是查询的总条数;
第二次是使用了 limit 关键字进行分页查询。
==> Preparing: SELECT COUNT(*) AS total FROM user WHERE (remark LIKE ?)
==> Parameters: %老师%(String)
<== Columns: total
<== Row: 5
<== Total: 1
==> Preparing: SELECT id,username,gendar,remark FROM user WHERE (remark LIKE ?) LIMIT ?,?
==> Parameters: %老师%(String), 2(Long), 2(Long)
<== Columns: id, username, gendar, remark
<== Row: 10, 张三, 女, 体育老师
<== Row: 11, 刘能, 男, 演讲老师
<== Total: 2
结果输出:
3
5
2
User{id=10, username='张三', gendar='女', remark='体育老师'}, User{id=11, username='刘能', gendar='男', remark='演讲老师'}
2
2.2 selectMapsPage() 方法查询
查询时,调用了 selectMapsPage()
方法,该方法中仍然需要使用 Page 对象及 QueryWrapper 对象。
和 selectPage()
方法不同的是,这里的 Page 对象必须是 Page<Map<String , Object>>
,泛型必须是 Map<String , Object>。QueryWrapper 对象的使用没有差别。
查询的结果也同样是一个 IPage<Map<String, Object>>
泛型类型的对象。
//分页查询
@Test
public void selectUserByPage2(){
Page<Map<String , Object>> mapPage = new Page<>(2 , 2 );
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("remark", "老师");
IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(mapPage, wrapper);
//总页数
System.out.println("总页数: " iPage.getPages());
//总条数
System.out.println("总条数: " iPage.getTotal());
//每页条数
System.out.println("每页条数: " iPage.getSize());
//当前页的结果集
System.out.println("当前页的结果集: " iPage.getRecords());
//当前页号
System.out.println("当前页号: " iPage.getCurrent());
}
控制台输出可以看到,该方法同样进行了两次查询:
==> Preparing: SELECT COUNT(*) AS total FROM user WHERE (remark LIKE ?)
==> Parameters: %老师%(String)
<== Columns: total
<== Row: 5
<== Total: 1
==> Preparing: SELECT id,username,gendar,remark FROM user WHERE (remark LIKE ?) LIMIT ?,?
==> Parameters: %老师%(String), 2(Long), 2(Long)
<== Columns: id, username, gendar, remark
<== Row: 10, 张三, 女, 体育老师
<== Row: 11, 刘能, 男, 演讲老师
<== Total: 2
结果输出:
总页数: 3
总条数: 5
每页条数: 2
当前页的结果集: {gendar=女, remark=体育老师, id=10, username=张三}, {gendar=男, remark=演讲老师, id=11, username=刘能}
当前页号: 2
与第一种查询结果集不同,因为得到的是Map,因此结果集中字段的位置并不固定。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!