Mybatis实体类中枚举类属性的处理

本文介绍如何在MyBatis中处理枚举类型,包括枚举的定义、使用枚举属性进行数据库操作的方法及自定义枚举类和TypeHandler来优化枚举处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

还是用原来的数据库。
第一步:添加数据库列:

ALTER TABLE teachers ADD status varchar(11)

首先添加枚举类:

public enum Status {
    ON,OUT,REMOBE
}

查看枚举类:

    @Test
    public void testEnumTeachers() {
        Status status = Status.REMOBE;
        System.out.println("枚举的索引:"+status.ordinal());
        System.out.println("枚举的name:"+status.name());
    }
    输出:
    枚举的索引:2

实体类添加添加枚举属性:

private Status statusNew=Status.ON;
    public Teachers(Status statusNew, String name, String gender, Integer schoolId) {
        super();
        this.statusNew = statusNew;
        this.name = name;
        this.gender = gender;
        this.schoolId = schoolId;
    }

mapper.xml对应的方法加上 得到自增主键的属性:

<insert id="insertSelective" parameterType="entity.Teachers" useGeneratedKeys="true" keyProperty="id">

然后将逆向工程中得到的string类型的status属性替换成枚举类的属性
  <insert id="insertSelective" parameterType="entity.Teachers" useGeneratedKeys="true" keyProperty="id">
    insert into teachers
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="name != null">
        name,
      </if>
      <if test="gender != null">
        gender,
      </if>
      <if test="schoolId != null">
        school_id,
      </if>
      <if test="statusNew != null">
        status,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="gender != null">
        #{gender,jdbcType=VARCHAR},
      </if>
      <if test="schoolId != null">
        #{schoolId,jdbcType=INTEGER},
      </if>
      <if test="statusNew != null">
        #{statusNew,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

最后测试:

  @Test
    void test1() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
        TeachersMapper teachersMapper = sqlSession.getMapper(TeachersMapper.class);
        Teachers teachers = new Teachers(Status.OUT, "zz", "1", 2);
        teachersMapper.insertSelective(teachers);
        System.out.println("插入成功:"+teachers.getId());
        sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }

还有一种保存方式:
注意:mybatis在处理枚举对象的时候是枚举的名字 ,
使用的是EnumTypehandler处理的
保存参数的时候:

ps.setString(i, parameter.name());

我们也可以改变使用另一种方法:
EnumOrdinalTypeHandler 它保存的时候是使用枚举的索引

ps.setInt(i, parameter.ordinal());

需要到全局配置文件中添加:

    <typeHandlers>
    <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="entity.Status"/>
    </typeHandlers>

问题:
你说保存一个一个名字还好 要是保存一个索引该多费解啊 所以我们自定义枚举类给它添加点说明。

package entity;

public enum Status {
    ON(200,"在线"),OUT(300,"离线"),REMOBE(400,"不存在");

    private Integer id;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private String name;
    private Status(Integer id,String name) {
        this.id=id;
        this.name=name;
    }
}

测试:


@Test
    public void testEnumTeachers() {
        Status status = Status.REMOBE;
        System.out.println("枚举的索引:"+status.ordinal());
        System.out.println("枚举的name:"+status.name());
        System.out.println("状态码:"+status.getId());
        System.out.println("说明:"+status.getName());
    }

输出:

枚举的索引:2
枚举的name:REMOBE
状态码:400
说明:不存在

·自定义typehandler·
目的:保存数据库的时候保存的是状态码,获取数据的时候是枚举类。
枚举类:


public enum Status {
    ON(200,"在线"),OUT(300,"离线"),REMOBE(400,"不存在");

    private Integer id;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private String name;
    private Status(Integer id,String name) {
        this.id=id;
        this.name=name;
    }

    public static Status getStatus(Integer id) {
        switch (id) {
        case 200:
            return ON;
        case 300:
            return OUT;
        case 400:
            return REMOBE;
        default:
            return ON;
        }
    }
}

自定义typehandler类: 继承TypeHandler<Status>


public class DiyTypeHandler implements TypeHandler<Status>{

    @Override
    public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("插入的状态码是:"+parameter.getId());
        ps.setString(i, parameter.getId().toString());
    }

    @Override
    public Status getResult(ResultSet rs, String columnName) throws SQLException {

        int statusId = rs.getInt(columnName);
        System.out.println("得到的状态码是:"+statusId);
        Status status = Status.getStatus(statusId);
        return status;
    }

    @Override
    public Status getResult(ResultSet rs, int columnIndex) throws SQLException {
        int statusId = rs.getInt(columnIndex);
        System.out.println("得到的状态码是:"+statusId);
        Status status = Status.getStatus(statusId);
        return status;
    }

    @Override
    public Status getResult(CallableStatement cs, int columnIndex) throws SQLException {
        int statusId = cs.getInt(columnIndex);
        System.out.println("得到的状态码是:"+statusId);
        Status status = Status.getStatus(statusId);
        return status;
    }

}

全局配置:

<typeHandlers>
    <typeHandler handler="typehandler.DiyTypeHandler" javaType="entity.Status"/>
</typeHandlers>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值