看了很多博客,大部分都是讲的自定义TypeHandler处理器,然后通过xml来指定这个处理器来进行配置。其实不然,也可以通过编码的方式进行配置。
继承 org.apache.ibatis.type.BaseTypeHandler
类是实现自定义 TypeHandler
的常见方式,假设我们需要将一个 Java 对象转化为 JSON 字符串进行存储。可以通过以下步骤来定义和注册自定义 TypeHandler:
- 实现一个
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 可能会略微有不同。以上仅是示例,具体还需要根据实际情况进行调整。