webService+mysql+mybatis+layui 分表动态查询、导出

目录

1.介绍

2.获取WebService接口数据

3.mysql 数据库使用分表MYISAM引擎

4.layui 数据表格,分离的表头、表数据、分页导航插件

5. 点击按钮,多表联合条件查询

6.HTML 表格标签

7.Excel 大数据量,多表联合条件导出

1、【maven 依赖】

2、【导出工具类】

2、继承【导出工具类】的 【自定义导出类】

3、【导出方法】

4、导出页面的 js ajax 请求

4、导出按钮


1.介绍

1、根据WebService接口,获取Json 数据,按周分表,存储数据。

2、存储海量数据,mysql 引擎使用表锁定,而不是行锁定,不支持事务,但查询速度极快,可组合不同的周表,进行合并。按条件查询总表,百万数据可在1秒内查询出结果。

3、展视使用Layui 动态数据表格,可通过复选框的勾选,动态的添加或减少表格列数,是动态的表头、展视动态的数据总量、动态的分页导航插件。

4、导出功能,前端通过ajax 请求,服务器进行批量缓存,生成excel 文件。成功后,前端获得 nginx 的下载地址,直接进行保存下载。

2.获取WebService接口数据

1)浏览器验证接口方法,访问:http://xxxx.asmx

 2) idea 根据地址,生成webservice 接口代码

 3)使用生成的工具类,可以删除 .calss 文件

首先创建工厂,再通过工厂创建soap,最后使用soap 中的接口方法,获取json 数据

Namefactory = new Name();
NameSoap soap = factory.getNameSoap();
String json = soap.getName('参数');

 4) 取出 json数据的部分数据,如 result 结果,然后转换为User对象,存入 list<User> 集合,再调插入数据库方法

		<!-- POM 文件依赖 Json Lib -->
		<dependency>
		    <groupId>net.sf.json-lib</groupId>
		    <artifactId>json-lib</artifactId>
		    <version>2.4</version>
		    <!-- 指定jdk版本 -->
		    <classifier>jdk8</classifier>
		</dependency>
List<User> list = new ArrayList<User>();

JSONObject jsonObject = JSONObject.fromObject(json);
JSONArray jsonArray = (JSONArray) jsonObject.get("result");
Iterator it = jsonArray.iterator();
while (it.hasNext()) {
    JSONObject result = (JSONObject) it.next();
    User user= (User)JSONObject.toBean(result, User.class);
    list.add(User);
}

由于接口数据量巨,大约100M。3分钟获取接口数据,但 json-lib 解析 json 速度很慢,二十分钟未响应。换成了jackjson ,速度瞬间快起来了。

jackjson 的API文档:

https://www.cnblogs.com/better-farther-world2099/articles/14120287.html

ObjectMapper 序列化对象:  用于转换 javaBean 对象,转换JsonNode、ObjectNode 对象
JsonNode:只读节点树:用于读取 json 节点的数据
ObjectNode:只写节点数:用于插入,写入json 数据

String jsonStr = 接口获取的json String数据;

//1.创建jackjson 对象
ObjectMapper mapper = new ObjectMapper();
//2.解析String 对象为读树节点
JsonNode node = mapper.readTree(jsonStr);
//3.读取json 的result 节点,该节点的数据是循环的json集合
JsonNode resultNode = node.get("result");
//解放 node 对象,释放内存
node =null;

Iterator it = resultNode.iterator();
while (it.hasNext()) {
JsonNode result = (JsonNode) it.next();

//可循环操作,单个节点数据,如获得节点中的name 值
 String name = result.get("name").asText();


//将单个节点数据 转换为 javabean对象
User user= mapper.convertValue(result, User.class);
}

3.mysql 数据库使用分表MYISAM引擎

1)创建分表,例如:t_user_01、t_user_02

NOT NULL 非空、COMMENT 备注

PRIMARY KEY 主键、INDEX索引

ENGINE=MYISAM 表锁定引擎、CHARSET=utf8 字符格式

@Insert(
  "CREATE TABLE `t_user_${tableName}` (" +
  "`id` int(11)  NOT NULL COMMENT 'id',"+
  "`create_date` datetime DEFAULT NULL COMMENT '创建时间'," +
  "`name` varchar(255)  NOT NULL COMMENT '名称',"+
  "`type` int(5) NOT NULL COMMENT '类别'," +
  " PRIMARY KEY (`id`),INDEX(`name`)"+
  ") ENGINE=MYISAM CHARSET=utf8;")
void createTable(@Param("tableName")String tableName);

2)往分表里,批量插入数据

将User 数据,存在list 集合,循环插入mysql,执行方法每8000条循环一次,效率高

 @Insert({"<script>"+
    "insert into `t_user_${tabelName}`" +
    "(id , create_date , name , type)"  +
    "values " +
    "<foreach collection='list' item='item' index='index' separator=','>"+
    "(UUID() , NOW() , #{item.name} , #{item.type}" +
    "</foreach>" +
    "</script>"})
    public void addLabelView(@Param(value="list") List<User> list,String tabelName);

3)sql 创建总表,例如:t_user_all

ENGINE=MRG_MYISAM 总表引擎

UNION =(t_user_01,t_user_02)   关联分表的数据给总表,不额外创建数据,效率高

INSERT_METHOD=NO 不许插入,插入方式有:NO 、LAST、FIRST

@Insert("<script>"+
 "CREATE TABLE `t_user_all_${tableName}` (" +
 "`id` int(11)  NOT NULL COMMENT 'id',"+
 "`create_date` datetime DEFAULT NULL COMMENT '创建时间'," +
 "`name` varchar(50)  NOT NULL COMMENT '名称',"+
 "`type` int(5) NOT NULL COMMENT '类别'," +
 " PRIMARY KEY (`id`),INDEX(`name`)"+
 ") ENGINE=MRG_MYISAM INSERT_METHOD=NO UNION =" +
 "<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>" +
     "t_user_${item}"+
 "</foreach>" +
 "CHARSET=utf8;"+
 "</script>")
void createTableAll(@Param(value=&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值