mybatis-plus lambdaquery
时间: 2023-04-25 07:00:21 浏览: 290
Mybatis-Plus LambdaQuery是Mybatis-Plus提供的一种基于Lambda表达式的查询方式,它可以让我们在编写查询语句时更加简洁、易读,同时还能有效地避免SQL注入等安全问题。使用LambdaQuery,我们可以通过链式调用的方式构建查询条件,而不需要手动拼接SQL语句。这种查询方式不仅提高了开发效率,还能让我们更加专注于业务逻辑的实现。
相关问题
mybatis-plus lambdaquery自连接
MyBatis Plus 提供了 LambdaQueryWrapper 和 LambdaUpdateWrapper 接口用于简化查询和更新操作。其中 LambdaQueryWrapper 主要用于构建动态 SQL 查询条件,在实际应用中常常涉及到一对多、多对多等关联表的查询。
`lambdaquery 自连接`是在这种场景下的一种常见运用,当需要基于两个相同的实体类数据之间的关联关系进行复杂查询时,就需要通过自连接的方式。例如,当你有两个实体A和B,它们之间存在一对多的关系,并希望基于这个关系进行查询的时候。
### 示例步骤:
假设我们有两张表 `User` 和 `Order`,用户可以有多个订单。我们可以首先创建两个 Lambda 表示类,比如:
```java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository extends ServiceImpl<UserMapper, User> {
}
@Repository
public class OrderRepository extends ServiceImpl<OrderMapper, Order> {
}
```
这里 `UserMapper` 和 `OrderMapper` 分别对应各自的 MyBatis Plus 的映射器接口。
然后当我们使用 `LambdaQueryWrapper` 进行自连接查询时:
```java
// 假设我们现在想获取所有用户及其对应的订单信息
UserRepository userRepository = new UserRepository();
List<User> users = userRepository.list(new LambdaQueryWrapper<User>()
.in(User::getOrdersCount, 0) // 指定某个条件,如未有任何订单
.leftJoin(Order.class, "orders", (User u, Order o) -> u.getId().equals(o.getUserId())) // 自连接
.select(User::getId, User::getName, CollectionUtil.toList(Order::getId, Order::getOrderId)) // 选择所需字段
.orderByDesc(User::getId)
);
```
上面的代码说明了如何使用 LambdaQueryWrapper 对 `User` 进行自连接查询,同时选择了 `User` 实体的所有字段以及其 `Order` 实体的 `orderId` 字段,并按 `id` 进行降序排序。
### 关联查询的关键点:
- **自连接**:通过 `.leftJoin()` 方法实现,这里的 `Order.class` 就是一个自连接的目标表。
- **连接条件**:使用 `(User u, Order o) -> u.getId().equals(o.getUserId())` 来指定连接条件,这里是用户ID等于订单的用户ID。
- **选择列**:使用 `select` 方法指定要返回的数据,包括用户的基本信息和订单的信息。
通过这种方式,MyBatis Plus 的 LambdaQueryWrapper 就能够非常高效地支持复杂的关联查询需求,特别是那些需要跨实体表进行多条件组合查询的情况。这使得代码既简洁又易于维护。
---
相关问题:
1. 如何使用 MyBatis Plus 的 LambdaQueryWrapper 进行分页查询?
2. MyBatis Plus 中的 LambdaUpdateWrapper 怎么使用?
3. 在什么情况下应该考虑避免使用自连接查询?
mybatis-plus lambdaquery多表联查
### 使用 MyBatis-Plus 的 LambdaQueryWrapper 实现多表联查
尽管 MyBatis-Plus (MP) 默认更倾向于单表操作,但通过一些技巧可以实现多表联查功能。以下是基于 MP 中 `LambdaQueryWrapper` 和其他工具来完成多表联查的具体方法。
#### 方法一:利用子查询(inSql)
可以通过 `LambdaQueryWrapper` 配合 `inSql` 方法构建子查询语句[^1]。这种方式适用于某些场景下的简单多表联查需求。
```java
// 假设我们有两个实体类 A 和 B,A 表有一个字段 bId 对应于 B 表的 id 字段。
LambdaQueryWrapper<A> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.inSql(A::getBid, "SELECT id FROM b WHERE status = 1");
List<A> list = aMapper.selectList(queryWrapper);
```
上述代码实现了从表 B 中筛选符合条件的数据,并将其作为条件用于查询表 A 的记录。
---
#### 方法二:使用 JOIN 查询
虽然 `LambdaQueryWrapper` 主要针对单表操作设计,但在实际开发中可通过自定义 SQL 或者借助 MP 提供的 `@Select` 注解实现复杂的 JOIN 联查逻辑。
##### 自定义 Mapper 接口中的 SQL
可以在 Mapper 接口中编写原生 SQL 来支持多表联查:
```java
public interface AMapper extends BaseMapper<A> {
@Select("SELECT * FROM a LEFT JOIN b ON a.bid = b.id WHERE b.status = #{status}")
List<Map<String, Object>> selectJoin(@Param("status") Integer status);
}
```
调用此接口即可获取到两张表联结后的数据集合。
---
#### 方法三:嵌套结果映射(关联查询)
当需要返回复杂的结果集时,推荐采用 XML 文件配置的方式或者直接书写完整的 SQL 语句。例如,在 XML 映射文件中设置 `<resultMap>` 完成对象间的相互引用关系。
XML 示例:
```xml
<resultMap id="aWithBResultMap" type="com.example.A">
<id column="aid" property="id"/>
<result column="aname" property="name"/>
<!-- 关联属性 -->
<association property="b" javaType="com.example.B">
<id column="bid" property="id"/>
<result column="bname" property="name"/>
</association>
</resultMap>
<select id="selectJoin" resultMap="aWithBResultMap">
SELECT a.*, b.*
FROM a
LEFT JOIN b ON a.bid = b.id
WHERE b.status = #{status}
</select>
```
Java 调用:
```java
AMapper mapper;
List<A> resultList = mapper.selectJoin(1); // 参数传递给 SQL
```
这种方法能够清晰表达两者的关联结构并自动封装为 Java Bean 对象。
---
#### 方法四:完全手写 SQL 并结合 Wrapper 功能
如果以上方案无法满足业务需求,则可以选择彻底放弃内置 QueryWrapper 工具而转向纯手动模式——即在 Service 层拼接最终执行所需的完整 SQL 文本字符串再交由 DAO 执行解析。
示例代码如下所示:
```java
String customSqlPart = "(SELECT id FROM b WHERE status = 'ACTIVE')";
LambdaQueryWrapper<A> wrapper = Wrappers.<A>lambdaQuery().inSql(A::getBid, customSqlPart);
List<A> result = aMapper.selectList(wrapper);
```
这里需要注意的是,即使采用了手工构造部分片段的形式仍然保留了对标准 API 的依赖以便后续维护升级更加便捷高效。
---
### 总结
综上所述,MyBatis-Plus 支持多种途径达成跨多个数据库表格之间的交互访问目的;其中既包含了灵活运用框架自带组件如 `LambdaQueryWrapper` 结合特定函数参数传入外部动态生成子句内容从而间接达到目标效果的做法,也涵盖了更为直观明了的手工指定全部细节描述整个过程直至最后一步提交至持久层处理完毕为止的整体流程展示。
---
阅读全文
相关推荐















