分页
介绍
比如数据库中有100条数据, 每页显示十条, 那么就需要十页, 也就是每一次请求中都会带有页数.
分页参数
分页大小
:10
页数
:2
1
2
3
4
5
-- 在 sql 语句中的写法
select * from user limit 0,2
-- 第一个参数是 起始位置,第二个参数是返回多少个
-- 第n(从1开始)页的参数是 页大小*(n-1),页大小
分页插件
实际上这个插件是MybatisPlus自带的. 官方文档
配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// com.neuedu/controller/UserController.java
@EnableTransactionManagement // 事务管理
@Configuration // 配置类,在Spring启动时优先加载
@MapperScan("com.neuedu.mapper") // 写完这个就不用在入口类写了
@Slf4j
public class MybatisPlusConfig {
@Bean // 也是一种注入
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
// SpringBoot启动时就可以加载运行这个类(准确的说是加载所有有@Bean标记的方法)
log.info("MybatisPlusConfig 配置成功");
return paginationInterceptor;
}
}
实体类
1
2
3
4
5
6
7
8
9
10
11
@TableName("user")
@Data
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String birthday;
private String sex;
private String address;
}
接口类
这里可能会产生一个疑问, 要是看后面的xml, 这个架构实际上是 MyBatis, 但是这里却使用了 MyBatisPlus 中的接口的声明方法(同时这个插件也是 MyBatisPlus的插件). 但是这实际上是奏效的, 在单元测试中既可以使用 MyBatisPlus 自带的 insert, update 等, 也可以使用自己在这里定义的 selectPageVo . 或许是这两个架构存在共通之处. 其实结合官网上的资料, MyBatisPlus是对 MyBatis 的一个扩展, 基本只有扩展, 没有修改, 所以这里的兼容也是可以理解的.
1
2
3
4
5
6
// 实际上这里 @Repository 也可以
@Mapper
public interface UserMapper extends BaseMapper<User> {
IPage<User> selectPageVo(Page<?> page);
}
xml
UserMapper.xml
注意这里不需要写 limit 是因为在上文的那个配置类中已经生成了拦截器, 在Mapper操作数据库的时候, 会修改
1
2
3
4
<!-- 不需要加limit -->
<select id="selectPageVo" resultType="com.neuedu.entity.User">
SELECT id,username FROM user
</select>
单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@SpringBootTest
@Slf4j
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void Page() {
Page page = new Page();
page.setSize(2L);
page.setCurrent(3L);
IPage<User> ipage = userMapper.selectPageVo(page);
List<User> list = ipage.getRecords();
for (User user : list) {
log.info("id:" + user.getId() + "\tusername:" + user.getUsername());
}
log.info("总记录: " + ipage.getTotal());
log.info("总页数:" + ipage.getPages());
log.info("当前页:" + ipage.getCurrent());
log.info("页大小: " + ipage.getSize());
}
}
对象与json转换
依赖
1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
java对象转json
1
2
3
4
5
6
7
8
9
10
11
@Test
void Page() {
Page page = new Page();
page.setSize(2L);
page.setCurrent(3L);
IPage<User> ipage = userMapper.selectPageVo(page);
// 字符可以转为Object
// 将对象转为JSON字符串
String json = JSON.toJSONString(ipage);
log.info(json);
}
1
2
// 转换结果
{"current":3,"hitCount":false,"optimizeCountSql":true,"orders":[],"pages":3,"records":[{"id":5,"username":"张三"},{"id":9,"username":"豆豆"}],"searchCount":true,"size":2,"total":6}
json转java对象
1
2
3
4
5
6
@Test
public void testJsonTransUser() {
String json = "{\"address\":\"天津\",\"birthday\":\"2011-01-01\",\"sex\":\"女\",\"username\":\"张三\"}";
User user1 = JSON.parseObject(json, User.class);
log.info(user1.getAddress());
}
天津
返回格式
1
{"code":0,"data":[{"address":"重庆","birthday":"2000-01-01","id":1,"password":"123456","sex":"女","username":"法外狂徒张三"},{"address":"河北省张家口市","birthday":"1903-05-01","id":2,"password":"123456","sex":"女","username":"lishui"},{"address":"河北石家庄市","birthday":"1900-08-01","id":3,"password":"123456","sex":"女","username":"wangwu"},{"address":" 河北石家庄市","birthday":"1900-08-01","id":4,"password":"123456","sex":"女","username":"zhaoliu"},{"address":"北京","birthday":"2010-01-01","id":5,"password":"123456","sex":"女","username":"张三"},{"address":"重庆","birthday":"2000-01-01","id":9,"password":"123456","sex":"女","username":"豆豆"}],"msg":"ok"}
多表查询分页
多表查询只能手动分页. 在select对应的xml文件中对应的查询语句中, 加入limit, 然后在参数中加入有关分页信息的内容(就是新建一个类,然后)