看了很多博客,大部分都是讲的自定义TypeHandler处理器,然后通过xml来指定这个处理器来进行配置。其实不然,也可以通过编码的方式进行配置。

继承 org.apache.ibatis.type.BaseTypeHandler 类是实现自定义 TypeHandler 的常见方式,假设我们需要将一个 Java 对象转化为 JSON 字符串进行存储。可以通过以下步骤来定义和注册自定义 TypeHandler:

  1. 实现一个 TypeHandler 类,继承自 BaseTypeHandler<T>,其中 T 为需要处理的 Java 对象的类型,实现以下方法:
  • setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType):将 Java 对象转化为字符串,设置到 PreparedStatement 中。

  • getNullableResult(ResultSet rs, String columnName):从结果集中根据列名称获取结果并转化为 Java 对象。

  • getNullableResult(ResultSet rs, int columnIndex):从结果集中根据列索引获取结果并转化为 Java 对象。

  • getNullableResult(CallableStatement cs, int columnIndex):从 CallableStatement 中根据列索引获取结果并转化为 Java 对象。

以下是一个案例:

package com.maxrocky.repository.lottery.config;    /**
 * @Author:ChenBenLong
 * @name:JsonObjectTypeHandler
 * @Date:2023/4/26 18:33
 * @Filename:JsonObjectTypeHandler
 */

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * JsonObjectTypeHandler :
 * @author:chenbenlong
 * @Time:2023/4/26
 * @Version:1.0
 **/
public class JsonObjectTypeHandler extends BaseTypeHandler<JSONObject> {


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSONObject.toJSONString(parameter));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从 ResultSet 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(rs.getString(columnName));
    }

    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从 ResultSet 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(rs.getString(columnIndex));
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从 CallableStatement 中获取 JSON 字符串并将其转换为 Java 对象
        return JSON.parseObject(cs.getString(columnIndex));
    }
}

在这个案例中,我们使用了alibaba的fastJson库,并且将需要处理的类进行了转换。

        2.注册自定义 TypeHandler,在 SqlSessionFactory(mybaits数据库配置) 中进行注册

    @Bean
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource,@Qualifier("pageHelperPlugins") Interceptor[] interceptors) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        
        //注册TypeHandler进行json处理
                                 bean.getObject().getConfiguration().getTypeHandlerRegistry().register(JSONObject.class, JsonObjectTypeHandler.class);

        //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
        return bean.getObject();
    }

在这个示例中,我们首先通过 SqlSessionFactoryBean 构造了 SqlSessionFactoryBean 对象,然后获取 configuration 配置对象并且在 TypeHandlerRegistry 中注册了 TypeHandler 类型处理器。

需要注意的是,由于 TypeHandler 是处理 Java 对象和 SQL 数据类型的关系,在使用时需要根据实际的场景传入相应的类型。

另外,需要注意在使用时,不同版本的 Mybatis 的 API 可能会略微有不同。以上仅是示例,具体还需要根据实际情况进行调整。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐