代码先锋网 代码片段及技术文章聚合

springboot+mybatis的json格式化

技术标签: spring boot  json  java  mybatis

假设数据库中存在五个属性值,分别是id,name,sex,age,hobbies,要求hobbies是以数组的形式呈现在前端,这个时候可以通过json来实现,一开始想的是直接在impl里面使用JSON的,但是有个问题就是,数据库中不仅仅只有hobbies,还有id,name,sex,age,如果把hobbies转化为String在前端输出,那么本身在该方法中就存在return …Mapper.获取所有成员的办法,这样要怎样把转化后的String同时和获取的4个值一起输出?(我真的是小白,真的想不到用什么办法5555),后面就自定义MySqlJsonHandler,然后在实体类中的hobbies进行对应的定义,同时…Mapper.xml也需要做出调整,代码如下:
实体类代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
//    private List<String> hobbies;
//      private String hobbies;
    private JSONArray hobbies;
    public JSONArray getHobbies(){
        return hobbies;
    }

    public void setHobbies(JSONArray hobbies){
        this.hobbies = hobbies == null ? null : hobbies;
    }

自定义的MySqlJsonHandler如下:

@MappedTypes(JSONObject.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MySqlJsonHandler extends BaseTypeHandler<JSONObject>{
    /**
     * 设置非空参数
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */

    @Override
    public void setNonNullParameter(PreparedStatement ps,int i,JSONObject parameter,JdbcType jdbcType) throws SQLException{
        ps.setString(i,String.valueOf(parameter.toJSONString()));
    }

    /**
     * 根据列明,获取可以为空的结果
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */

    @Override
    public JSONObject getNullableResult(ResultSet rs,String columnName) throws  SQLException{
        String sqlJson = rs.getString(columnName);
        if(null!=sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }



    @Override
    public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if(null!=sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }

    @Override
    public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if(null!=sqlJson){
            return JSONObject.parseObject(sqlJson);
        }
        return null;
    }
}

Mapper.xml的代码如下:

   <resultMap id="getStudent" type="com.tian.pojo.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="sex" property="sex" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="hobbies" property="hobbies" typeHandler="com.tian.handler.MySqlJsonHandler"/>
<!--        <result column="hobbies" property="hobbies" javaType="list"/>-->
    </resultMap>


以增操作为例:
<insert id="addUser" parameterType="com.tian.pojo.User">
   insert into mybatis.user (name,sex,age,hobbies) values (#{name,jdbcType=VARCHAR},#{sex,jdbcType=VARCHAR},#{age,jdbcType=INTEGER},#{hobbies,jdbcType=OTHER,typeHandler=com.tian.handler.MySqlJsonHandler})
</insert>

以查找操作为例:
<select id="queryAll" parameterType="com.tian.pojo.User" resultMap="getStudent" >
    select * from mybatis.user
</select>

以为上面的代码可以解决自己想要的解决的问题,但是最后却是报以下的错误

com.alibaba.fastjson.JSONException: syntax error, pos 1, line 1, column 2

百度了好久真的没找到解决的办法。
为了解决这个问题,花了很多时间,最后觉得可以从数据库hobbies的类型出发,让它在数据库的类型是json,在实体类中代码如下:

  private JSONArray hobbies;
      public JSONArray getHobbies(){
        return hobbies;
    }

    public void setHobbies(JSONArray hobbies){
        this.hobbies = hobbies == null ? null : hobbies;
    }

自定义一个ArrayJsonHandler

@MappedTypes(JSONArray.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ArrayJsonHandler extends BaseTypeHandler<JSONArray> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, JSONArray parameter, JdbcType jdbcType) throws SQLException {
         ps.setString(i,String.valueOf(parameter.toJSONString()));
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if(null != sqlJson){
            return JSONArray.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if(null != sqlJson){
            return JSONArray.parseArray(sqlJson);
        }
        return null;
    }

    @Override
    public JSONArray getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if(null != sqlJson){
            return JSONArray.parseArray(sqlJson);
        }
        return null;
    }
}

在xml里面定义如下代码

 <resultMap id="getStudent" type="com.tian.pojo.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="sex" property="sex" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="hobbies" property="hobbies" typeHandler="com.tian.handler.ArrayJsonHandler"/>
    </resultMap>

剩下的直接照常就行,最后就可以实现hobbies的数组化
但是好像可以直接在数据库里面将hobbies的类型定义为varchar,然后在实体类中定义hobbies的类型为List,在serviceimpl里面直接用json的方法来转换,可是我想了好久真的想不出能够怎么做,就一直报错,说类型不对,我真的是小白,希望知道的大佬能够教教我!

版权声明:本文为weixin_46222037原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46222037/article/details/123122873

智能推荐

使用.format格式化json格式的入参

使用.format格式化json格式的入参...

json格式化错误

前一片我简单说了json格式数据与对象直接的转换。 但是有时候你会发现,出问题了,数据格式化不了,还报了错误,怎么回事? [color=red]以下是我出现的错误:[/color] 一开始的时候我也疑惑是怎么回事,之前的都可以正常格式化,为什么这样不行,后来在别人的指导下检查了代码,发现因为我使用了自身关联(我这样叫他)。 [color=red]代码如下:[/color] 从上面看出代码都是正确的...

python 格式化json

#!/usr/bin/env python # -*- coding: utf-8 -*- import os import sys import json     reload(sys) sys.setdefaultencoding("utf-8")   with open('output.json') as f:   data = j...

Json格式化输出

主要目的就是格式化输出JSON,这样将输出的字符串直接写入本地文件作为配置文件,阅读起来也比较方便。 另外推荐ToStringBuilder,在apache的common-lang3中,输出对象时比较直观方便。 样例代码: 输出结果...

JSON格式化展示

知识整理(长期更新):  JS中对JSON格式化: JSON.stringify({'a':1,'c':2,aa:{'a':1,'c':2}}, null, "\t"); 输出结果 "{     "a": 1,     "c": 2,   ...

猜你喜欢

56,json格式化

加入jar java代码:...

【Python】json格式化

json 与Python对象互相转换 要写json文件 json文件格式 json中文乱码问题 1、 2、首先,我们想要写入的文件是json文件,使用json.dump方法写入。 response_file 是你要写的内容,jsonFile是你json的文件名。 3、接下来,是写入json到json文件之后,没有我们想象的那样,是很整齐的json格式,而是一行一行密密麻麻的挤在一块。 这里,我们使...

vim - 格式化JSON

为什么需要使用vim格式化json 对于json文本,如果没有经过格式化,可读性还是极差的,这时需要格式化或者说是优化 JSON 内容 格式化为 修改 vimrc 使用 python json.tool 模块可以直接格式化json 这时我们可以再命令模式下调用该函数了 如果想更进一步,直接执行一个命令,甚至在文件保存的时候直接格式化Json 这样在保存json文件的时候会直接格式化,如果格式化失败...