类型处理器,用于 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