MyBatis-Plus 条件构造器与多表关联查询

MyBatis-Plus 条件构造器与多表查询

1. QueryWrapper 条件构造器

准备数据表:

编写测试用例:

【示例 1】:查询 User 数据表中 name 不为空的用户,并且邮箱不为空的用户,年龄大于等于 25 的数据;

@Test
public void wrapperSelect1(){
    
    
    //查询name不为空的用户,并且邮箱不为空的用户,年龄大于等于25
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
        .isNotNull("name")
        .isNotNull("email")
        .ge("age", 25);
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

【示例 2】:查询年龄为 22 的用户数据;

@Test
public void wrapperSelect2(){
    
    
    //查询年龄是22的用户数据
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("age","22");
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

【示例 3】:查询数据表中年龄在 20-25 之间的用户数据;

@Test
public void wrapperSelect3(){
    
    
    //查询年龄在20-25岁之间的用户
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.between("age",20,30);  //区间
    Integer count = userMapper.selectCount(wrapper);
    System.out.println(count);
}

<img src="C:\Users\17209\AppData\Roaming\Typora\typora-user-images\image-20220223144547320.png" alt="image-20220223144547320" style="zoom:80%;" /

【示例 4】:查询数据中 name 中不包含 “o”,且邮箱 email 中以 “com” 结尾的数据记录;

@Test
public void wrapperSelect4(){
    
    
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
        .notLike("name","o")
        .likeLeft("email","com");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

【示例 5】:inSql 子查询查找数据记录;

@Test
public void wrapperSelect5(){
    
    
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    // id 在子查询中查出来
    wrapper.inSql("id","select id from user where id < 4");
    List<Map<String, Object>> list = userMapper.selectMaps(wrapper);
    list.forEach(System.out::println);
}

【示例 6】:通过年龄 age 进行数据排序;

@Test
public void wrapperSelect6(){
    
    
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //通过age进行排序
    wrapper.orderByAsc("age");
    List<User> users = userMapper.selectList(wrapper);
    users.forEach(System.out::println);
}

关于 MyBatis-Plus 的条件构造器的使用方法可以参考官网:https://baomidou.com/pages/10c804/


2. 多表关联查询

上面介绍的内容都是关于单表数据的增删改查操作,如何自定义 SQL、编写不同查询业务的接口呢?这里就用到了多表关联查询,我们先准备了如下两张数据表。

1、编写映射结果集的 POJO;

package com.trainingl.entity;

import lombok.Data;
// 映射结果集的实体类
@Data
public class OrderVO {
    
    
    private Integer pid;
    private String productName;
    private Integer count;
    private Integer uid;
    private String userName;
}

2、mapper 持久化接口中自定义接口和 SQL 语句;

package com.trainingl.repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.trainingl.entity.OrderVO;
import com.trainingl.entity.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserMapper extends BaseMapper<User> {
    
    
	//自定义接口
    @Select("select p.*, u.name userName from product p,user u where u.id = p.uid and u.id = #{id}")
    List<OrderVO> SelectUerPro(Integer id);  //传入用户id
}

3、测试接口

@Test
public void test1(){
    
    
    //根据用户的id查询该用户购买的商品
    List<OrderVO> orderVOS = userMapper.SelectUerPro( 1);
    for (OrderVO orderVO : orderVOS) {
    
    
        System.out.println(orderVO);
    }
}


3. 性能分析插件(扩展了解)

性能分析组件的作用用于输出每条 SQL 语句及其执行时间,该功能依赖 p6spy 组件,支持 MyBatis-Plus 3.1.0 版本以上。

1、pom.xml 中引入 p6spy 依赖;

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

2、application.yml 配置;

spring:
  datasource:
    # driver-class-name 为 p6spy 提供的驱动类 
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    # url 前缀为 jdbc:p6spy 跟着冒号为对应数据库连接地址
    url: jdbc:p6spy:mysql://localhost/user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    ...

3、resources 文件下添加 spy.properties 配置;

#MP 3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

控制台打印日志时,输出当前执行 SQL 语句的执行时间和当前时间;

该插件有性能损耗,不建议生产环境使用,仅用于测试环境。

猜你喜欢

转载自blog.csdn.net/qq_41775769/article/details/123092194