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);
}
【示例 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 语句的执行时间和当前时间;
该插件有性能损耗,不建议生产环境使用,仅用于测试环境。