在 MyBatis 中,你可以使用 Provider 来编写一个灵活的分页查询。Provider 允许你根据不同的条件来生成动态 SQL 查询语句。以下是一个使用 Provider 实现分页查询的示例:
- 创建分页查询提供器: 首先,你需要创建一个查询提供器类,用于生成动态的分页查询语句。
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
public class UserSqlProvider {
public String getUsersByPage(
@Param("offset") int offset,
@Param("limit") int limit) {
return new SQL() {{
SELECT("*");
FROM("user");
ORDER_BY("id"); // 根据需要添加排序条件
LIMIT("#{limit}");
if (offset > 0) {
OFFSET("#{offset}");
}
}}.toString();
}
}
- 在 Mapper 接口中使用 Provider 进行分页查询: 在 Mapper 接口中使用
@SelectProvider
注解指定查询提供器,传递参数。
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
import java.util.List;
@Mapper
public interface UserMapper {
@SelectProvider(type = UserSqlProvider.class, method = "getUsersByPage")
List<User> getUsersByPage(
@Param("offset") int offset,
@Param("limit") int limit);
}
- 在 Service 或 Controller 中调用分页查询: 在你的 Service 或 Controller 类中调用
getUsersByPage
方法并传递分页参数。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public List<User> getUsersByPage(int pageNo, int pageSize) {
int offset = (pageNo - 1) * pageSize;
return userMapper.getUsersByPage(offset, pageSize);
}
}
在这个示例中,我们定义了一个分页查询提供器 UserSqlProvider
,它生成带有动态分页查询的 SQL 语句。然后,在 Mapper 接口中使用 @SelectProvider
注解来使用这个查询提供器,并在 Service 类中调用查询。
通过这种方式,你可以使用 Provider 和动态 SQL 生成灵活的分页查询语句,根据不同的分页参数来查询数据库。