多表条件查询返回成list集合封装成分页形式返回给前端
在数据库操作中,多表查询是一个常见的需求,尤其是在需要联合多个表的数据以获取更全面的信息时。此外,对于大量数据的查询结果,分页处理显得尤为重要,它有助于提升用户体验和系统性能。接下来,我们将通过一个例子来详细介绍如何实现多表条件查询及其分页处理。
- 多表条件查询
假设我们有两个表:system_merchant_address_library(简称sal)和system_address_type(简称sat)。其中,sal表存储了商家的地址库信息,而sat表则存储了地址类型信息。这两张表通过sal.id和sat.merchant_id字段进行关联,即每个商家的地址库记录都对应一个或多个地址类型。
查询示例:
我们需要查询所有商家的地址库信息及其对应的地址类型(如果有的话)。这里可以使用LEFT JOIN来实现,因为LEFT JOIN能够返回左表(sal)的所有记录,即使右表(sat)中没有匹配的记录。
SELECT sal.*, sat.* | |
FROM system_merchant_address_library sal | |
LEFT JOIN system_address_type sat ON sal.id = sat.merchant_id; |
在这个查询中:
SELECT sal.*, sat.* 表示选择sal和sat表中的所有列。
FROM system_merchant_address_library sal 指定了主表并为其分配了别名sal。
LEFT JOIN system_address_type sat ON sal.id = sat.merchant_id 通过左连接sat表,并指定了连接条件为sal.id = sat.merchant_id。
条件查询:
如果我们还想进一步限制查询结果,比如只查询那些未删除(is_deleted = 0)的地址库记录,可以在查询中添加WHERE子句:
SELECT sal.*, sat.* | |
FROM system_merchant_address_library sal | |
LEFT JOIN system_address_type sat ON sal.id = sat.merchant_id | |
WHERE sal.is_deleted = 0; |
二、分页处理
对于大型数据集,一次性返回所有查询结果可能会导致性能问题和用户体验下降。因此,通常需要对查询结果进行分页处理,即每次只返回一部分数据。
在MySQL中,我们可以使用LIMIT和OFFSET子句来实现分页。LIMIT指定了返回的记录数,而OFFSET指定了从哪条记录开始返回(记录的偏移量)。
分页查询示例:
假设我们每页想显示10条记录,并查询第一页的数据:
SELECT sal.*, sat.* | |
FROM system_merchant_address_library sal | |
LEFT JOIN system_address_type sat ON sal.id = sat.merchant_id | |
WHERE sal.is_deleted = 0 | |
LIMIT 10 OFFSET 0; |
如果我们想查询第二页的数据,只需将OFFSET的值改为10(因为第一页已经返回了前10条记录):
SELECT sal.*, sat.* | |
FROM system_merchant_address_library sal | |
LEFT JOIN system_address_type sat ON sal.id = sat.merchant_id | |
WHERE sal.is_deleted = 0 | |
LIMIT 10 OFFSET 10; |
通过调整LIMIT和OFFSET的值,我们可以轻松地实现数据的分页查询,提高系统的可用性和性能。
当然也可以用mybatispuls自带的分页类了,看个人喜好
不过需要你的一些配置,你需要在实体类中添加一个变量用于连接外表的list集合
实体类:
其次就是去mapper.xml文件中配置sql语句
切记就是多表查询的时候必须带上
Mapper层
ServiceImpl层
Service层
然后就是在controller里面写方法了
以上就是一个完整的由一对一多表查询返回的list封装成page的过程
如果是一对多的一种状态的话,则无法由一个sql语句完成mapper.xml的配置。
需要用多个查询,在service中进行完成。
下面则是`的一种方式,
表system_store_management,
表system_business_hours
要根据store_management_id = system_store_management.id;根据这个条件进行查询
如果你使用上面的sql语句的话是可以在数据库中查找到的,但是在Java中他需要一个对象去填装他,数据库返回不了所需要的对象,所以就需要用搭梯子的方式把它分开来查,到后面用service去连接他们。下面就是我的实现过程
Contorller
Service接口
ServiceIpml实现
注意这里面我用了两个查询语句。就是需要用for去遍历将子查询每条记录都添加到父查询中的list集合,这样就可以在一个接口返回出json。
下面就是两个mapper都是很简单的方式
实体类就是
以上就是list转换成page的基础方式。