【MyBatis Plus 3.5.1】4、条件查询器 Wrapper【Spring Boot 环境】

本文详细介绍了MyBatis中的QueryWrapper和UpdateWrapper用法,包括查询特定条件的用户、获取单个用户、查询记录总数、模糊查询、子查询以及排序操作。示例代码展示了如何使用这些方法进行各种条件的组合查询,帮助理解MyBatis动态SQL的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类结构图

在这里插入图片描述

由类结构图可见,Wrapper 内方法有限,大部分方法都封装在 AbstractWrapper 中,使用时可以用操作类对象来调用方法;如:QueryWrapperUpdateWrapper

1、selectList

查询name不为空,email不为空,age大于18的用户

@Test
public void test1(){
   
    // 查询name不为空,email不为空,age大于18的用户
    QueryWrapper<User> wrapper = new QueryWrapper<User>();
    wrapper.isNotNull("name")
        .isNotNull("email")
        .ge("age", 18);

    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

在这里插入图片描述

2、select

### Spring Boot 实现分表查询的最佳实践 在处理大规模数据时,分表是一种常见的性能优化手段。以下是基于 MyBatis-Plus 的 `DynamicTableNameInnerInterceptor` 和其他方法实现分表查询的具体最佳实践。 #### 使用 MyBatis-Plus 动态表名拦截器 MyBatis-Plus 提供了内置的 `DynamicTableNameInnerInterceptor` 拦截器,用于支持动态切换表名功能。这使得开发者可以根据特定逻辑(如时间戳、用户 ID 范围等)动态决定访问哪个物理表[^2]。 ##### 添加依赖项 为了使用 MyBatis-Plus 及其动态表名功能,需引入以下 Maven 或 Gradle 依赖: ```xml <!-- Maven --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> ``` ```gradle // Gradle implementation &#39;com.baomidou:mybatis-plus-boot-starter:3.5.1&#39; ``` ##### 配置 DynamicTableNameInnerInterceptor 配置拦截器以启用动态表名功能。可以通过自定义逻辑设置具体的表名映射规则。 ```java import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; import org.springframework.context.annotation.Bean; public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 创建并注册 DynamicTableNameInnerInterceptor DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName, tableAlias) -> { String dateSuffix = "2023"; // 假设按年份分表 return tableName + "_" + dateSuffix; // 返回带后缀的实际表名 }); interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor); return interceptor; } } ``` 上述代码片段展示了如何通过 `tableNameHandler` 定义动态表名生成逻辑。 #### 查询示例 假设有一个订单表按照日期进行了分表存储,则可以利用如下方式执行跨多个子表的数据检索操作。 ```java @Service public class OrderService { @Autowired private OrderMapper orderMapper; public List<OrderEntity> queryOrdersByDateRange(String startDate, String endDate) { StringBuilder sqlBuilder = new StringBuilder(); for (int i = Integer.parseInt(startDate); i <= Integer.parseInt(endDate); i++) { String subTable = "order_" + i; sqlBuilder.append("SELECT * FROM ").append(subTable).append(" WHERE status=&#39;active&#39; UNION ALL "); } // 移除最后一个多余的 UNION ALL if (sqlBuilder.length() > 0) { sqlBuilder.delete(sqlBuilder.length() - "UNION ALL ".length(), sqlBuilder.length()); } return orderMapper.selectList(new QueryWrapper<>()).stream() .filter(order -> !StringUtils.isEmpty(order.getStatus())) .collect(Collectors.toList()); } } ``` 此代码片段演示了如何构建 SQL 并针对不同时间段调用对应的分表进行联合查询。 --- ### 结合 ShardingSphere 进行分库分表 如果需要更复杂的分片策略,ShardingSphere 是一种强大的解决方案。它可以无缝集成到 Spring Boot 应用程序中,并自动管理分库分表逻辑[^4]。 #### 主要特性 - **分布式事务支持** - **读写分离** - **SQL 解析与改写** #### 示例配置 下面展示的是一个简单的 ShardingSphere 数据源配置实例。 ```yaml spring: shardingsphere: datasource: names: ds_0,ds_1 ds_0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_0?serverTimezone=UTC&useSSL=false username: root password: root ds_1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_1?serverTimezone=UTC&useSSL=false username: root password: root rules: sharding: tables: t_order: actual-data-nodes: ds_${0..1}.t_order_${0..1} # 表达式指定真实节点分布 database-strategy: inline: sharding-column: user_id algorithm-expression: ds_${user_id % 2} table-strategy: inline: sharding-column: order_id algorithm-expression: t_order_${order_id % 2} ``` 以上 YAML 文件描述了一种典型的水平拆分方案,其中数据库和表均依据字段值取模运算分配至不同的物理位置。 --- ### 性能考量 无论采用哪种技术栈,在设计分表架构时都应考虑以下几个方面: - **热点分区问题**:某些分区可能因频繁访问而成为瓶颈。 - **索引维护成本**:随着分表数量增加,单个表上的索引效率可能会下降。 - **联接复杂度**:多张分表之间的关联查询可能导致性能显著降低[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值