为了账号安全,请及时绑定邮箱和手机立即绑定

MyBtais整合Spring Boot整合,TypeHandler对枚举类(enum)处理

标签:
Java SpringBoot
概要
  • 问题描述

我想用枚举类来表示用户当前状态,枚举类由 codemsg 组成,但我只想把 code 保存到数据库,查询处理,能知道用户当前状态,这应该怎么做呢?在 Spring 整合MyBatis 的时候,我们有一个MyBatis的配置文件,我们可以用下面的标签样式指定

<typeHandlers>
    <typeHandler handler="com.xxx.XxxTypeHandler" javaType="com.xxx.XxxEnum"/>
</typeHandlers>

Spring Boot 整合 MyBatis 呢?

  • 解决方案

MyBatis为我们提供了解决方案:你可以集成 BaseTypeHandler,或者实现 TypeHandler。我们需要在应用配置文件中指定handler的路径

  type-handlers-package: com.xxx.handlers

另外,我们需要在Handler上添加注解,指明枚举类(enum)。

枚举类
package com.fengwenyi.learn.java.mybatisenum;

/**
 * @author Wenyi Feng
 */
public enum Status {

    LOGIN(100, "在线"),
    LOGOUT(200, "不在线")
    ;

    private Integer code;
    private String msg;

    Status(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 通过 code 获取 Status
     * @param code
     * @return
     */
    public static Status getStatusByCode(Integer code) {
        switch (code) {
            case 100:
                return LOGIN;
            case 200:
                return LOGOUT;
            default:
                return LOGOUT;
        }
    }

    // getter
}
TypeHandler
package com.fengwenyi.learn.java.mybatisenum.handlers;

import com.fengwenyi.learn.java.mybatisenum.Status;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author Wenyi Feng
 */

@MappedTypes({Status.class})
public class UserStatusTypeHandler implements TypeHandler<Status> {

    @Override
    public void setParameter(PreparedStatement preparedStatement, int i, Status status, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, status.getCode());
    }

    @Override
    public Status getResult(ResultSet resultSet, String s) throws SQLException {
        Integer code = resultSet.getInt(s);
        return Status.getStatusByCode(code);
    }

    @Override
    public Status getResult(ResultSet resultSet, int i) throws SQLException {
        Integer code = resultSet.getInt(i);
        return Status.getStatusByCode(code);
    }

    @Override
    public Status getResult(CallableStatement callableStatement, int i) throws SQLException {
        Integer code = callableStatement.getInt(i);
        return Status.getStatusByCode(code);
    }
}
application.yml
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/learn
    username: root
    password: xfsy2018
mybatis:
  type-aliases-package: com.fengwenyi.learn.java.mybatisenum.model
  mapper-locations: classpath:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-handlers-package: com.fengwenyi.learn.java.mybatisenum.handlers
测试
@Autowired
private IUserService userService;

@Test
public void contextLoads() {

    // find();
    insert();
}

private void insert() {
    UserModel model = new UserModel();
    model.setStatus(Status.LOGIN);
    boolean rs = userService.save(model);
    System.out.println(rs);
}

private void find() {
    List<UserModel> modelList = userService.findAll();
    for (UserModel model : modelList) {
        System.out.println(model.toString());
    }
}
数据

查询结果

数据库

测试代码

https://github.com/fengwenyi/JavaLearnProject/tree/master/mybatis-enum

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.4万
获赞与收藏
707

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消