如何把mybatisplus查到的数据做转换,如数据库只存0、1,查到1将vo属性值替换为“停用”1、“正常”
时间: 2025-06-25 20:07:07 浏览: 6
### MyBatisPlus 查询结果字段值转换为描述性字符串
在实际开发过程中,通常需要将数据库中的数值型字段(如 `0` 和 `1`)映射为更具可读性的描述性字符串。以下是实现该功能的具体方法:
#### 方法一:通过自定义 VO 类完成字段转换
可以通过创建一个视图对象(VO),并利用 Java 的 getter 方法来实现字段值的转换。
```java
public class UserVO {
private Integer status;
// Getter 方法中进行逻辑判断
public String getStatusDesc() {
if (this.status != null) {
switch (this.status) {
case 0:
return "停用";
case 1:
return "正常";
default:
return "未知状态";
}
}
return "";
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
```
当查询返回的结果集被封装到 `UserVO` 中时,调用 `getStatusDesc()` 即可获取对应的状态描述[^1]。
---
#### 方法二:使用枚举类型进行字段值转换
可以借助枚举类完成更灵活的字段值转换操作。例如,在引用[3]的基础上扩展如下代码:
```java
// 枚举类定义
public enum StatusEnum {
NORMAL(1, "正常"),
DISABLED(0, "停用");
private final int code;
private final String desc;
StatusEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
// 静态方法用于根据code查找desc
public static String getDescriptionByCode(int code) {
for (StatusEnum item : StatusEnum.values()) {
if (item.getCode() == code) {
return item.getDesc();
}
}
return "未知状态";
}
}
// 使用场景
Integer dbValue = user.getStatus(); // 假设从数据库查出来的值是0或者1
String description = StatusEnum.getDescriptionByCode(dbValue); // 转换后的描述性字符串
```
此方式不仅能够提高代码的可维护性和可读性,还便于后续扩展新的状态值[^3]。
---
#### 方法三:MyBatis-Plus 自动填充策略结合 Converter 实现
如果希望直接在 Mapper 层完成这种转换,则可通过编写 TypeHandler 来实现自动转换的功能。
##### 步骤 1:定义 TypeHandler
```java
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class StatusConverter extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
throw new UnsupportedOperationException("不支持写入");
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
int code = rs.getInt(columnName);
if (!rs.wasNull()) {
return convertFromDatabaseColumn(code);
}
return null;
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int code = rs.getInt(columnIndex);
if (!rs.wasNull()) {
return convertFromDatabaseColumn(code);
}
return null;
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int code = cs.getInt(columnIndex);
if (!cs.wasNull()) {
return convertFromDatabaseColumn(code);
}
return null;
}
private String convertFromDatabaseColumn(int code) {
switch (code) {
case 0:
return "停用";
case 1:
return "正常";
default:
return "未知状态";
}
}
}
```
##### 步骤 2:注册 TypeHandler
在 MyBatis-Plus 的全局配置文件中注册该处理器:
```yaml
mybatis-plus:
type-handlers-package: com.example.handler # 替换为实际包路径
```
此时,Mapper 接口查询的数据会自动经过 `StatusConverter` 处理,无需额外编码即可获得期望的结果[^4]。
---
#### 性能优化建议
需要注意的是,对于大批量数据插入或更新的操作,应优先考虑 SQL 合并的方式以提升性能。尽管 MyBatis-Plus 提供了批处理机制,但由于其底层仍依赖 PrepareStatement 执行多次 insert 操作,因此可能无法达到最优效果。针对此类情况,推荐手动拼接单条 SQL 完成所有记录的一次性提交[^2]。
---
###
阅读全文