java mybatisplus page查询方法 中 如何新增自定义参数
时间: 2025-06-06 18:34:09 浏览: 8
<think>嗯,用户问的是在Java的MyBatis Plus中使用Page进行分页查询时,如何新增自定义参数。首先,我需要回忆一下MyBatis Plus的分页机制。MyBatis Plus的分页通常是通过Page对象来实现的,这个对象包含了当前页、每页大小、总记录数等信息。但是用户可能需要在分页查询的同时传递一些额外的参数,比如过滤条件或者其他业务相关的参数。
首先,我应该考虑Page类的结构。默认情况下,Page可能没有直接提供添加自定义参数的字段或方法。那用户可能需要扩展这个Page类,添加自己需要的参数。比如创建一个子类,继承Page,并在其中添加额外的字段,然后提供getter和setter方法。
接下来,用户在使用这个自定义的Page类时,可以在创建实例后设置这些参数。然后在编写MyBatis的Mapper接口或者XML映射文件时,可以通过IPage对象来获取这些参数。例如,在XML中,使用${page.paramName}或者#{page.paramName}来引用这些自定义参数。需要注意的是,这里可能需要使用${}而不是#{},如果参数是用于动态SQL的部分,比如表名或者列名,不过要小心SQL注入的问题。
另外,用户可能还会想到另一种方法,就是直接在Page对象之外传递参数,比如将参数放在查询条件中,或者使用Map来传递。但这样的话可能不够直观,或者需要修改方法的参数列表。而扩展Page类的方法可以让参数和分页信息一起封装,更加清晰。
不过,需要确认的是,MyBatis Plus的Page对象是否允许子类化,并且在执行分页查询时,是否能正确传递这些自定义参数到XML中。可能需要测试一下,确保在XML中可以访问到这些新增的字段。
还有一种情况,用户可能没有使用XML,而是使用MyBatis Plus的Wrapper来构建查询条件。这时候,自定义参数可能需要通过其他方式传递,比如在Wrapper中添加条件,或者使用线程局部变量等。但这种方法可能不够优雅,或者引入其他问题。
总结起来,最直接的方法应该是继承Page类,添加自定义字段,然后在Mapper的XML文件中通过IPage引用这些字段。同时,需要确保在Service层或Controller层创建自定义Page对象时,正确设置这些参数,并在查询方法中传递这个自定义的Page实例。
此外,可能还需要注意,当执行分页查询后,返回的Page对象是否仍然是自定义类型,或者会被框架处理成基类Page,导致自定义字段丢失。需要确保Mapper方法返回的是正确的类型,或者在查询后重新赋值参数,但这可能比较复杂。
最后,应该提醒用户在实际编码中进行测试,确保自定义参数能够正确传递并在SQL中被使用,同时注意参数的安全性和正确性,避免SQL注入等问题。可能还需要检查MyBatis Plus的版本,不同版本可能有不同的实现细节,但大部分情况下,继承Page类的方法应该是可行的。</think>在 MyBatis Plus 中,使用 `Page` 分页查询时新增自定义参数,可以通过以下两种方式实现:
---
### **方法一:继承 `Page` 类,扩展自定义参数**
1. **创建自定义 `Page` 子类**
继承 `Page<T>` 并添加自定义字段,例如 `param1`、`param2`:
```java
public class CustomPage<T> extends Page<T> {
// 自定义参数
private String param1;
private Integer param2;
// 构造方法
public CustomPage(long current, long size) {
super(current, size);
}
// Getter/Setter
public String getParam1() { return param1; }
public void setParam1(String param1) { this.param1 = param1; }
public Integer getParam2() { return param2; }
public void setParam2(Integer param2) { this.param2 = param2; }
}
```
2. **在查询中使用自定义 `Page`**
创建 `CustomPage` 实例并设置参数,传递给 Mapper 方法:
```java
CustomPage<User> page = new CustomPage<>(1, 10);
page.setParam1("searchKey");
page.setParam2(100);
IPage<User> result = userMapper.selectPage(page, null);
```
3. **在 XML 或注解 SQL 中获取参数**
通过 `page.param1` 或 `page.param2` 访问自定义参数:
```xml
<select id="selectPage" resultType="User">
SELECT * FROM user
WHERE name LIKE CONCAT('%', #{page.param1}, '%')
AND age > #{page.param2}
LIMIT #{page.offset}, #{page.size}
</select>
```
---
### **方法二:使用 `Map` 传递额外参数**
如果不想扩展 `Page` 类,可以直接将 `Map` 作为参数传递:
1. **Mapper 接口方法**
```java
IPage<User> selectPageWithParams(Page<User> page, @Param("params") Map<String, Object> params);
```
2. **调用时传递参数**
```java
Page<User> page = new Page<>(1, 10);
Map<String, Object> params = new HashMap<>();
params.put("param1", "searchKey");
params.put("param2", 100);
IPage<User> result = userMapper.selectPageWithParams(page, params);
```
3. **在 SQL 中获取参数**
```xml
<select id="selectPageWithParams" resultType="User">
SELECT * FROM user
WHERE name LIKE CONCAT('%', #{params.param1}, '%')
AND age > #{params.param2}
LIMIT #{page.offset}, #{page.size}
</select>
```
---
### **注意事项**
1. **XML 中参数引用**
- 如果使用 `#{}`,参数会被预编译(防 SQL 注入);若需动态 SQL(如表名、列名),需用 `${}`,但需自行确保安全性。
2. **Wrapper 条件构造器**
如果使用 `QueryWrapper`,可以通过 `wrapper.lambda()` 直接添加条件,无需通过 `Page` 传参:
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "searchKey").gt("age", 100);
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, wrapper);
```
---
选择方法一或二取决于是否需要将参数与分页逻辑强绑定。通常推荐方法一,代码更清晰易维护。
阅读全文
相关推荐


















