mybatis实现分页的两种方式
逻辑分页
newBound方式实现
在MyBatis的Mapper接口中定义方法,传入RowBounds对象作为方法的参数,指定需要的结果范围。
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.RowBounds;
import java.util.List;
@Mapper
public interface UserMapper {
List<User> selectAllUsers(RowBounds rowBounds);
}
在SQL映射文件(user-mapper.xml)中编写对应的查询语句,并根据rowBounds参数进行结果切片。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="User">
SELECT * FROM user_table
</select>
</mapper>
在服务层或控制器层中调用Mapper的方法,传入RowBounds对象作为参数,指定需要的页码和每页的大小。
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
RowBounds rowBounds = new RowBounds(offset, pageSize);
return userMapper.selectAllUsers(rowBounds);
}
}
pageHelper方式实现
添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
在MyBatis的配置文件(mybatis-config.xml)中配置PageHelper插件
<configuration>
<!-- 其他配置 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql" />
</plugin>
</plugins>
</configuration>
在服务层或控制器层中调用Mapper的方法,并使用PageHelper进行分页
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return userMapper.selectAllUsers();
}
}
物理分页
物理分页是在数据库查询时,通过SQL语句进行分页操作。在MyBatis中,可以使用插件或直接在SQL语句中使用分页函数实现物理分页。
在SQL映射文件(user-mapper.xml)中编写带有分页函数的查询语句。
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectAllUsers" resultType="User">
SELECT * FROM user_table
ORDER BY id
LIMIT #{offset}, #{pageSize}
</select>
</mapper>
书写逻辑
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
return userMapper.selectAllUsers(offset, pageSize);
}
}
使用mybatis plus实现分页
物理分页和mybatis的基本一致,除了继承的东西不一样。
结合Ipage分页器使用
首先列出mp的框架:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 自定义查询方法...
}
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
// 自定义业务逻辑方法...
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 实现自定义业务逻辑方法...
}
使用ipage:
// 创建分页对象
IPage<User> page = new Page<>(1, 10); // 当前页码为 1,每页大小为 10
// 执行分页查询
IPage<User> userPage = userService.getUsersByPage(page);
// 获取当前页的用户数据列表
List<User> userList = userPage.getRecords();
// 获取总页数
long pages = userPage.getPages();
// 获取总记录数
long total = userPage.getTotal();
使用内部的selectPage方法:
@Override
public IPage<User> getUsersByPage(IPage<User> page) {
return userMapper.selectPage(page, null);
}