Я пытался сделать обычай TypeHandler
в MyBatis так что для null
столбца в базе данных, MyBatis возвращает реализацию Null Object pattern вместо того, чтобы в классе домена в null
.Null модели объекта с MyBatis TypeHandler
После прибегая к помощи за помощью, я достиг проект EXCELENT mybatis-koans, а именно koan 19, что обращается именно этот вопрос с таким же подходом я использую, то есть расширение BaseTypeHandler<T>
(абстрактно). На данный момент, у меня есть конкретный TypeHandler
, похожий на EmailTypeHandler
in that koan:
/**
* Acts as a factory method to return the appropriate implementation of an Email.
* Returns a Null object if the email value in the database was null/empty
*/
public class EmailTypeHandler extends BaseTypeHandler<Email> {
@Override
public Email getNullableResult(ResultSet rs, String colName) throws SQLException {
return createEmail(rs.getString(colName));
}
@Override
public Email getNullableResult(ResultSet rs, int colNum) throws SQLException {
return createEmail(rs.getString(colNum));
}
private Email createEmail(String s) {
System.out.println(s);
if (s == null || s.equals("")) {
return new NullEmail();
} else {
return new EmailImpl(s);
}
}
@Override
public Email getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
return null;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int colNum,
Email e, JdbcType t) throws SQLException {
}
}
К сожалению, кажется, что автор (midpeter444) сталкивается с той же проблемой: когда значение в БД null
, нуль является все еще вернулись вместо объекта, созданного в бетоне TypeHandler
.
Красота открытого источника - прочитайте код ответа. Хороший анализ! Одна критика - вы все еще можете подклассифицировать BaseTypeHandler и просто переопределить методы getResult, нет? Чтобы реализовать TypeHander напрямую, вам также придется реализовать setParameters, который для этого случая может быть просто нерабочим, но в других сценариях вам может понадобиться функциональность, предоставляемая 'BaseTypeHandler # setParameters'. – quux00
Вы правы ... Лучше просто переопределить метод getResult, чтобы использовать предоставленный метод setParameter в 'BaseTypeHandler'. – jalopaba