Java MyBatis 枚举字符串值

标签 java enums mybatis enumeration ibatis

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

相关文章:

Java - 避免创建空的子类和接口(interface)或生成 Java 源代码模板

java - mybatis,世界上最流行的sql映射框架?

java - jersey - StreamingOutput 作为响应实体

java - 计算结果未显示在文本字段中

c - 结构体 : dereferencing pointer to incomplete type 中的枚举

java - 是否可以使用枚举或命名常量设置 bean 参数?

c# - 如何在 C# 中将 IEnumerable<Enum> 转换为枚举?

java - JMS 队列接收消息?

java - 自定义 PermissionEvaluation bean 导致循环引用和空指针异常

java - 如何配置log4j记录mybatis的sql语句