如何防止mybatis varchar进入java中的字符串池?

How to prevent a mybatis varchar from entering the string pool in java?

我们的数据库中有几个敏感字段,需要防止它们进入 Java 字符串池。数据库中都是VARCHAR,我们在代码中使用了StringBuilder,防止它们被放到常量池中。

我们使用 MyBatis 与数据库交互,我目前正在尝试实现一个类型处理程序,我正在尝试使用 setObject 将 StringBuilder 映射到 Varchar。

我想知道这是否可能,如果可能的话,在 MyBatis 和 JDBC 之间是否还有其他区域,这意味着不能保证 VARCHAR 不会在字符串池中结束? (在代码中强制转换,语句以字符串形式出现,诸如此类)

我也在 mybatis-users google 群里问过这个问题,但到目前为止还没有人能提供帮助

编辑 - 我应该澄清一下,这并不是严格意义上的字符串池,它是关于控制数据在堆上的位置并通过用空值覆盖尽快从可变 CharSequence 中擦除数据。字符串绝对不能进入池中,但由于垃圾收集的工作方式,简单地将不在池中的字符串置空仍然会导致安全问题。

不确定这是否有帮助,但可以。

首先,创建一个客户TypeHandler (扩展 org.apache.ibatis.type.BaseTypeHandler 或 实施 org.apache.ibatis.type.TypeHandler) 来处理您的专栏。

而不是 "standard" varchar 到 String 的实现:

@Override
public String getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    return rs.getString(columnIndex);
}

实现这个

@Override
public StringBuilder getNullableResult(ResultSet rs, int columnIndex)
throws SQLException
{
    final StringBuilder returnValue = new StringBuilder();
    final byte[] value = rs.getbytes(columnIndex);

    // add the bytes to the StringBuilder.

    return returnValue;
}

实现整个 TypeHandler 接口后, 您将需要注册您的类型处理程序和 为所需的列配置它。

这是一个reference page