5

是否可以映射具有特定格式的字符串字段,例如:

aaa,bbb,ccc,ddd

使用 iBatis 进入具有元素 [aaa, bbb, ccc, ddd] 的列表?

我需要在我的模型中有类似的东西:

public class Request{
    private List<String> fieldOne;
    public List<String> getFieldOne(){....}
    public void setFieldOne(){....}
}

即使在我的表中该字段是一个简单的字符串。这可能吗?

谢谢罗伯托

4

3 回答 3

8

您可以通过CustomType Handler来做到这一点:

例如,在您的映射中,您定义:

<result column="FIELD_ONE" property="fieldOne" 
        jdbcType="VARCHAR" typeHandler="com.xxx.StringSplitTypeHandlerCallBack" />

然后你编写你的代码class StringSplitTypeHandlerCallBack implements TypeHandlerCallback,它会在方法String.split()内部调用getResult()

更新:当然,如果这个转换只需要一个类的一个字段,getFieldOneAsString(), setFieldOneAsString()在你的类中定义一对替代的 setter/getter 可能更简单,并property="fieldOneAsString"在你的映射中使用

于 2010-04-22T18:53:41.123 回答
5

使用 TypeHandler,示例:

<result property="strList" column="rp_str" typeHandler="com.yourproject.repository.orm.StringSplitTypeHandler" />

public class StringSplitTypeHandler implements TypeHandler<List<String>> {

    @Override
    public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            ps.setString(i, parameter.toString());
        }
    }

    @Override
    public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
        String columnValueStr = rs.getString(columnName);
        if (columnValueStr != null) {
            return Arrays.asList(columnValueStr.replaceAll("[ ]", "").split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValueStr = rs.getString(columnIndex);
        if (columnValueStr != null) {
            return Arrays.asList(columnValueStr.replaceAll("[ ]", "").split(","));
        }
        return null;
    }

    @Override
    public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValueStr = cs.getString(columnIndex);
        if (columnValueStr != null) {
            return Arrays.asList(columnValueStr.replaceAll("[ ]", "").split(","));
        }
        return null;
    }

}
于 2017-03-21T09:02:41.447 回答
0

我不知道你为什么想让 iBatis 这样做,但你可以使用String.split()来完成这项工作,并映射结果。

于 2010-04-22T10:45:29.797 回答