gpt4 book ai didi

java - 带有 MyBatis TypeHandler 的空对象模式

转载 作者:搜寻专家 更新时间:2023-11-01 02:28:41 26 4
gpt4 key购买 nike

我一直在尝试定制TypeHandler在 MyBatis 中,对于 null数据库中的列,MyBatis 返回一个 Null Object pattern 的实现而不是 null在域类中。

google 寻求帮助后,我找到了优秀的项目 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 时, 仍然返回 null 而不是在混凝土中制作的对象 TypeHandler .

最佳答案

我在发布问题后立即看到了解决方案。在 BaseTypeHandler代码:

[...]
public T getResult(ResultSet rs, String columnName) throws SQLException {
T result = getNullableResult(rs, columnName);
if (rs.wasNull()) {
return null;
} else {
return result;
}
}

public T getResult(ResultSet rs, int columnIndex) throws SQLException {
T result = getNullableResult(rs, columnIndex);
if (rs.wasNull()) {
return null;
} else {
return result;
}
}

public T getResult(CallableStatement cs, int columnIndex) throws SQLException {
T result = getNullableResult(cs, columnIndex);
if (cs.wasNull()) {
return null;
} else {
return result;
}
}

public abstract void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;

public abstract T getNullableResult(ResultSet rs, String columnName) throws SQLException;

public abstract T getNullableResult(ResultSet rs, int columnIndex) throws SQLException;

public abstract T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException;
[...]

很明显,BaseTypeHandler将返回 null当数据库中的值为null时, 作为 cs.WasNull()true在这种情况下。因此,解决方案是创建一个具体的 TypeHandler<T> 返回适当的实现(在本例中,当数据库中的值为 null 时返回 NullObject 实现)而不子类化 BaseTypeHandler .

已编辑(在 quux00 的评论之后):当然,我们可以只覆盖 getResult BaseTypeHandler的方法| ,鉴于其方法提供的功能 setParameters可能会有用。

关于java - 带有 MyBatis TypeHandler 的空对象模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14874547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com