天天看點

Mybtais-plus整合Pgsql自定義類型轉換

作者:我家有豬小辰辰

1、場景說明:

pgsql裡面description字段類型為jsonb,需要在代碼裡面自定義類型轉換器,便于直接存取

2、代碼

/*
    1、Model:必須要有無參構造方法,否則會導緻填充值的時候報錯
        順序:先new對象,然後調用set方法
*/ 
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class LanguageModel {

    /**
     * 英文
     */
    private String language_en;

    /**
     * 中文
     */
    private String language_zh;

    public static LanguageModel getModel(String str){
        return new LanguageModel(str,str);
    }
}

/*
    1.實體類:關鍵直接:@TableName和@TableField
        @TableName必須帶上autoResultMap = true,否則在自定義類型轉換裡面不會進入到getNullableResult()這個方法裡面
        @TableField指定類型轉換器
*/


@Data
@Accessors(chain = true)
@TableName(value = "security_vulnerability_category",autoResultMap = true)
public class SecurityVulnerabilityCategoryEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;


    /**
     * 連結
     */
    @TableField("code")
    private String code;

    /**
     * 描述
     */
    @TableField(value = "description", typeHandler = LanguageModelTypeHandler.class)
    private LanguageModel description;

    @TableField(value = "create_at")
    private Date createAt;

    @TableField(value = "update_at", update = "now()")
    private Date updateAt;


}

/*
    3.類型轉換器
*/

@MappedTypes(PGobject.class)
@MappedJdbcTypes({JdbcType.OTHER})
public class LanguageModelTypeHandler extends AbstractJsonbTypeHandler{
    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JsonUtil.fromJson(rs.getString(columnName), LanguageModel.class);
    }
}

public abstract class AbstractJsonbTypeHandler extends BaseTypeHandler<Object> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        PGobject jsonObject = new PGobject();
        jsonObject.setType("jsonb");
        jsonObject.setValue(JsonUtil.toJsonString(parameter));
        ps.setObject(i, jsonObject);
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return rs.getString(columnIndex);
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return cs.getString(columnIndex);
    }

    @Override
    public abstract Object getNullableResult(ResultSet rs, String columnName) throws SQLException;
}           

3、核心點

  • @TableField(typeHandler = MyGeometryTypeHandler.class)通過攔截的方法攔截轉換字段
  • @TableName(value = “tland”, autoResultMap = true)如果不加autoResultMap =rue,進不去自定義類型轉換器中getNullableResult()這個方法,就會導緻無法将二進制轉回到坐标點。

繼續閱讀