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