技术标签: 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的方法来转换,可是我想了好久真的想不出能够怎么做,就一直报错,说类型不对,我真的是小白,希望知道的大佬能够教教我!
使用.format格式化json格式的入参...
前一片我简单说了json格式数据与对象直接的转换。 但是有时候你会发现,出问题了,数据格式化不了,还报了错误,怎么回事? [color=red]以下是我出现的错误:[/color] 一开始的时候我也疑惑是怎么回事,之前的都可以正常格式化,为什么这样不行,后来在别人的指导下检查了代码,发现因为我使用了自身关联(我这样叫他)。 [color=red]代码如下:[/color] 从上面看出代码都是正确的...
#!/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,这样将输出的字符串直接写入本地文件作为配置文件,阅读起来也比较方便。 另外推荐ToStringBuilder,在apache的common-lang3中,输出对象时比较直观方便。 样例代码: 输出结果...
知识整理(长期更新): JS中对JSON格式化: JSON.stringify({'a':1,'c':2,aa:{'a':1,'c':2}}, null, "\t"); 输出结果 "{ "a": 1, "c": 2, ...
加入jar java代码:...
json 与Python对象互相转换 要写json文件 json文件格式 json中文乱码问题 1、 2、首先,我们想要写入的文件是json文件,使用json.dump方法写入。 response_file 是你要写的内容,jsonFile是你json的文件名。 3、接下来,是写入json到json文件之后,没有我们想象的那样,是很整齐的json格式,而是一行一行密密麻麻的挤在一块。 这里,我们使...
...
为什么需要使用vim格式化json 对于json文本,如果没有经过格式化,可读性还是极差的,这时需要格式化或者说是优化 JSON 内容 格式化为 修改 vimrc 使用 python json.tool 模块可以直接格式化json 这时我们可以再命令模式下调用该函数了 如果想更进一步,直接执行一个命令,甚至在文件保存的时候直接格式化Json 这样在保存json文件的时候会直接格式化,如果格式化失败...
...