[英]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.