mybatisplus中配置TypeHanlder实现自定义转换

130 阅读2分钟

背景: 数据库中有一个表form, 里面有一个创建人属性,存储创建人Id, 在java的form 类里面,定义一个SimpleUser对象来接收创建人信息, 使用mybatis-plus的时候,需要获取到user对象的Id进行存储

实现方式: 我们通过mybatis-plus的 @TableField 注解和TypeHanlder配合来实现

1.实体类展示

1.1 用户类

@Data
public class SimpleUser implements Serializable {
    private static final long serialVersionUID = 8797387968531262608L;

    private Long id;
}

1.2 表单类

@TableName(autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@Data
public class Form extends FormBaseEntity {

    private static final long serialVersionUID = -7883088166454023696L;

    /**
     * 表单名称
     */
    private String name;

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    private SimpleUser creator;

    private Date createTime;

    private Date updateTime;

}

2.数据库设计

CREATE TABLE `form`
(
    `id`          decimal(20, 0) NOT NULL,
    `name`        varchar(50) DEFAULT NULL,
    `creator`     decimal(20, 0) NOT NULL,
    `create_time` datetime    DEFAULT NULL,
    `update_time` datetime    DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3.实现自定义typeHeadler

/**
 * SysUserTypeHandler
 */
public class SysUserTypeHandler extends BaseTypeHandler<SimpleUser> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, SimpleUser parameter, JdbcType jdbcType) throws SQLException {
	# 获取id内容
        ps.setLong(i, parameter.getId());
    }

    @Override
    public SimpleUser getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return null;
    }

    @Override
    public SimpleUser getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }

    @Override
    public SimpleUser getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }
}

4. 在form类中新增注解

@TableName(autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@Data
public class Form extends FormBaseEntity {

    private static final long serialVersionUID = -7883088166454023696L;

    /**
     * 表单名称
     */
    private String name;

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    /**
     * 使用此注解在实体类中要同步新增配置 否则不生效
     * @TableName(autoResultMap = true)
     */
    @TableField(typeHandler = SysUserTypeHandler.class)
    private SimpleUser creator;

    private Date createTime;

    private Date updateTime;

}

5.测试

image.png

==>  Preparing: INSERT INTO form ( id, name, creator, create_time ) VALUES ( ?, ?, ?, ? )
==> Parameters: 6228948182529317756(Long), 12(String), 1(Long), 2023-07-16 12:30:25.287(Timestamp)
<==    Updates: 1