MybatisPlus自定义SQL使用条件构造器和分页

1 前言

我们知道MybatisPlus对单表操作很方便,特别是其条件构造器和分页插件,避免我们书写简单重复的SQL,提高我们的效率。其实在自定义SQL中也可以使用MybatisPlus提供的条件构造器和分页插件,下面就来介绍如何自定义SQL中如何使用。

2 环境准备

  • 数据库新建studentteacher两张表

student表结构如下

id name teacher_id
1 小明 1
2 小红 1
3 小白 2

teacher表结构如下

id name
1 老师1
2 老师2
  • 项目的创建此处就省略了。导入如下依赖
xml 复制代码
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
</dependency>

<!-- 测试 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

<!-- MybatisPlus依赖 -->
<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.5.3.1</version>
</dependency>

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
</dependency>

<!-- MySQL驱动 -->
<dependency>
   <groupId>com.mysql</groupId>
   <artifactId>mysql-connector-j</artifactId>
   <scope>runtime</scope>
</dependency>
  • yml配置
yaml 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///test
    username: root
    password: root
mybatis-plus:
  # 开启MybatisPlus的日志打印
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 如果mapper文件所在位置为resources/mapper下,此项可不配置
  mapper-locations: classpath:mapper/*.xml
  • 实体类

Student实体类

java 复制代码
package com.example.entity;

@Data
@TableName("student")
public class Student {
   //自动递增的主键
   @TableId(value = "id", type = IdType.AUTO)
   private Integer id;
   private String name;
   private Integer teacherId;
}

Teacher实体类

java 复制代码
package com.example.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("teacher")
public class Teacher {
   @TableId(value = "id", type = IdType.AUTO)
   private Integer id;
   private String name;
}
  • vo
java 复制代码
package com.example.vo;

/**
 * 用于接收查询出的数据
 */
@Data
public class StudentVo {
   private Integer id;
   private String name;
   private Teacher teacher;
}
  • 注意:在启动类上添加MapperScan注解扫描mapper接口所在包

3 实现

我们以查询出学生信息为例,如下图

3.1 使用条件构造器

  • mapper接口如下

注意:Wrapper形参的格式与下面要相同

java 复制代码
package com.example.mapper;

@Repository
public interface StudentMapper extends BaseMapper<Student> {
   StudentVo mySelectOne(@Param(Constants.WRAPPER) Wrapper<StudentVo> queryWrapper);
}
  • xml配置文件如下

${ew.customSqlSegment}:就是条件构造器中的条件了,不需要写WHERE

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.StudentMapper">
   <resultMap id="studentVoMap" type="com.example.vo.StudentVo">
      <result property="id" column="id" />
      <result property="name" column="name" />
      <association property="teacher" javaType="com.example.entity.Teacher">
         <result property="id" column="tid" />
         <result property="name" column="tname" />
      </association>
   </resultMap>

   <select id="mySelectOne" resultMap="studentVoMap">
      SELECT s.id, s.name, t.id tid, t.name tname
      FROM student s join teacher t on s.teacher_id = t.id
      ${ew.customSqlSegment}
   </select>
</mapper>
  • 测试
java 复制代码
@Test
void contextLoads() {
   QueryWrapper<StudentVo> wrapper = Wrappers.<StudentVo>query()
         .eq("s.id", 1);
   StudentVo studentVo = studentMapper.mySelectOne(wrapper);
   System.out.println(studentVo);
}

执行SQL如下

这样我们就能在自定义SQL中使用条件构造器了。

3.2 使用分页

MybatisPlus使用分页需要配置分页插件,配置如下

java 复制代码
package com.example.config;

@Configuration
public class MybatisPlusConfig {
   @Bean
   public MybatisPlusInterceptor paginationInterceptor() {
      MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
      interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
      return interceptor;
   }
}
  • mapper接口如下
less 复制代码
package com.example.mapper;

@Repository
public interface StudentMapper extends BaseMapper<Student> {
   Page<StudentVo> mySelectPage(Page<StudentVo> iPage, @Param(Constants.WRAPPER) Wrapper<StudentVo> queryWrapper);
}
  • xml文件如下
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.StudentMapper">
   <resultMap id="studentVoMap" type="com.example.vo.StudentVo">
      <result property="id" column="id" />
      <result property="name" column="name" />
      <association property="teacher" javaType="com.example.entity.Teacher">
         <result property="id" column="tid" />
         <result property="name" column="tname" />
      </association>
   </resultMap>

   <select id="mySelectPage" resultMap="studentVoMap">
      SELECT s.id, s.name, t.id tid, t.name tname
      FROM student s join teacher t on s.teacher_id = t.id
      ${ew.customSqlSegment}
   </select>
</mapper>
  • 测试
java 复制代码
@Test
void contextLoads() {
   QueryWrapper<StudentVo> wrapper = Wrappers.<StudentVo>query()
         .eq("s.id", 1);
   Page<StudentVo> page = studentMapper.mySelectPage(Page.of(1, 10), wrapper);
   System.out.println(page.getRecords());
}

执行的SQL如下

我们发现分页也起效果了。

4 总结

虽然我们能够在自定义SQL中使用MybatisPlus提供的条件构造器共和分页插件,但是还是有局限性的。

  1. 不能使用LambdaWrapper
  2. 自定义SQL使用条件构造器,只会将条件原封不动的加在SQL后。例子如下

我们要查询创建时间create_date等于2023年的

java 复制代码
// 我们只能书写为create_date,而不能书写为createDate
QueryWrapper<StudentVo> wrapper = Wrappers.<StudentVo>query()
                                          .eq("s.id", 1)
                                          .eq("create_date", 2023)

5 写在最后

上述观点只是小白在学习过程中对接触的新东西的总结和分享,若存在不足之处,还请大佬指出。

相关推荐
aloha_7897 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
毕业设计制作和分享8 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
paopaokaka_luck11 小时前
基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)
java·spring boot·小程序·毕业设计·mybatis·1024程序员节
cooldream200912 小时前
Spring Boot中集成MyBatis操作数据库详细教程
java·数据库·spring boot·mybatis
不像程序员的程序媛13 小时前
mybatisgenerator生成mapper时报错
maven·mybatis
小布布的不15 小时前
MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
前端·mybatis·springboot
背水17 小时前
Mybatis基于注解的关系查询
mybatis
free_girl_fang18 小时前
高效作业之Mybatis缓存
java·ide·缓存·mybatis
十二同学啊1 天前
Mybatis拦截器中获取@RequestBody表单的值修改查询SQL
数据库·sql·mybatis
毕业设计制作和分享1 天前
ssm好例文共享平台的设计与实现+jsp
java·开发语言·vue.js·spring boot·毕业设计·mybatis