6

enum プロパティを含む POJO があります。

[Speed.java]

public class SpeedEntry implements Serializable {

    [...]

    private int idSpeed;
    private SpeedStatus status; // enum Property

    [...]

[SpeedStatus.java]

public enum SpeedStatus {

[...]

VALID(1), INVALID(2), UNKNOWN(0);   // Possible values.

private int value;

// Default constructor
private SpeedStatus(final int pValue) {
    this.value = pValue;
}
[...]

そして、Speed オブジェクトを格納および取得し、そのプロパティを通常どおり MyBatis で埋めたいと思います。SpeedStatus に割り当てられた列はINT(11)として作成されました。

この場合、INSERTを実行すると、次のように内部値プロパティに直接アクセスすることになります。

#{status.value}

ただし、オブジェクトを取得し、データベースに格納されている整数からその列挙値を取得することは、オブジェクトを挿入するほど簡単ではありませんでした。運が悪かったので、resultMapを使用してみました:

[speedMapper.xml]

<resultMap id="speedMap" type="Speed">
        <result property="idSpeed" column="idSpeed" />
        <result column="status" property="status.value" 
            typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>

だから...私が探しているものを達成することは可能ですか? そこに簡単な明確な例はありますか?

最良の代替手段は何ですか? データベースに格納されている型を "enum" に変更する必要がありますか?

前もって感謝します。

4

2 に答える 2

4

挿入ステートメントでは、その内部値に直接アクセスします

#{status.value}

このようにして、値 1 で VALID を挿入し、値 2 で INVALID を挿入し、値 0 で NUKNOWN を挿入します。

typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"

つまり、次を使用して、テーブルのint(11)フィールドを Enum POJO プロパティにマップします。

SpeedStatus.ordinal()

列挙値は、 で定義された順序でマップされSpeedStatusます。そのため、SELECT ステートメントのテーブル フィールド値 0 は VALID にマップされ、1 は INVALID にマップされ、2 は UNKNOWN にマップされます。

それでも使用したい場合はEnumOrdinalTypeHandler、その値と等しい Enum 値を定義する必要がありordinal()ます。

public enum SpeedStatus {

    UNKNOWN(0), VALID(1), INVALID(2); 

    private int value;

    private SpeedStatus(final int pValue) {
        this.value = pValue;
    }

}

于 2013-08-12T12:48:13.780 に答える
4

int を Enum に変換したい場合は、独自の EnumHandler を定義できます。

public class SpeedStatusTypeHandler implements TypeHandler<SpeedStatus> {

public SpeedStatus getResult(ResultSet rs, String param) throws SQLException {
return SpeedStatus.getEnum(rs.getInt(param));
}

public SpeedStatus getResult(CallableStatement cs, int col) throws SQLException {
return SpeedStatus.getEnum(cs.getInt(col));
}

public void setParameter(PreparedStatement ps, int paramInt, SpeedStatus paramType, JdbcType jdbctype)
    throws SQLException {
ps.setInt(paramInt, paramType.getId());
}
}

この typeHandler を my batis 設定ファイルに追加するだけです。

 <typeHandlers> 
        <typeHandler javaType='SpeedStatus' handler='SpeedStatusTypeHandler' /> 
</typeHandlers>

resultMap で typeHandler に言及する必要さえありません。Pojo で SpeedStatus Enum に遭遇するたびに、mybatis が処理します。

于 2013-09-12T07:35:59.667 に答える