gpt4 book ai didi

Java MyBatis 枚举字符串值

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:02 26 4
gpt4 key购买 nike

我觉得这是一个简单的问题,但我尝试过的所有方法都不适合我。我有一个枚举,我有字符串构造函数的原因是因为 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>

关于Java MyBatis 枚举字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551201/

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