MyBatis ORM 提供了一个功能强大的类型处理器(TypeHandler)系统,用于在 Java 对象和数据库之间转换数据
以下是创建自定义类型处理器的步骤:
-
首先,创建一个实现
org.apache.ibatis.type.TypeHandler
接口的类。这个接口包含四个方法:setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
: 用于将 Java 对象设置到 SQL 语句的参数中。getResult(ResultSet rs, String columnName)
: 从结果集中获取值并转换为 Java 对象。getResult(ResultSet rs, int columnIndex)
: 从结果集中获取值并转换为 Java 对象。getResult(CallableStatement cs, int columnIndex)
: 从存储过程中获取值并转换为 Java 对象。
-
在自定义类型处理器类中实现上述方法。例如,假设我们要将一个逗号分隔的字符串转换为一个 Java 列表:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
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;
public class CommaSeparatedListTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.join(",", parameter));
}
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return value == null ? null : Arrays.asList(value.split(","));
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return value == null ? null : Arrays.asList(value.split(","));
}
@Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return value == null ? null : Arrays.asList(value.split(","));
}
}
- 在 MyBatis 配置文件(如
mybatis-config.xml
)中注册自定义类型处理器。例如:
<!-- ... -->
<typeHandlers>
<typeHandler handler="com.example.mybatis.typehandler.CommaSeparatedListTypeHandler" />
</typeHandlers>
</configuration>
- 在映射文件(如
UserMapper.xml
)中使用自定义类型处理器。例如:
<id property="id" column="id" />
<result property="name" column="name" />
<result property="roles" column="roles" javaType="java.util.List" typeHandler="com.example.mybatis.typehandler.CommaSeparatedListTypeHandler" />
</resultMap>
现在,MyBatis 会使用自定义类型处理器在 Java 对象和数据库之间转换逗号分隔的字符串和列表。