Java MyBatis Enum字符串值

Mav*_*Riz 6 java enums enumeration ibatis mybatis

我觉得这是一个简单的问题,但我试过的一切都不适合我.我有一个枚举,我有字符串构造函数的原因是因为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;
       }
Run Code Online (Sandbox Code Playgroud)

现在我有一个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}
Run Code Online (Sandbox Code Playgroud)

testEnum插入C,所以我改为#{testEnum.toString()},这给了我一个没有getter的属性名称toString()错误.我尝试了#{testEnum.display}和#{testEnum.name}它们都插入了C而我希望它插入2C.你们知道一个更容易处理的方法吗?

我不想将模型对象更改为传递String而不是TestEnum,因为此对象正在许多地方使用.有没有办法可以在mybatis映射器中完成此操作而不更改模型对象?

谢谢你的帮助 :)

Mal*_*alt 4

你需要的是一个TypeHandler

首先,添加一个静态方法来TestEnum返回给TestEnum定的显示字符串:

public static TestEnum fromDisplay(String display){
    for (TestEnum v : TestEnum.values()){
        if (v.getDisplay().equals(display)){
            return v;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

然后用它来创建你的 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在 mybatis xml 中注册您的 TypeHandler:

<typeHandlers>
  <typeHandler handler="blah.blah.TestEnumTypeHandler "/>
</typeHandlers>
Run Code Online (Sandbox Code Playgroud)