springBoot+MyBatis+pagehelper,结果集映射案例。
- 结果集映射可以解决属性名与字段名不一致的问题。实体类中的属性名与数据表中的字段名。案例见这篇博客。
- 可以对复杂的查询结果(一对多查询)进行结果集映射。例如:查询某个教师信息同时查询所教的班级。所教的班级有多个,可以使用一个List集合保存(教师对象中添加一个List变量)。将一个个班级信息保存到教师对象的List变量中就需要使用结果集映射来解决。案例如下。
案例
结果集映射,查询“一对多”关系的数据,有两种实现思路:
- 结果嵌套查询
- 子查询嵌套查询
现在有三个表入库单store_in、入库明细表store_indet、物资表store_mat。入库单保存入库信息,入库明细表保存入库明细(入库单主键、物资主键、数量等),物资表保存物资信息。
需求:(分页)查询入库单,同时返回入库单和其中包含的物资。
准备
Maven依赖
1 |
<!--主要:--> |
实体类
入库单store_in实体类
1 |
package com.qsdbl.xxx.entity; |
入库明细表store_indet实体类
1 |
package com.qsdbl.xxx.entity; |
物资表store_mat实体类
1 |
package com.qsdbl.xxx.entity; |
请求对象
请求对象PageInfo_qo,用于接收前端分页查询相关的数据。本项目中使用到Pagehelper分页插件。
1 |
package com.qsdbl.xxx.entity.qo; |
视图对象
视图对象DataVo,用于封装返回给前端的数据。根据前后端约定好的规则设计视图对象。
1 |
package com.qsdbl.xxx.entity.vo; |
mapper层
1 |
package com.qsdbl.xxx.mapper; |
service层
1 |
package com.qsdbl.xxx.service; |
web层
1 |
package com.qsdbl.xxx.web; |
配置文件
springBoot配置文件application.properties,配置服务端口、数据库、mybatis等相关参数。
1 |
#服务端口 |
根据上边的mybatis.mapperLocations的配置信息,xml文件应当保存在resource文件夹下的mapper文件夹内。具体规则可查看这篇博客
结果嵌套查询
结果嵌套查询:直接查询出入库单和入库单包含的物资。
- 优点:写一个select即可
- 缺点:若不同表存在字段相同情况,需要起别名。使用pagehelper插件会出现bug,会将嵌套查询的数据作为分页数据(即List集合中的数据作为分页依据)。
1 |
SELECT a.*,c.*,b.in_num from store_in a |
xml文件如下:只写一个select语句
1 |
<?xml version="1.0" encoding="UTF-8" ?> |
由于store_in表与store_mat表存在一些重复字段名,所以需要起别名,而且每个字段 - 属性都要进行映射。但依然存在一个bug,PageHelper插件对查询出来的store_mat表数据进行分页,而不是对store_in表的数据进行分页显示。需要使用子查询嵌套查询来解决。
子查询嵌套查询
子查询嵌套查询:先查询入库单数据,再根据入库单数据去查询所包含的物资。
- 优点:一般不需要起别名。可以完美配合pagehelper插件使用。
- 缺点:写多个select,难度增大。
第一步:查询入库单数据
1 |
select b.user_name modify_username,a.* |
第二步:查询所包含的物资。in_id,为入库单store_in表的主键,在第一步中查询出来。
1 |
select b.*,a.in_num |
xml文件如下:拆分成了两个select语句
1 |
<?xml version="1.0" encoding="UTF-8" ?> |
测试
发起请求
1 |
GET http://localhost:8090/xxx/v1/storeins?pageSize=2¤tPage=1 |
返回的数据
1 |
{ |
前端应用
1 |
#全局数组this.data,即入库单数据,其内的数组mats就是入库单所包含的物资。按需使用pagehelper控件提供的字段即可 |
注意:案例中axios设置了defaults.baseURL,且起别名为$http