目 录CONTENT

文章目录

Mybatis使用枚举

Josue
2022-04-01 / 0 评论 / 0 点赞 / 146 阅读 / 716 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1、类型处理器(TypeHandler)

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

通过类型处理器(TypeHandler),可以实现javaBean以某种方式存入数据库中,抑或是从数据库取出的数据如何映射为javaBean。

通过继承BaseTypeHandler类,我们可以定制这个类型处理器,已实现枚举类或是一个javaBean的存取和写入。

2、枚举类

示例:

@Getter
public enum SexEnum {

    MALE(1,"男"),
    FAMALE(0,"女");

    private Integer sex;
    private String sexName;

    SexEnum(Integer sex,String sexName){
        this.sex = sex;
        this.sexName = sexName;
    }

    /*为了获取枚举中的值*/
    private static Map<Integer, SexEnum> sexEnumMap = new HashMap<>();
    static {
        for (SexEnum sexEnum : SexEnum.values()) {
            sexEnumMap.put(sexEnum.getSex(), sexEnum);
        }
    }

    /**
     *
     * @Title: getSexEnumByKey
     * @Description: 依据key获取枚举
     * @param sex
     * @return
     */
    public static SexEnum getSexEnumBySex(Integer sex) {
        return sexEnumMap.get(sex);
    }

3、实体类

@Data
public class User {

    private Long uid;
    private String name;
    /*mybatis如果需要使用枚举*/
    private SexEnum sex;
    private Integer age;
    private String email;
    private Integer is_deleted;
}

4、枚举类处理器

public class SexEnumHandler extends BaseTypeHandler<SexEnum> {

    /**
     * 用于定义设置参数时,该如何把Java类型的参数转换为对应的数据库类型
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, SexEnum sexEnum, JdbcType jdbcType) throws SQLException {

        // baseTypeHandler已经帮我们做了parameter的null判断
        // 第二个参数 : 存入到数据库中的值
        System.out.println(sexEnum.getSex());
        preparedStatement.setInt(i, sexEnum.getSex());
    }

    /**
     * 用于定义通过字段名称获取字段数据时,如何把数据库类型转换为对应的Java类型
     */
    @Override
    public SexEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {

        // 根据数据库存储类型决定获取类型,本例子中数据库中存放int类型
        int sex = resultSet.getInt(s);
        if (resultSet.wasNull()) {
            return null;
        } else {
            // 根据数据库中的sex值,定位SexEnum子类
            return SexEnum.getSexEnumBySex(sex);
        }

    
    }

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

    }

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

    }
}

5、配置枚举类

mybatis:
  type-handlers-package: com.test.handler

6、其他正常操作即可

0

评论区