簡體   English   中英

MyBatis Typehandler 使用字符串替換而不是預處理語句

[英]MyBatis Typehandler with String Substitution Instead of Prepared Statement

MyBatis 是否支持使用字符串替換${}而不是准備語句替換#{}來指定類型處理程序?

我正在嘗試使用枚舉值填充order by子句,因此我為此使用了 TypeHandler,但無法使其正常工作。

枚舉類型處理程序

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

order by ${searchCriteria.sortBy, typeHandler=com.example.EnumTypeHandler}

錯誤

org.apache.ibatis.binding.BindingException: Parameter 'com' not found. Available parameters are [offset, searchCriteria, limit, param3, param1, param2]

我相信字符串替換只是根據我的經驗調用toString() 盡管如果您只想使用枚舉指定要排序的列,您實際上並不需要類型處理程序。 讓枚舉名稱與可能的列名匹配應該可以工作。 或者,如果您希望代碼中的名稱更具可讀性,您可以覆蓋枚舉的toString()以返回實際的列名。

前段時間我想使用枚舉進行排序,因為${}只是調用toString() ,所以我只是重寫了返回列名的方法並將枚舉放入替換中,而沒有任何類型處理程序。

這非常簡單,但為了完整起見,這基本上就是我所做的。

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM