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”**又或者两者都加上。具体使用则需要去尝试
更多推荐
所有评论(0)