【问题标题】:iBatis mapping: map a string field into a List<String>iBatis 映射:将字符串字段映射到 List<String>
【发布时间】:2011-02-10 23:51:13
【问题描述】:

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

aaa,bbb,ccc,ddd

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

我需要在我的模型中包含以下内容:

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

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

谢谢 罗伯托

【问题讨论】:

    标签: java sybase ibatis


    【解决方案1】:

    您可以通过CustomType Handler

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

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

    然后您编写您的 class StringSplitTypeHandlerCallBack implements TypeHandlerCallback 代码,这将在 getResult() 方法中调用 String.split()

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我不知道你为什么要 iBatis 做,但你可以使用 String.split() 来做这个工作,并映射结果。

        【讨论】:

        • 是的,我知道如何在 java 端做到这一点,我只是想知道是否可以使用 ibatis 自动做到这一点
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 2017-03-22
        • 2012-01-23
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多