mybatis-plus自定义字段类型,对象与JSON转换不生效,查询为空,插入异常的问题及解决办法

1.首先,自定义类型转换器(根据你的功能来)继承BaseTypeHandler,下面是对象与json格式转换例子:

@MappedJdbcTypes(JdbcType.VARCHAR)
@Slf4j
@MappedTypes(FrontMetric.class)
public class MetricJsonLocationHandlerType<T> extends BaseTypeHandler<FrontMetric> {

    private static ObjectMapper objectMapper = new ObjectMapper();
    private Class<T> type;

    public MetricJsonLocationHandlerType(Class<T> type) {
        if (type == null) {
            throw new NullPointerException("Type argument cannot be null");
        }
        this.type = type;
        System.out.println("abc");
    }

/*    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, toJsonString(parameter));
    }*/

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, FrontMetric repoAndMetricVo, JdbcType jdbcType) throws SQLException {
        ps.setString(i, toJsonString(repoAndMetricVo));
    }

    @Override
    public FrontMetric getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return parse(rs.getString(columnName));
    }


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

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



    private String toJsonString(Object parameter) {
        try {
            return objectMapper.writeValueAsString(parameter);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    private FrontMetric parse(String json) {
        try {
            return (FrontMetric) objectMapper.readValue(json, type);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

2.在实体类对应属性上使用@TableField 并指定typeHandler

 

@TableField(value = "metrics",typeHandler = MetricJsonLocationHandlerType.class)
    private FrontMetric metric;

注:需在实体类上指定autoResultMap:

@TableName(value = "tm_front_metric_collect",autoResultMap = true)

3.在对应的xml文件进行相关配置,下面以查询和插入为例:

查询:

<select id="getMetrics" resultMap="repoMetricMap">
        select metrics
        from tm_front_metric_collect
        where json_extract(repo_info, '$.id') = #{repo_id};
</select>

<resultMap id="repoMetricMap" type="repoAndMetricVo">
        <result column="metrics" jdbcType="VARCHAR" property="metric" typeHandler="MetricJsonLocationHandlerType" />
</resultMap>

插入:

<insert id="saveMetrics" >
        insert into tm_front_metric_collect (metrics, repo_info)
         values (#{RepoAndMetric.metric,typeHandler=MetricJsonLocationHandlerType},
                 #{RepoAndMetric.repoInfo,typeHandler=RepoJsonLocationHandlerType});
</insert>

总结:

先自定义字段类型转换器,然后再需要转换的字段上加上TableField注解,并指定typehandler,并在实体类上加上 autoResultMap = true,最后再 xml文件中就行相关配置即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MyBatis-Plus 是一个用于提高 MyBatis 开发效率的框架。它提供了很多便捷的功能,其中之一就是可以自定义字段。 通常来说,在使用 MyBatis 操作数据库时,我们需要在 XML 文件中配置 SQL 语句来实现数据库的 CRUD 操作。这些 SQL 语句中会包含很多字段名,如果有很多字段,那么 XML 文件会很长,不太方便维护。 MyBatis-Plus 提供了一种方法,可以让我们通过定义自定义字段来简化 SQL 语句中的字段名。这样,我们就可以在 XML 文件中使用自定义字段,而不是直接使用数据库表中的字段名,这样就可以简化 XML 文件,使其更加简洁易读。 举个例子,假设我们有一张数据库表 `users`,其中有三个字段:`id`、`name` 和 `email`。在使用 MyBatis-Plus 操作这张表时,我们可以在 XML 文件中定义自定义字段,如下所示: ```xml <sql id="user_fields"> <choose> <when test="selectFields.contains('id')">id</when> <when test="selectFields.contains('name')">name</when> <when test="selectFields.contains('email')">email</when> </choose> </sql> ``` 然后,我们就可以在 SQL 语句中使用这个自定义字段,如下所示: ### 回答2: MyBatis-Plus是一个在MyBatis基础上增强的持久层框架,它提供了许多便捷的操作数据库的方法和功能。在使用MyBatis-Plus时,有时我们需要对数据库表的字段进行一些自定义操作。 首先,我们可以通过注解来实现自定义字段MyBatis-Plus提供了一系列注解,我们可以在实体类的属性上使用这些注解来定义字段的名称、类型、长度、约束等。例如,我们可以使用@TableField注解来配置数据库字段的名称和是否进行插入、更新操作;使用@TableId注解来配置主键字段;使用@TableLogic注解来配置逻辑删除字段等。 另外,我们还可以通过自定义SQL片段来实现自定义字段的操作。MyBatis-Plus提供了XML配置文件和Mapper接口两种方式来编写SQL语句,我们可以在这些配置文件中使用自定义SQL片段来处理字段操作。例如,我们可以使用<if>标签来判断某个条件是否满足,从而决定是否拼接某个字段;使用<foreach>标签来进行循环操作,生成多个字段的SQL语句等。 除了以上的方式,我们还可以通过自定义SQL语句来实现自定义字段的功能。在Mapper接口中,我们可以使用@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider注解来指定自定义SQL语句的提供者,然后在相应的Provider类中编写自定义SQL语句,实现对字段自定义操作。 总之,MyBatis-Plus提供了多种方式来实现自定义字段的功能,我们可以根据具体的需求选择适合的方式进行操作。通过灵活运用这些方式,我们可以更好地使用MyBatis-Plus进行数据库操作,提高开发效率和代码质量。 ### 回答3: MyBatis-Plus 是一个基于 MyBatis 的增强工具包,提供了许多简化开发的功能和增强特性。其中一个功能就是自定义字段,我们可以通过自定义字段来扩展实体类的属性,在数据库查询结果中获取自定义字段值。 在 MyBatis-Plus 中,我们可以通过使用 @TableField 注解来定义自定义字段。首先,在实体类中添加一个与数据库中不存在的属性,并使用 @TableField 注解进行标注。例如: ``` public class User { // ... @TableField(exist = false) private String customField; // getters and setters } ``` 在这个例子中,我们添加了一个名为 customField 的自定义字段。`exist = false` 表示该字段在数据库中不存在。 在查询数据库时,MyBatis-Plus 会自动将查询结果映射到实体类中,包括自定义字段。我们可以通过使用自定义字段进行操作和获取值。例如: ``` User user = userMapper.selectById(1); String customFieldValue = user.getCustomField(); ``` 这样,我们就可以使用 MyBatis-Plus自定义字段功能,方便地扩展实体类的属性,并在数据库查询结果中获取自定义字段值。 总结起来,MyBatis-Plus自定义字段功能通过 @TableField 注解来实现,可以方便地扩展实体类属性,并从数据库查询结果中获取自定义字段的值。使用自定义字段可以灵活地满足一些特殊需求,让开发更加便捷。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值