springboot+mybatis的json格式化

假设数据库中存在五个属性值,分别是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的方法来转换,可是我想了好久真的想不出能够怎么做,就一直报错,说类型不对,我真的是小白,希望知道的大佬能够教教我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值