Hello World

mybatis 自定义TypeHandler

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;
posted @ 2021-08-18 18:56  小小忧愁米粒大  阅读(959)  评论(0编辑  收藏  举报
瞅啥瞅,好好看书