类型处理器TypeHandler

作用:用于JavaType和JdbcType之间的转换

解析:当Mybatis将一个Java对象写入数据库时,它会创建一个PreparedStatument对象,并且使用setValue()方法对占位符设置相应的参数值。Mybatis能够使用内建的类型处理器(所有的基本数据类型、基本类型的包装类型等)将值设置到PreparedStatument。当我们没有指定TypeHandler时,Mybatis会根据参数或者返回结果类型的不同,默认选择合适的类型处理器。

问题:虽然Mybatis可以满足一般的场景,但是有时候我们需要处理一些自定义类型,怎么办呢?

解决:

  • 首先,定义我们的自定义类型

    @Data
    public class ExecutorConf {
        
    }
  • 其次,继承BaseTypeHandler实现我们的自定义类型处理器

    // 注解配置 Jdbc 类型
    @MappedJdbcTypes(JdbcType.LONGVARCHAR)
    // 注解配置 Java 类型
    @MappedTypes(ExecutorConf.class)
    public class ExecutorConfHandler extends BaseTypeHandler {
        // 将JavaType转为JdbcType,设置数据存储到数据库中的格式
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, ExecutorConf executorConf,
                                        JdbcType jdbcType) throws SQLException {
            preparedStatement.setString(i, executorConf.toString());
        }
        // 从结果根据列名称获取到的数据的JdbcType转为JavaType
        @Override
        public ExecutorConf getNullableResult(ResultSet resultSet, String s) throws SQLException {
            return JSONObject.parseObject(resultSet.getString(s), ExecutorConf.class);
        }
        // 从结果根据列索引获取到的数据的JdbcType转为JavaType
        @Override
        public ExecutorConf getNullableResult(ResultSet resultSet, int i) throws SQLException {
            return JSONObject.parseObject(resultSet.getString(i), ExecutorConf.class);
        }
        // 返回值
        @Override
        public ExecutorConf getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            return JSONObject.parseObject(callableStatement.getString(i), ExecutorConf.class);
        }
    }
  • 最后,加上注解,指定类型处理器

    @TableField(typeHandler = ExecutorConfHandler.class)
    private ExecutorConf executorConf;

你可能感兴趣的:(java,intellij-idea,maven)