IT虾米网

Java MyBatis 枚举字符串值

lautakyan007 2023年10月09日 编程语言 161 0

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


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!