MyBtais整合Spring Boot整合,TypeHandler對枚舉類(enum)處理

概要

  • 問題描述

我想用枚舉類來表示用戶當前狀態,枚舉類由 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章