mybatis 返回map 自动除去 null
时间: 2024-12-30 16:15:53 浏览: 10
### 配置 MyBatis 返回 Map 自动过滤掉值为 null 的键值对
为了使 MyBatis 返回的 `Map` 类型结果能够自动过滤掉值为 `null` 的键值对,可以通过自定义插件来实现这一功能。MyBatis 支持通过编写拦截器(Interceptor)来自定义其行为。
#### 创建自定义插件类
创建一个新的 Java 插件类用于处理查询后的数据:
```java
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.Statement;
import java.util.Map;
import java.util.Properties;
@Intercepts({
@Signature(type = ResultSetHandler.class,
method = "handleResultSets",
args = {Statement.class})
})
public class NullFilteringPlugin implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
final Object resultObject = invocation.proceed();
if (resultObject instanceof Map){
((Map<?, ?>) resultObject).entrySet().removeIf(entry -> entry.getValue() == null);
}
return resultObject;
}
@Override
public void setProperties(Properties properties) {}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
}
```
此代码片段展示了如何构建一个简单的插件,在每次调用 `ResultSetHandler.handleResultSets()` 方法之后执行额外逻辑,即移除所有映射中的 `null` 值[^1]。
#### 注册插件到 MyBatis 中
为了让上述插件生效,还需要将其注册至 MyBatis 或 Spring Boot 应用程序上下文中。如果是在基于 XML 的配置文件中,则可以在 `<plugins>` 节点下声明该插件;如果是采用注解方式或 Spring Boot 方式集成的话,则可以直接在应用程序启动类上添加相应的 Bean 定义。
对于 Spring Boot 用户来说,可以简单地将这个插件作为一个 bean 添加进去:
```java
@Configuration
public class MyBatisConfig {
@Bean
public NullFilteringPlugin nullFilteringPlugin(){
return new NullFilteringPlugin();
}
}
```
这样就可以确保当应用运行时,所有的 SQL 查询返回的结果集都会经过这个插件处理,从而达到去除 `null` 键的效果[^3]。
阅读全文