您好,登录后才能下订单哦!
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在实际开发中,分页查询是一个非常常见的需求。MyBatis 提供了多种方式来实现分页查询,本文将详细介绍这些传参方式,并分析它们的优缺点。
RowBounds
进行分页RowBounds
是 MyBatis 提供的一个简单的分页工具,它通过设置偏移量和限制数来实现分页。
int offset = 0; // 起始位置
int limit = 10; // 每页显示的记录数
RowBounds rowBounds = new RowBounds(offset, limit);
List<User> users = sqlSession.selectList("com.example.mapper.UserMapper.selectUsers", null, rowBounds);
优点:
缺点:
RowBounds
会在内存中进行分页,而不是在数据库层面进行分页。PageHelper
插件进行分页PageHelper
是一个非常流行的 MyBatis 分页插件,它通过拦截器的方式实现了物理分页。
首先需要在 pom.xml
中添加 PageHelper
的依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
然后在 MyBatis 配置文件中配置 PageHelper
插件:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
<property name="supportMethodsArguments" value="true"/>
<property name="returnPageInfo" value="check"/>
<property name="params" value="count=countSql"/>
</plugin>
</plugins>
在代码中使用 PageHelper
进行分页:
PageHelper.startPage(1, 10); // 第1页,每页10条记录
List<User> users = userMapper.selectUsers();
PageInfo<User> pageInfo = new PageInfo<>(users);
优点:
PageHelper.startPage()
方法即可。缺点:
limit
和 offset
进行分页在 SQL 语句中直接使用 limit
和 offset
进行分页是最直接的方式。
在 SQL 语句中使用 limit
和 offset
:
SELECT * FROM users LIMIT 10 OFFSET 0;
在 MyBatis 的 Mapper 接口中定义方法:
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在 XML 文件中编写 SQL:
<select id="selectUsers" resultType="User">
SELECT * FROM users LIMIT #{limit} OFFSET #{offset}
</select>
优点:
limit
和 offset
的数据库。缺点:
Page
对象进行分页MyBatis 提供了一个 Page
对象,可以通过它来实现分页查询。
首先定义一个 Page
对象:
public class Page<T> {
private int pageNum; // 当前页码
private int pageSize; // 每页显示的记录数
private List<T> result; // 查询结果
private int total; // 总记录数
// 省略 getter 和 setter 方法
}
在 Mapper 接口中定义方法:
Page<User> selectUsers(@Param("page") Page<User> page);
在 XML 文件中编写 SQL:
<select id="selectUsers" resultType="User">
SELECT * FROM users LIMIT #{page.pageSize} OFFSET #{page.offset}
</select>
在代码中使用 Page
对象进行分页:
Page<User> page = new Page<>();
page.setPageNum(1);
page.setPageSize(10);
Page<User> result = userMapper.selectUsers(page);
优点:
缺点:
Page
对象。MyBatis-Plus
进行分页MyBatis-Plus
是 MyBatis 的增强工具,它提供了更强大的分页功能。
首先需要在 pom.xml
中添加 MyBatis-Plus
的依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependency>
在 MyBatis 配置文件中配置 MyBatis-Plus
的分页插件:
<plugins>
<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
</plugins>
在代码中使用 MyBatis-Plus
进行分页:
Page<User> page = new Page<>(1, 10); // 第1页,每页10条记录
IPage<User> userPage = userMapper.selectPage(page, null);
优点:
缺点:
MyBatis
的 @Param
注解进行分页在 MyBatis 中,可以使用 @Param
注解来传递分页参数。
在 Mapper 接口中定义方法:
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在 XML 文件中编写 SQL:
<select id="selectUsers" resultType="User">
SELECT * FROM users LIMIT #{limit} OFFSET #{offset}
</select>
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
MyBatis
的 Map
进行分页在 MyBatis 中,可以使用 Map
来传递分页参数。
在 Mapper 接口中定义方法:
List<User> selectUsers(Map<String, Object> params);
在 XML 文件中编写 SQL:
<select id="selectUsers" resultType="User">
SELECT * FROM users LIMIT #{limit} OFFSET #{offset}
</select>
在代码中调用方法:
Map<String, Object> params = new HashMap<>();
params.put("offset", 0);
params.put("limit", 10);
List<User> users = userMapper.selectUsers(params);
优点:
缺点:
Map
对象。MyBatis
的 @SelectProvider
进行分页在 MyBatis 中,可以使用 @SelectProvider
注解来动态生成 SQL 语句。
首先定义一个 Provider
类:
public class UserProvider {
public String selectUsers(Map<String, Object> params) {
int offset = (int) params.get("offset");
int limit = (int) params.get("limit");
return "SELECT * FROM users LIMIT " + limit + " OFFSET " + offset;
}
}
在 Mapper 接口中定义方法:
@SelectProvider(type = UserProvider.class, method = "selectUsers")
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
Provider
类。MyBatis
的 @Select
注解进行分页在 MyBatis 中,可以使用 @Select
注解来直接编写 SQL 语句。
在 Mapper 接口中定义方法:
@Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
MyBatis
的 @Results
注解进行分页在 MyBatis 中,可以使用 @Results
注解来映射查询结果。
在 Mapper 接口中定义方法:
@Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "name", column = "name"),
@Result(property = "age", column = "age")
})
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
MyBatis
的 @ResultMap
注解进行分页在 MyBatis 中,可以使用 @ResultMap
注解来映射查询结果。
首先在 XML 文件中定义 resultMap
:
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
在 Mapper 接口中定义方法:
@Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
@ResultMap("userResultMap")
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
MyBatis
的 @Insert
注解进行分页在 MyBatis 中,可以使用 @Insert
注解来插入数据。
在 Mapper 接口中定义方法:
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
int insertUser(User user);
在代码中调用方法:
User user = new User();
user.setName("John");
user.setAge(25);
int result = userMapper.insertUser(user);
优点:
缺点:
MyBatis
的 @Update
注解进行分页在 MyBatis 中,可以使用 @Update
注解来更新数据。
在 Mapper 接口中定义方法:
@Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
int updateUser(User user);
在代码中调用方法:
User user = new User();
user.setId(1);
user.setName("John");
user.setAge(25);
int result = userMapper.updateUser(user);
优点:
缺点:
MyBatis
的 @Delete
注解进行分页在 MyBatis 中,可以使用 @Delete
注解来删除数据。
在 Mapper 接口中定义方法:
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteUser(int id);
在代码中调用方法:
int result = userMapper.deleteUser(1);
优点:
缺点:
MyBatis
的 @Options
注解进行分页在 MyBatis 中,可以使用 @Options
注解来配置 SQL 语句的执行选项。
在 Mapper 接口中定义方法:
@Select("SELECT * FROM users LIMIT #{limit} OFFSET #{offset}")
@Options(useCache = true, flushCache = false, timeout = 10000)
List<User> selectUsers(@Param("offset") int offset, @Param("limit") int limit);
在代码中调用方法:
List<User> users = userMapper.selectUsers(0, 10);
优点:
缺点:
MyBatis
的 @SelectKey
注解进行分页在 MyBatis 中,可以使用 @SelectKey
注解来获取插入数据的主键。
在 Mapper 接口中定义方法:
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = int.class)
int insertUser(User user);
在代码中调用方法:
User user = new User();
user.setName("John");
user.setAge(25);
int result = userMapper.insertUser(user);
优点:
缺点:
MyBatis
的 @Flush
注解进行分页在 MyBatis 中,可以使用 @Flush
注解来刷新缓存。
在 Mapper 接口中定义方法:
@Flush
void flush();
在代码中调用方法:
userMapper.flush();
优点:
缺点:
MyBatis
的免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。