(1)longBlod最大保存4G的数据,可以用来存取大文件的字符或者其他类型文件的二进制流等等,现在的需求是存取一个大小几十兆的json数据,现在使用的手段是,将json数据直接保存到数据库,并可以进行查看和修改,因此采用mysql里的longblob类型进行存取
(2)将数据库字段类型设置为longblob,下面是navicat中我的设置
(3)这里推荐大家使用mybatis的generator自动生成实体具体使用方法
https://blog.csdn.net/zhaoyy0513/article/details/103306605
(4)对应的实体属性,自动生成也好,自己写也好都是数组
(5)对应的mapping.xml
(6)获取并传递给前台
@Override
public void getContentById(Integer layoutId, HttpServletResponse response) throws IOException {
byte[] content = siteLayoutDao.getLayoutById(layoutId);
// 创建字节数组输出流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 将GZIP写入到输出流
GZIPOutputStream gout = new GZIPOutputStream(bos);
// 将要传递的content写入到Gzip
gout.write(content);
gout.close();
byte[] dest =bos.toByteArray();
response.setHeader("Content-Encoding", "gzip");
response.setContentType("application/json;charset=UTF-8");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(dest);
outputStream.close();
}
(7)前台解析,因为数据过大,所以采用切割加载的策略
// 请求content
$.ajax({
type: "get",
contentType: "application/json;charset=utf-8",
dataType: 'text',
async: true, //默认配置,设为异步的也就是可以同时执行两个请求
url: "/mac/sites/1/site-layouts/getLayoutContentById?layoutId=25",
success: function (res) {
const len = res.length;
// 定义分段次数
const time = 10;
// 定义每次分段的长度
const everySize = len / time;
console.log("len:" + len);
console.log("everySize:" + everySize);
let i = 1;
let interVal = setInterval(function () {
console.log("i:" + i);
const infos = $("#last #getInfo");
infos.append(res.substring((i - 1) * everySize, everySize * i) + '<br/>');
i++;
// 如果变量i大于我们设定的分段次数,就清除Interval
if (i > time) {
clearInterval(interVal);
}
}, 1000);
},
error: function () {
alert("获取失败");
}
});