MyBatisの列挙クラスには、詳細な地図を使用しています

1.はじめに

ただ、春ブートも少なく熟練開始、最初の空のフレームを壊し、その後、簡単なユーザーのクエリ、挑戦的な何を書きました。それを考える前にされている列挙かなり理解していない、とユーザーの性別はちょうど(オス、メス)を表すために列挙型を使用することができます。そこで彼は、彼の掘削の旅を始めました。
本論文では、3つの部分に分かれています。

  1. MyBatisのは、列挙型変換が来ます
  2. カスタム列挙型変換
  3. (次のいずれかが導入される)のMyBatisの型変換の深い理解
    プロジェクト構造

2. MyBatisのは、列挙型変換が来ます

MyBatisの構築された2列挙コンバータは、次のとおりorg.apache.ibatis.type.EnumTypeHandlerorg.apache.ibatis.type.EnumOrdinalTypeHandler

EnumTypeHandler

これは、文字列のインスタンス名に変換された列挙インスタンスを変換しようとしているデフォルトの列挙コンバータ、あるComputerState.OPEN変換しますOPEN

EnumOrdinalTypeHandler

このコンバータは、インスタンスのプロパティの順序値を示唆している、すなわち名前を列挙しますComputerState.OPEN0に変換され、ComputerState.CLOSEは1に変換されます。

使用

テーブルを作成するには

CREATE TABLE `users` (
      `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `username` varchar(33) DEFAULT NULL COMMENT '姓名',
      `sex` varchar(8) DEFAULT NULL COMMENT '性别',
      `age` int(3) DEFAULT NULL COMMENT '年龄',
      `money` double DEFAULT NULL COMMENT '账户余额',
      PRIMARY KEY (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

作成列挙

public enum UserSexEnum {
    MALE,
    FEMALE;
}

エンティティークラスの作成

public class User {
    private int id;
    private String username;
    private UserSexEnum sex;
    private int age;
    private double money;

    public User() {
        super();
    }

    public User(String username, UserSexEnum sex, int age, double money) {
        super();
        this.username = username;
        this.sex = sex;
        this.age = age;
        this.money = money;
    }
    // getter和setter方法不在此赘述
}

マッピングインターフェイスを作成します。

public interface UserMapper {
    List<User> getAll();
    void insert(User user);
}

XML設定ファイル

<mapper namespace="com.**.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.**.entity.User">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="sex" property="sex" javaType="com.**.enums.UserSexEnum"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="money" property="money" jdbcType="DOUBLE"/>
    </resultMap>

    <sql id="Base_Column_List">
        id, username, sex, age, money
    </sql>

    <select id="getAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List" />
        FROM users
    </select>

    <insert id="insert" parameterType="com.huawei.demo.entity.User" >
       INSERT INTO
            users
            (username, sex, age, money)
        VALUES
            (#{username}, #{sex}, #{age}, #{money})
    </insert>
</mapper>

テスト

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testInsert(){
        userMapper.insert(new User("aaa", UserSexEnum.MALE, 18, 2.5));
        userMapper.insert(new User("bbb",  UserSexEnum.FEMALE, 24, 8.6));
        userMapper.insert(new User("ccc", UserSexEnum.FEMALE, 21, 5.4));
        
        Assert.assertEquals(3, userMapper.getAll().size());
    }
}

ほとんどEnumOrdinalTypeHandler方法と、デフォルトを使用しますが、何を指定する必要がtypeHandler
列挙を作成します

public enum UserSexEnum {
    MALE(0,"男"),
    FEMALE(1,"女");

    private int sex;
    private String sexName;

    UserSexEnum(int sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }
    public int getSex() {
        return sex;
    }
    public String getSexName() {
        return sexName;
    }
}

XML設定を変更します。

<!--resultMap里结果的映射-->
<result column="sex" property="sex" javaType="com.**.enums.UserSexEnum" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<!--insert语句插入字段的设置-->
, #{sex, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},

3.カスタム列挙型変換

毎日の符号化中に、私たちはしばしば、このような列挙が存在するような、特定のステータス、種類やステージを示す値とケースが発生します。

public enum  OrderStatus {
    CREATE(10, "创建"),
    PAYING(13, "支付中"),
    IN_PROGRESS(21, "支付成功"),
    FAILED(36, "支付失败"),
    REVERSED(48, "取消订单");

    private int value;
    private String desc;

    OrderStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    public int getValue() {
        return value;
    }

    public String getDesc() {
        return desc;
    }
}

通常、我々は、その値は、データベースOrderStatus.PAYING 13に格納され、データベースに状態値を表現したいです。明らかに、これら2つの組み込み列挙コンバータは、我々のニーズを満たすことができないので、私たちは、カスタム列挙コンバータを必要としています。
MyBatisのも、このインタフェースを実装しEnumTypeHandlerとEnumOrdinalTypeHandlerの上、当社独自の拡張型コンバータのorg.apache.ibatis.type.BaseTypeHandlerクラスを提供します。

public class EnumOrderStatusHandler extends BaseTypeHandler<OrderStatus> {

    /**
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
     * @param type 配置文件中设置的转换类
     */
    public EnumOrderStatusHandler(Class<OrderStatus> type) {
        if (type == null)
            throw new IllegalArgumentException("Type argument cannot be null");
    }

    /**
     * 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, OrderStatus parameter, JdbcType jdbcType) 
    throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
        // ps.setString
        ps.setInt(i, parameter.getValue());
    }

    /**
     * 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
     */
    @Override
    public OrderStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
        // String i = rs.getString(columnName);
        int i = rs.getInt(columnName);
        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的值,定位Enum子类
            return locateEnum(i);
        }
    }

    /**
     * 用于定义通过字段索引获取字段数据时,如何把数据库类型转换为对应的Java类型
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public OrderStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
        // String i = rs.getString(columnIndex);
        int i = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的值,定位Enum子类
            return locateEnum(i);
        }
    }

    /**
     * 用定义调用存储过程后,如何把数据库类型转换为对应的Java类型
     * @param cs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public OrderStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
        // String i = cs.getString(columnIndex);
        int i = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的值,定位Enum子类
            return locateEnum(i);
        }
    }

    /**
     * 枚举类型转换
     * @param value 数据库中存储的自定义属性
     * @return value对应的枚举类
     */
    private OrderStatus locateEnum(int value) {
        for (OrderStatus status : OrderStatus.values()) {
            if (status.getValue() == value) {
                return status;
            }
        }
        throw new IllegalArgumentException("未知的枚举类型:" + value);
    }
}

より高度な使い方がありますが、あなたはMyBatisの設定ファイルのメンテナンスを簡素化することができます。第三の物品を特に参照すると

参考リンク

Javaは、MySQLは、MyBatisのは、使用する列挙型を列挙
SSM(a)は-MyBatis列挙マッピングを
MyBatisの中にエレガントな使用を列挙する方法

おすすめ

転載: blog.csdn.net/intersting/article/details/93768803