java处理枚举类型 查询和插入

SpringBoot整合Mybatis注解式开发*

在配置文件application.yml中添加 处理枚举的所在包:
type-handlers-package: cn.rcm.enums.handle

1、枚举类

public enum SexEnum implements BaseEnum {

    MAN(1, "男"),
    WOMAN(2, "女");

    private int key;
    private String value;

    private SexEnum(int key, String value) {
        this.key = key;
        this.value = value;
    }

    public int getKey() {
        return key;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

2、实体类

@Data
public class User {

    private SexEnum sexEnum;
}

3、定义一个实现enum 接口


public interface BaseEnum {

    int getKey();

    void setKey(int key);

    String getValue();

    void setValue(String value);
}

4、

public class EnumKeyTypeHandler extends BaseTypeHandler<**BaseEnum** > {

    private Class<BaseEnum> type;
    private final BaseEnum[] enums;

    /**
     * 设置配置文件设置的转换类以及枚举类内容,供其他方法更便捷高效的实现
     *
     * @param type 配置文件中设置的转换类
     */
    public EnumKeyTypeHandler(Class<BaseEnum> type) {
        if (type == null)
            throw new IllegalArgumentException("Type argument cannot be null");
        this.type = type;
        this.enums = type.getEnumConstants();
        if (this.enums == null)
            throw new IllegalArgumentException(type.getSimpleName()
                    + " does not represent an enum type.");
    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = rs.getInt(columnName);

        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位BaseEnum子类
            return locateBaseEnum(i);
        }
    }

    @Override
    public BaseEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = rs.getInt(columnIndex);
        if (rs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位BaseEnum子类
            return locateBaseEnum(i);
        }
    }

    public BaseEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 根据数据库存储类型决定获取类型,本例子中数据库中存放INT类型
        int i = cs.getInt(columnIndex);
        if (cs.wasNull()) {
            return null;
        } else {
            // 根据数据库中的code值,定位BaseEnum子类
            return locateBaseEnum(i);
        }
    }

    public void setNonNullParameter(PreparedStatement ps, int i, BaseEnum parameter, JdbcType jdbcType)
            throws SQLException {
        // baseTypeHandler已经帮我们做了parameter的null判断
        ps.setInt(i, parameter.getKey());

    }

    /**
     * 枚举类型转换,由于构造函数获取了枚举的子类enums,让遍历更加高效快捷
     *
     * @param key 数据库中存储的自定义code属性
     * @return code对应的枚举类
     */
    private BaseEnum locateBaseEnum(int key) {
        for (BaseEnum status : enums) {
            if (status.getKey() == key) {
                return status;
            }
        }
        throw new IllegalArgumentException("未知的枚举类型:" + key + ",请核对" + type.getSimpleName());
    }

}

数据库里面数据

在这里插入图片描述

5、Dao 层实现数据的数字类型转换成我们想要的类型给前台

 //根据UserID查询User信息
    @Select("SELECT * FROM testuser WHERE userid=#{id}")
    @Results({
            @Result(property = "id", column = "userid"),
            @Result(property = "name", column = "username"),
            @Result(property = "birthday", column = "userbirth"),
            @Result(property = "description", column = "descript"),
            **@Result(property = "sexEnum",column =  "sex_enum",   typeHandler=cn.rcm.enums.handle.EnumKeyTypeHandler.class)}**)
     List<User> selectByID(String id);

结果返回:
   [
      {
        "sexEnum": "MAN"
      }
    ]

6、POST请求插入一条记录

body:
{
“sexEnum”: “MAN”
}

执行后数据库结果:
在这里插入图片描述
参考链接:

<think>好的,用户现在的问题是如何在PostgreSQL数据库插入枚举类型的数据。我需要根据提供的引用资料来解答这个问题。首先,我需要回顾一下引用的内容,看看有没有相关的信息。引用3提到,PostgreSQL的枚举类型是按照创建时列出的值顺序来排序的,并且支持比较运算符。还给出了一个插入数据的例子,比如INSERTINTO personVALUES ('Larry', 'sad');这里的current_mood字段是枚举类型。这说明插入枚举数据时,可以直接使用字符串字面值,只要该字符串是枚举类型中定义的值之一。另外,引用2提到在Java中使用JDBC时,需要处理枚举类型的映射,比如用AnimalType.valueOf(stmt.getString("pet_type"))来获取枚举值。这提示在应用程序中插入数据时,可能需要将Java枚举转换为字符串,但用户的问题可能更偏向于直接在数据库层面操作,比如使用SQL语句插入。所以,总结一下,插入枚举类型数据的步骤应该是:1.首先创建枚举类型,使用CREATETYPE语句定义允许的值。2.在表中创建列时指定该枚举类型。 3.插入数据时,使用合法的枚举值字符串。例如,创建类型:CREATE TYPEmood ASENUM('sad','ok', 'happy');然后创建表:CREATE TABLEperson (name text, current_moodmood);插入数据时:INSERT INTOperson VALUES('Larry','sad');需要注意的是,插入的值必须与枚举类型中定义的值完全一致,包括大小写,因为PostgreSQL的枚举是大小写敏感的(引用2提到)。例如,如果枚举类型是'sad',插入'SAD'或'Sad'会报错。 可能还需要注意事务中创建枚举类型的情况,或者权限问题,但用户的问题可能集中在基本插入操作上。此外,引用3中的例子也展示了如何插入不同的枚举值,并查询排序后的结果,这进一步验证了插入时使用字符串的正确性。 用户可能遇到的常见错误包括拼写错误或大小写不一致,需要提醒他们确保插入的值与枚举定义完全一致。此外,如果用户尝试插入不在枚举列表中的值,PostgreSQL会抛出错误,这也是需要注意的地方。</think>### 如何在 PostgreSQL 中插入枚举类型数据? #### 步骤说明 1. **创建枚举类型** 使用 `CREATE TYPE` 定义枚举类型,明确允许的值列表。例如: ```sql CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); ``` 2. **创建表并指定枚举列** 在表中定义列时直接引用已创建的枚举类型: ```sql CREATE TABLE person ( name TEXT, current_mood mood -- 使用自定义枚举类型 ); ``` 3. **插入枚举数据** 插入时直接写入枚举值的字符串形式(需严格匹配定义的值,包括大小写): ```sql INSERT INTO person VALUES ('Larry', 'sad'); INSERT INTO person VALUES ('Moe', 'happy'); ``` #### 注意事项 - **严格匹配值**:枚举值区分大小写,例如 `'Happy'` `'happy'` 会被视为不同值[^2]。 - **错误处理**:若插入未定义的枚举值(如 `'angry'`),PostgreSQL 会抛出错误。 - **查询支持**:枚举类型支持比较运算符(如 `>` `<`)排序,按定义顺序处理[^3]。 #### 示例验证 查询所有 `current_mood` 大于 `'sad'` 的记录: ```sql SELECT * FROM person WHERE current_mood > 'sad'; ``` 结果会返回 `'ok'` `'happy'`,因为枚举顺序为 `sad < ok < happy`[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值