TypeHandler数据类型的转换
说明
在 Java 开发中,TypeHandler 是 MyBatis 框架中的一个核心组件,用于实现数据库与 Java 类型之间的相互转换。它允许开发人员自定义类型处理器,以满足特定的业务需求。
TypeHandler 的作用是在 MyBatis 执行 SQL 查询或更新操作时,将数据库中的列值转换为 Java 对象,并在将 Java 对象写入数据库时执行相反的转换。它提供了一种灵活且可扩展的方式,用于处理数据库类型与 Java 类型之间的映射关系。
以下是 TypeHandler 的一些关键特点和使用方式:
- 类型转换:TypeHandler 负责将数据库中的列值转换为 Java 对象,并将 Java 对象转换为数据库可接受的类型。
- 自定义类型处理器:MyBatis 提供了一些默认的类型处理器,例如处理整数、字符串、日期等常见类型。同时,开发人员可以根据需要自定义类型处理器,实现特定类型的转换逻辑。
- 注册类型处理器:自定义的类型处理器需要在 MyBatis 的配置文件中进行注册,以便 MyBatis 在执行数据库操作时能够找到并使用它们。
- 支持复杂类型:TypeHandler 不仅可以处理基本类型,还可以处理复杂类型,例如枚举、自定义对象等。
- 映射规则:TypeHandler 的使用是基于映射规则的,即在 MyBatis 的映射文件中,通过指定列和属性之间的映射关系,TypeHandler 才能正确地进行类型转换。
自定义TypeHandler
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class SetTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, convert(parameter));
}
@Override
public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
return convert(rs.getString(columnName));
}
@Override
public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
return convert(rs.getString(columnIndex));
}
@Override
public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
return convert(cs.getString(columnIndex));
}
private String convert(List<String> longSet) {
if (CollectionUtil.isEmpty(longSet)) {
return null;
}
return String.join(",", longSet);
}
private List<String> convert(String value) {
List<String> resultSet = null;
if (StringUtils.isNotBlank(value)) {
resultSet = ListUtil.of(value.split(","));
}
return resultSet;
}
}
注册
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class MybatisPlusConfig {
@Bean
public ConfigurationCustomizer mybatisConfigurationCustomizer() {
return configuration -> configuration.getTypeHandlerRegistry()
.register(List.class, new SetTypeHandler());
}
}
使用
@TableField(typeHandler = SetTypeHandler.class)
private List<String> factoryCode;
纸上得来终觉浅,绝知此事要躬行。