1. 程式人生 > >MyBtais整合Spring Boot整合,TypeHandler對列舉類(enum)處理

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());
    }
}

資料

查詢結果

資料庫

測試程式碼