在处理数据脱敏需求时,如何在 MyBatis-Hive 中高效实现?核心思路并不复杂:借助自定义类型处理器(TypeHandler),在数据映射为 Java 对象的过程中自动完成脱敏操作。接下来,我们通过一个实战案例来详细演示具体步骤。

第一步,明确需要进行脱敏处理的字段。例如,假设存在一张用户表
user,其中包含了身份证号、手机号码等敏感数据,这些字段自然就是脱敏的重点目标。第二步,在 MyBatis 映射文件中配置
resultMap,为敏感字段关联自定义的类型处理器。这样一来,无论在数据库读取还是写入数据时,处理器都将自动介入并完成脱敏。
<resultMap id="userResultMap" type="com.example.User"><id property="id" column="id"/><result property="name" column="name"/><result property="idNumber" column="id_number" ja vaType="ja va.lang.String" typeHandler="com.example.IdNumberTypeHandler"/><result property="phoneNumber" column="phone_number" ja vaType="ja va.lang.String" typeHandler="com.example.PhoneNumberTypeHandler"/>resultMap>- 第三步,编写两个具体的类型处理器:
IdNumberTypeHandler和PhoneNumberTypeHandler。其核心逻辑在于,在数据库读写操作时调用脱敏函数,例如仅保留末尾四位有效数字,其余字符以星号替换。
public class IdNumberTypeHandler extends BaseTypeHandler {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, maskIdNumber(parameter));}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return maskIdNumber(rs.getString(columnName));}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return maskIdNumber(rs.getString(columnIndex));}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return maskIdNumber(cs.getString(columnIndex));}private String maskIdNumber(String idNumber) {return "****" + idNumber.substring(idNumber.length() - 4);}}public class PhoneNumberTypeHandler extends BaseTypeHandler {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, maskPhoneNumber(parameter));}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return maskPhoneNumber(rs.getString(columnName));}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return maskPhoneNumber(rs.getString(columnIndex));}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return maskPhoneNumber(cs.getString(columnIndex));}private String maskPhoneNumber(String phoneNumber) {return "****" + phoneNumber.substring(phoneNumber.length() - 4);}} - 最后,在映射文件中将查询语句的
resultMap属性指向刚才定义好的userResultMap,即可完成配置。
<select id="getUserById" resultMap="userResultMap">SELECT id, name, id_number, phone_number FROM user WHERE id = #{id}select>通过上述配置,当从 Hive 查询数据时,MyBatis 会自动调用这些自定义类型处理器,将身份证号、手机号等敏感信息的中间部分替换为星号,仅保留最后四位显示。代码量不大,逻辑非常直观,关键在于准确识别需要保护的字段,并利用 TypeHandler 进行一次彻底的“清洗”。
