简体   繁体   English

iBatis映射:将字符串字段映射到List <String>

[英]iBatis mapping: map a string field into a List<String>

is it possible to map a string field with a particular format like: 是否可以使用特定格式映射字符串字段,如:

aaa,bbb,ccc,ddd AAA,BBB,CCC,DDD

into a List having elements [aaa, bbb, ccc, ddd] using iBatis? 使用iBatis进入包含元素[aaa,bbb,ccc,ddd]的List?

What I need is to have in my model something like: 我需要的是在我的模型中有类似的东西:

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

even if in my table the field is a simple string. 即使在我的表中,该字段是一个简单的字符串。 Is this possible? 这可能吗?

Thanks Roberto 谢谢罗伯托

You can do it through a CustomType Handler : 您可以通过CustomType处理程序执行此操作

For example, in your mapping you define: 例如,在您的映射中定义:

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

and then you code your class StringSplitTypeHandlerCallBack implements TypeHandlerCallback , which would call String.split() inside the getResult() method. 然后编写class StringSplitTypeHandlerCallBack implements TypeHandlerCallback ,它将在getResult()方法中调用String.split()

UPDATE: Of course, if this conversion is only need for one field of one class, it might be more simple to define a pair of alternative setter/getters getFieldOneAsString(), setFieldOneAsString() in your class, and use property="fieldOneAsString" in your mapping 更新:当然,如果这个转换只需要一个类的一个字段,那么在类中定义一对替代的setter / getters getFieldOneAsString(), setFieldOneAsString()并使用property="fieldOneAsString"可能会更简单在您的映射中

Use TypeHandler, Example: 使用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;
    }

}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM