首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串替换而不是准备语句的MyBatis类型处理程序

使用字符串替换而不是准备语句的MyBatis类型处理程序
EN

Stack Overflow用户
提问于 2021-06-15 19:28:34
回答 1查看 316关注 0票数 0

MyBatis是否支持使用字符串替换${​}​而不是准备好的语句替换#{​}​指定类型处理程序?

我试图用枚举值填充一个order by子句,所以我为此使用了一个TypeHandler,但是我无法让它工作。

EnumTypeHandler

代码语言:javascript
复制
public class EnumTypeHandler implements TypeHandler<MyEnum> {

  @Override
  public void setParameter(PreparedStatement ps, int i, MyEnum parameter,
      JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter.getValue());
  }

  @Override
  public MyEnum getResult(ResultSet rs, String columnName) throws SQLException {
    // Not implemented
    return null;
  }

  @Override
  public MyEnum getResult(ResultSet rs, int columnIndex) throws SQLException {
    // Not implemented
    return null;
  }

  @Override
  public MyEnum getResult(CallableStatement cs, int columnIndex) throws SQLException {
    // Not implemented
    return null;
  }
}

MyBatis XML

代码语言:javascript
复制
order by ${searchCriteria.sortBy, typeHandler=com.example.EnumTypeHandler}

误差

代码语言:javascript
复制
org.apache.ibatis.binding.BindingException: Parameter 'com' not found. Available parameters are [offset, searchCriteria, limit, param3, param1, param2]
EN

回答 1

Stack Overflow用户

发布于 2021-11-14 17:33:05

我相信字符串替换只是根据我的经验调用toString()。虽然如果您只想通过使用枚举指定要排序的列,但实际上不需要类型处理程序。使枚举名称与可能的列名相匹配应该可以。或者,如果希望代码中有更多可读的名称,则可以重写枚举的toString()以返回实际的列名。

不久前,我想使用枚举进行排序,因为${}只调用toString(),所以我只是重写了方法来返回列名,并将枚举放在没有任何类型处理程序的替换中。

这是非常简单的,但为了完整起见,这里基本上是我所做的。

代码语言:javascript
复制
public class Constants {
  public enum SortFields {
    REQUEST_DATE("REQ_DT"), ID_NUMBER("ID"), MEMBER_NAME("MEM_NM");

    private final String columnName;

    SortFields(String columnName) {
      this.columnName = columnName;
    }

    public String getColumnName() {
      return columnName;
    }

    public boolean equalsColumnName(String comparedColumnName) {
      return columnName.equals(comparedColumnName);
    }

    @Override
    public String toString() {
      return columnName;
    }
  }
}

把枚举传递给了一个${}。如果枚举名只是列名,而不是拼写出来的,那么重写toString()可能是不必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67992364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档