SpringBoot-MybatisPlus typeHandler配置及使用

3,175 阅读1分钟

类型处理器,用于 JavaType 与 JdbcType 之间的转换,用于 PreparedStatement 设置参数值和从 ResultSet 或 CallableStatement 中取出一个值,本文讲解 mybaits-plus 内置常用类型处理器如何通过TableField注解快速注入到 mybatis 容器中。

JsonArrayTypeHandler

package com.xxx;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

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


@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({JSONArray.class})
public class JsonArrayTypeHandler extends BaseTypeHandler<JSONArray> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, JSONArray objects, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, JSON.toJSONString(objects));

    }

    @Override
    public JSONArray getNullableResult(ResultSet resultSet, String s) throws SQLException {
        String str = resultSet.getString(s);
        return JSON.parseArray(str);
    }

    @Override
    public JSONArray getNullableResult(ResultSet resultSet, int i) throws SQLException {
        String str = resultSet.getString(i);
        return JSON.parseArray(str);
    }

    @Override
    public JSONArray getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String str = callableStatement.getString(i);
        return JSON.parseArray(str);
    }
}

JsonObjectTypeHandler

package com.xxx;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.type.*;

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

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({JSONObject.class})
public class JsonObjectTypeHandler extends BaseTypeHandler<JSONObject> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, JSONObject o, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, JSON.toJSONString(o));
    }

    @Override
    public JSONObject getNullableResult(ResultSet resultSet, String s) throws SQLException {
        String t = resultSet.getString(s);
        return JSON.parseObject(t);
    }

    @Override
    public JSONObject getNullableResult(ResultSet resultSet, int i) throws SQLException {
        String t = resultSet.getString(i);
        return JSON.parseObject(t);
    }

    @Override
    public JSONObject getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String t = callableStatement.getString(i);
        return JSON.parseObject(t);
    }
}

model使用

package com.xxx;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.xxx.JsonArrayTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "t_api_project", autoResultMap = true)
public class XXXPO implements Serializable {
    private static final long serialVersionUID = -48158336883427082L;
    /**
     * 项目id
     */
    @TableId("id")
    private Integer id;
    /**
     * 名称
     */
    private String name;
    /**
     * 描述
     */
    private String descInfo;
    
    /**
     * 请求Header
     */
    @JsonProperty("request_headers")
    @TableField(value = "request_headers", typeHandler = JsonArrayTypeHandler.class)
    private JSONArray requestHeaders;

    /**
     * 创建人
     */
    @JsonProperty("creator_id")
    private Integer creator;
    /**
     * 是否删除:0-未删除、1-已删除
     */
    @TableLogic
    @JsonProperty("is_delete")
    private Integer isDelete;
    /**
     * 记录创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date ctime;
    /**
     * 修改时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date mtime;


}

配置TypeHandler扫描路径,配置typeHandlersPackage属性,SqlSessionFactoryBean 会把该包下面的类注册为对应的 TypeHandler

mybatis-plus.global-config.db-config.id-type = auto
mybatis-plus.mapper-locations=classpath*:mappers/**/*Mapper.xml
mybatis-plus.type-aliases-package=com.xxx.dao
mybatis-plus.type-handlers-package=com.xxx.handler