mybatis-plus处理mysql中json格式方法

概括

mysql8.0提供json格式存取数据,json格式可以用于存json数组获取key-value类型的json串.
用mysql的insert语句插入时,是以json字符串的格式插入的,注意需要转译符号:

INSERT INTO `test_db`(`image_urls`) VALUES ('{\"a\": \"b\", \"c\": \"b\"}');
INSERT INTO `test_db`(`image_urls`) VALUES ('[{\"a\": \"b\"}, {\"c\": \"d\"}]');

java使用mybatis-plus处理

从mysql的insert语句其实就可以看出来,插入的其实也就是一个字符串。也就是如果你的String类型的属性如果是一个格式正确的json,就可以插入成功了。
当然如果实体类的属性是一个String类型,读写很麻烦,后续也不好维护。这里我使用mybatis-plus提供的方法去把json格式映射到实体类的属性。
这里以Map<String,String>为例,第三种方法稍微简单一些

1.自定义映射器

1.首先写一个映射器,这里我直接用来fastjson的json转换方法,如果大家不足以完成业务,那可以自己解析字符串

@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleHandler extends BaseTypeHandler<Map<String,String>> {
    @Override
    // 用于insert时的映射
    public void setNonNullParameter(PreparedStatement ps, int i, Map parameter, JdbcType jdbcType) throws SQLException {
        String str = JSONObject.toJSONString(parameter);
        ps.setString(i,str);
    }

    @Override
    // 用于select时的映射
    public Map getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String str = rs.getString(columnName);
        Map map = (Map) JSON.parse(str);
        return map;
    }

    @Override
    // 用于select时的映射
    public Map getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Map<String,String> map  = new HashMap<>();
        return map;
    }

    @Override
    // 用于select时的映射
    public Map getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Map<String,String> map  = new HashMap<>();
        return map;
    }
}

2.然后在实体类的对应属性加上注解

@TableField(jdbcType = JdbcType.VARCHAR,typeHandler = ExampleHandler.class)
private Map<String,String> imageUrls;

3.完成上面两步插入时没有问题的,但是执行select的时候还是映射不上,如果想要select的时候可以映射上,需要配置mapper.xml

<resultMap id="BaseResultMap" type="XXX">
        <id property="id" column="id" jdbcType="BIGINT"/>
        <result property="imageUrls" column="image_urls" javaType="java.util.Map" typeHandler="XXXX.ExampleHandler"/>
</resultMap>

4.在查询语句种加入resultMap注解

@Select("select * from test_db where id = #{id}")
@ResultMap("BaseResultMap")
TbClassNews findById(Long id);
2.使用mybatis-plus提供的映射器

1.使用mp的东西就不用自己写映射器了,而且mp还支持JSONArray和JSONObject类型的属性

@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray imageUrls;

2.配置映射器和家resultMap注解

<result property="imageUrls" column="image_urls" javaType="com.alibaba.fastjson.JSONArray" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
@Select("select * from test_db where id = #{id}")
@ResultMap("BaseResultMap")
TbClassNews findById(Long id);
3.完全使用mo注解

···
@TableName(value = “t_xxxx”,autoResultMap = true)
public class XXXX{
}
···

@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray imageUrls;

这种方法是最方便的


2021-12-12更新

最近维护别人的项目,项目使用的mp版本都是不一样的。由于版本,在使用第三种方法的时候可能会报错。但实际上报错的解决方案其实是在解决方案3的基础上查询语句上加**@ResultMap(“BaseResultMap”)或者在mapper.xml文件中在对应的属性上加typeHandler=“com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler”**又或者两者都加上。具体使用则需要去尝试

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值