开发者

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

开发者 https://www.devze.com 2022-12-27 14:37 出处:网络
is it possible to map a string field with a particular format like: aaa,bbb,ccc,ddd into a List having elements [aaa, bbb, ccc, ddd] using iBatis?

is it possible to map a string field with a particular format like:

aaa,bbb,ccc,ddd

into a List having elements [aaa, bbb, ccc, ddd] using iBatis?

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:

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.

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


Use TypeHandler, Example:

<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;
    }

}



I'm not sure why you want iBatis to do it, but you could just use String.split() to do the work, and map the results.

0

精彩评论

暂无评论...
验证码 换一张
取 消