zoukankan      html  css  js  c++  java
  • 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;
    
    如果文章对您有所帮助,可以点一下推荐哦
  • 相关阅读:
    sqlzoo练习系列(一)——SELECT 基础
    域名重定向
    自动识别PC端、移动端,并跳转
    Laravel传递多个参数到页面
    Laravel提示The GET method is not supported for this route. Supported methods: POST.错误的解决办法
    Laravel8和之前Laravel版本的区别
    Laravel使用Ajax提交表单报419 unknown status错误的解决方法
    PHP 函数调用之引用地址
    软件开发流程以及开发原则
    php 函数基础
  • 原文地址:https://www.cnblogs.com/virgosnail/p/15158365.html
Copyright © 2011-2022 走看看