「SpringBoot-DAO」 分页

Posted by Dawn-K's Blog on July 5, 2020

分页

介绍

比如数据库中有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, 然后在参数中加入有关分页信息的内容(就是新建一个类,然后)