我觉得这是一个简单的问题,但我尝试过的所有方法都不适合我。我有一个枚举,我有字符串构造函数的原因是因为 Java 不允许枚举为数字。我在没有字符串构造函数的情况下直接尝试了 AA、AB、2C,但这给出了一个错误。请注意,对于现有的枚举,我添加了 C("2C")。
public enum TestEnum{
AA("AA"), AB("AB"), C("2C");
private String display;
private TestEnum( String display ) {
this.display = display;
}
public String toString() {
return display;
}
public String getDisplay() {
return display;
}
public void setDisplay( String display ) {
this.display = display;
}
public String getName() {
return display;
}
现在我有一个 mybatis 映射器,它执行合并这是现有的,映射器的参数之一是 TestEnum。到目前为止,这工作正常,因为枚举值和字符串值相同,但我添加了 C("2C")。现在我想使用 mybaits 将 2C 插入到表中,但它总是插入 C。
merge into text t
using (select #{id} as id from dual) d on (d.id = t.id)
when matched then
update set
appId = #{applId},
src = #{testEnum}
testEnum 插入 C,所以我将其更改为 #{testEnum.toString()} 这给了我一个 there is no getter for property name toString() 错误。我试过 #{testEnum.display} 和 #{testEnum.name} 它们仍然插入 C 而我希望它插入 2C。你们知道更简单的处理方法吗?
我不想更改模型对象以传递 String 而不是 TestEnum,因为这个对象在很多地方都被使用。有没有一种方法可以在不更改模型对象的情况下在 mybatis 映射器中完成此操作?
感谢您的帮助:)
请您参考如下方法:
您需要的是 TypeHandler
首先,将静态方法添加到您的 TestEnum
以在给定显示字符串的情况下返回 TestEnum
:
public static TestEnum fromDisplay(String display){
for (TestEnum v : TestEnum.values()){
if (v.getDisplay().equals(display)){
return v;
}
}
return null;
}
然后使用它来创建您的 TypeHandler:
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class TestEnumTypeHandler extends BaseTypeHandler<TestEnum> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, TestEnum parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, parameter.getDisplay());
}
@Override
public TestEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
return TestEnum.fromDisplay(rs.getString(columnName));
}
@Override
public TestEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return TestEnum.fromDisplay(rs.getString(columnIndex));
}
@Override
public TestEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return TestEnum.fromDisplay(cs.getString(columnIndex));
}
}
最后,在你的mybatis xml中注册你的TypeHandler:
<typeHandlers>
<typeHandler handler="blah.blah.TestEnumTypeHandler "/>
</typeHandlers>