基于MyBatis-Plus实现复杂查询

在使用MyBatis-Plus开发过程中,不可避免的会出现有些略复杂的查询,需要熟练使用MyBatis-Plus来实现这些功能。

使用and、or

需求背景

列表搜索页,根据某个字段名称进行查询,后端存储的数据表中是包含了有效数据和无效数据,即查询的时候要在有效数据中查询,且字段名称范围编码和中文名称,就要用来查询。

直接写SQL就是这么写

select * from test from data_status = 0 and (name='测试'  or code='CS')

然后使用MyBatis-Plus来写的话,要避免以下这种写法

QueryWrapper<TestEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("data_status",1)
                .like("name","测试")
                .or()
                .like("name","CS");

上述写法的SQL语句是

select * from test from data_status = 0 and name='测试'  or code='CS'

这样就是错的了,跟预期不符,需要注意

正确的写法应该是!
正确的写法应该是!
正确的写法应该是!

QueryWrapper<TestEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("data_status",1);
        queryWrapper.and(wrapper ->
                wrapper.like("name","测试")
                .or()
                .like("name","CS"));

如此即可,按照预期查询数据。

分组,聚合统计,排序,取前5

需求背景

页面展示,需要先根据某个字段进行筛选,然后对筛选完后的数据的某个字段进行分组,之后再聚合统计每个组有多少条数据,最后再根据条数倒叙,取前五条数据。

直接写SQL就是这么写

select name,count(id) as num from test where name like '测试%'  group by name order by count(id) desc limit 5

使用MyBatis-Plus写法如下

  QueryWrapper<TestEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .select("name","count(id) as num")
                .likeRight("name","测试")
                .groupBy("name")
                .orderByDesc("count(id)").last("limit 5");

需要注意的是num这个字段是数据表里没有的字段,但是TestEntity这个类中是需要输出的,所以也需要配置一下

 @TableField(exist = false)
 private Integer num;

上述配置就是标记该字段在数据表中没有映射的。

未完待续,后续如果有新的需求开发用到了更多MyBatis-Plus的使用技巧再继续分享…

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 MyBatis Plus 中,可以使用 `join` 子句在两张或多张表之间进行联表查询。 假设你想要在用户表和订单表之间进行联表查询,可以使用如下 SQL 语句: ``` SELECT * FROM users u JOIN orders o ON u.id = o.user_id ``` 要在 MyBatis Plus 中执行此查询,需要创建一个查询方法,并使用 `@Select` 注解将其映射到相应的 SQL 语句。 下面是一个示例: ```java @Mapper public interface OrderMapper { @Select("SELECT * FROM users u JOIN orders o ON u.id = o.user_id") List<Map<String, Object>> selectUsersAndOrders(); } ``` 上述代码将返回一个包含用户和订单信息的列表。你也可以使用自定义的实体类来映射结果,而不是使用 `Map`。 在 MyBatis Plus 中,你还可以使用 `@Results` 和 `@Result` 注解来映射查询结果到实体类的属性,以及使用 `@One` 和 `@Many` 注解进行一对一或一对多的关联映射。 希望这对你有帮助。 ### 回答2: Mybatis-Plus是一个基于Mybatis的增强工具,它提供了很多方便的功能,使得在使用Mybatis进行数据库操作时更加简单和高效。使用Mybatis-Plus实现联表查询可以按照以下步骤进行: 首先,需要根据需要创建对应的实体类,并使用注解@Table来指定对应的数据库表名。在实体类中可以使用注解@JoinColumn来指定关联字段。 例如:假设有两个实体类User和Order,User和Order是通过UserId关联的,可以使用注解@JoinColumn(name="UserId")来指定关联字段。 接下来,在mapper接口中,使用@Mapper注解标注接口,并添加对应的方法用于联表查询。可以使用注解@SelectProvider来自定义SQL语句,也可以使用@Query注解来直接编写SQL语句。 例如:假设要查询用户信息以及用户的订单信息,可以在mapper接口中添加如下方法: @Select("SELECT u.*, o.* FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{id}") List<UserOrderDto> getUserOrderList(@Param("id") Long id); 然后,在Service层中调用mapper接口中的方法来进行联表查询。可以直接调用mapper接口中的方法,也可以使用@AutoWired注解将mapper接口注入到Service中进行调用。 最后,在Controller层中,调用Service层中的方法获取联表查询的结果,并将结果返回给前端。 以上就是使用Mybatis-Plus实现联表查询的基本步骤。通过使用Mybatis-Plus,我们可以更加简单、高效地实现复杂的联表查询操作。 ### 回答3: MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了许多便捷的功能,其中包括实现联表查询。 要使用 MyBatis-Plus 实现联表查询,我们需要按照以下步骤进行操作: 1. 创建实体类: 首先,我们需要创建对应的实体类,分别对应数据库中的每个表。每个类需要使用 `@TableName` 注解来指定对应的数据库表名,并使用 `@TableField` 注解指定实体类属性与数据库字段的映射关系。 2. 创建Mapper接口: 接下来,我们需要创建一个继承自 Mapper 接口的自定义接口。在自定义接口中,我们可以定义多个用于联表查询的方法,并使用 MyBatis-Plus 提供的注解进行配置。 3. 实现联表查询: 在自定义接口中,我们可以使用 MyBatis-Plus 的注解来配置联表查询操作。比如,我们可以使用 `@TableId`、`@TableField`、`@Query`、`@Join` 等注解来实现多表关联查询操作。 其中,`@Join` 注解用于指定多表关联查询的条件,`@Query` 注解用于编写 SQL 查询语句。 4. 调用联表查询方法: 最后,我们可以在业务逻辑层的具体方法中调用实现好的联表查询方法。通过调用方法即可得到联表查询结果。 通过以上步骤,我们可以轻松地使用 MyBatis-Plus 实现联表查询MyBatis-Plus 提供了一系列强大的注解,可以帮助我们简化 SQL 语句的编写,并提高查询效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值