后端代码:
首先我们需要一个JackTypehandler完成Json的序列化和反序列化,这里我是对Double字段类型完成的序列化
package com.htzn.common.handler;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
/**
1. @ModifyTime 2021/11/25
2. JSON 字段类型处理器
**/
@Slf4j
@MappedJdbcTypes(JdbcType.DOUBLE)
public class JacksonTypeHandler<T extends Object> extends BaseTypeHandler<T> {
private static ObjectMapper objectMapper;
private Class<T> type;
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
public JacksonTypeHandler(Class<T> type) {
if (log.isTraceEnabled()) {
log.trace("JacksonTypeHandler(" + type + ")");
}
if (null == type) {
throw new PersistenceException("Type argument cannot be null");
}
this.type = type;
}
private T parse(String json) {
try {
if (json == null || json.length() == 0) {
return null;
}
return objectMapper.readValue(json, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private String toJsonString(T obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
return parse(rs.getString(columnName));
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return parse(rs.getString(columnIndex));
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return parse(cs.getString(columnIndex));
}
@Override
public void setNonNullParameter(PreparedStatement ps, int columnIndex, T parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(columnIndex, toJsonString(parameter));
}
}
然后在mapperXml文件这样写,这里是对修改的映射
<result property="coordinate" column="coordinate" jdbcType="VARCHAR" typeHandler="com.htzn.common.handler.JacksonTypeHandler" />
<update id="updateCoordinateById" parameterType="UnloadingInfo" >
update unloading_info
set coordinate = #{coordinate,typeHandler=com.htzn.common.handler.JacksonTypeHandler}
where id = #{id}
</update>
实体类我们多一个实体类来映射前端传来的json格式的Key
private Range coordinate;
public class Range {
/**
经度
*/
private Double longitude;
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) {
this.latitude = latitude;
}
/**
纬度
*/
private Double latitude;
}
前端我们就废话少说,直接上代码吧
var url="/system/unloading/update/{id}".replace("{id}",id);
var datas={
coordinate:{"longitude":lon,
"latitude":lat}
}
$.ajax({
url: url,
data: JSON.stringify(datas),
type: "POST",
contentType: "application/json",
dataType: "text",
traditional: true,
success: function(data) {
console.log(data);
console.log(JSON.parse(data));
},
error: function (data) {
console.log(JSON.parse(data));
}
})
});