c语言编程笔录

首页 >   > 笔记大全

笔记大全

Java中Mybatis分页查询的传参方式有哪些

更新时间:2023-10-20

前言:

Mybatis是一种持久层框架,广泛应用于Java项目中。在数据库查询中,通常会遇到数据量较大的情况,为了提高查询效率和减少内存占用,可以使用分页查询的方式,将查询结果划分为若干页进行分批加载。Mybatis提供了多种传参方式来实现分页查询,本文将介绍其中几种常用的方式。

1. 通过参数对象传递分页信息

在Java中,可以通过定义一个参数对象,将分页信息作为该对象的属性进行传递。通常可以定义一个包含页码、每页条数等分页相关属性的类。接下来,在Mybatis映射文件中,通过#{paramName.propertyName}的方式获取参数值,并在SQL语句中使用LIMIT关键字进行分页。以下是示例代码:

public class PageParam {
    private int pageNum;
    private int pageSize;
    // 省略getter和setter方法
}

// Mybatis映射文件
<select id="getUserList" resultType="User" parameterType="PageParam">
    SELECT * FROM user
    LIMIT #{pageNum}, #{pageSize}
</select>

// 调用示例
PageParam pageParam = new PageParam();
pageParam.setPageNum(1);
pageParam.setPageSize(10);
List<User> userList = sqlSession.selectList("getUserList", pageParam);

2. 使用RowBounds进行分页

Mybatis提供了RowBounds类来进行分页查询,通过设置起始行号和每页条数来实现。可以在调用查询方法时,传递一个RowBounds对象作为参数来指定查询范围。以下是示例代码:

RowBounds rowBounds = new RowBounds((pageNum - 1) * pageSize, pageSize);
List<User> userList = sqlSession.selectList("getUserList", null, rowBounds);

3. 使用Mybatis插件实现分页

Mybatis提供了插件机制,可以通过插件对Mybatis的功能进行扩展。可以自定义一个Interceptor实现类,通过拦截SQL语句,自动根据传入的分页参数进行分页查询。以下是示例代码:

public class PageInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 获取分页参数
        PageParam pageParam = null;
        Object[] args = invocation.getArgs();
        for (Object arg : args) {
            if (arg instanceof PageParam) {
                pageParam = (PageParam) arg;
                break;
            }
        }
        if (pageParam == null) {
            throw new RuntimeException("未传递分页参数");
        }

        // 拦截分页查询SQL语句,添加分页限制
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        BoundSql boundSql = mappedStatement.getBoundSql(args[1]);
        String sql = boundSql.getSql();
        String limitSql = "SELECT * FROM (" + sql + ") t LIMIT ?, ?";
        String countSql = "SELECT COUNT(*) FROM (" + sql + ") t";
        args[0] = changeSql(mappedStatement, boundSql, limitSql);
        args[2] = new RowBounds((pageParam.getPageNum() - 1) * pageParam.getPageSize(), pageParam.getPageSize());

        // 执行查询并返回结果
        Object result = invocation.proceed();
        resultMap.put("totalCount", getTotalCount(mappedStatement, boundSql, countSql));
        return result;
    }

    // 省略其他方法
}

// 调用示例
PageParam pageParam = new PageParam();
pageParam.setPageNum(1);
pageParam.setPageSize(10);
List<User> userList = sqlSession.selectList("getUserList", pageParam);

总结:

本文介绍了在Java中使用Mybatis进行分页查询的几种传参方式。通过参数对象进行传参,可以将分页信息作为该对象的属性进行传递;使用RowBounds类进行传参,可以指定查询范围;通过自定义Mybatis插件实现分页,可以拦截SQL语句并根据传入的分页参数进行分页查询。在实际开发中,可以根据具体需求选择合适的方式来实现分页查询,以提高查询效率和减少内存占用。