多表条件查询返回成list集合封装成分页形式返回给前端

多表条件查询返回成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的基础方式。

  • 28
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用字符串的一些方法来实现模糊查询,比如使用contains()方法判断一个字符串是否包含另一个字符串。以下是一个示例代码: ```java List<String> originalList = new ArrayList<>(); // 原始数据集合 List<String> filteredList = new ArrayList<>(); // 模糊查询后的数据集合 // 假设查询关键字为 "abc" for (String data : originalList) { if (data.contains("abc")) { filteredList.add(data); } } // 返回模糊查询的结果 return filteredList; ``` 但是,使用这种方式来实现模糊查询的效率可能不够高,尤其是当数据量较大时。因此,通常还是会使用SQL语句来进行模糊查询。在Java中,可以使用JDBC、MyBatis等库来执行SQL查询,并将查询结果封装Java对象或集合返回前端。以下是一个示例代码: ```java public List<User> fuzzyQueryUsers(String keyword) throws SQLException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; List<User> userList = new ArrayList<>(); try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb?useSSL=false", "root", "password"); String sql = "SELECT * FROM user WHERE name LIKE ?"; stmt = conn.prepareStatement(sql); stmt.setString(1, "%" + keyword + "%"); rs = stmt.executeQuery(); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); userList.add(user); } } finally { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } return userList; } ``` 在这个示例代码中,使用了JDBC库来连接MySQL数据库,并执行了一个带有参数的模糊查询SQL语句。使用PreparedStatement可以避免SQL注入的问题。最后,将查询结果封装User对象,并添加到集合返回前端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值