1. 简介
对象和数据库表之间映射的时候,有时候对象的字段类型和数据库的字段不匹配,需要手动将对象字段转换为数据库存在的类型,mybatis提供了TypeHandler接口,通过扩展TypeHandler接口实现对象字段和数据库字段之间的自动转换
比如将对象的List类型的字段映射到数据库的varchar类型。插入数据时根据TypeHandler的setParameter方法自动将List类型的数据转为varchar类型的,读取数据时根据TypeHandler的getResult方法将varchar类型的数据自动转为List类型
2. 示例
2.1 实现TypeHandler接口
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
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.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @description: 类型转换器,用于数据库的varchar和Java中List<String>类型的相互转换
*/
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListToVarcharTypeHandler implements TypeHandler<List<String>> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {
// 遍历List类型的入参,拼装为String类型,使用Statement对象插入数据库
StringBuffer sb = new StringBuffer();
for (String string : strings) {
sb.append(string).append(",");
}
String substring = sb.substring(0, sb.length() - 1);
preparedStatement.setString(i, substring);
}
@Override
public List<String> getResult(ResultSet resultList, String s) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = resultList.getString(s);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.stream(resultString.split(",")).collect(Collectors.toList());
}
return null;
}
@Override
public List<String> getResult(ResultSet resultList, int i) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = resultList.getString(i);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.stream(resultString.split(",")).collect(Collectors.toList());
}
return null;
}
@Override
public List<String> getResult(CallableStatement callableStatement, int i) throws SQLException {
// 获取String类型的结果,使用","分割为List后返回
String resultString = callableStatement.getString(i);
if (StringUtils.isNotEmpty(resultString)) {
return Arrays.stream(resultString.split(",")).collect(Collectors.toList());
}
return null;
}
}
2.2 添加配置
添加下面的配置后mybatis会扫描package下的TypeHandler的实现类
mybatis-plus:
type-handlers-package: com.iflytek.consumers.ibuilding.common.handler
2.3 对象字段添加注解
在指定字段上添加typeHandler注解后,该字段和数据库在映射时会调用指定的实现类进行处理
@TableField(value = "tags",typeHandler = com.skd.common.handler.SetToVarcharTypeHandler.class)
@ApiModelProperty("设备标签")
private List<String> tags;