引言
mybatis-plus 是 mybatis 的增强工具,简化了数据库操作,并提高了开发效率。它提供了多种查询方式,包括常规的 sql 查询、lambda query 查询、分页查询、条件查询等。在本篇博客中,我们将详细讲解如何使用 mybatis-plus 的各种查询方式,涵盖以下内容:
- 基础环境配置
- 表结构设计
- 常见查询方法
- 普通查询
- lambda 查询
- 条件构造器
- 聚合查询
- 分页查询
- 复杂查询与多表联查
基础环境配置
首先,你需要确保项目已经引入了 mybatis-plus 相关的依赖。假设你的项目是基于 spring boot 的,下面是如何配置 maven 依赖的示例。
依赖配置(maven)
<dependencies>
<!-- mybatis-plus starter -->
<dependency>
<groupid>com.baomidou</groupid>
<artifactid>mybatis-plus-boot-starter</artifactid>
<version>3.5.0</version>
</dependency>
<!-- mysql connector -->
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>8.0.23</version>
</dependency>
<!-- spring boot starter web -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
</dependencies>
application.yml 配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?usessl=false&servertimezone=utc
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.driver
mybatis-plus:
# 配置 mybatis-plus
mapper-locations: classpath:/mappers/*.xml
typealiasespackage: com.example.demo.entity
表结构设计
假设有以下两个表:
- demo_student:学生信息
- demo_class:班级信息
demo_student 表结构
create table demo_student (
id int auto_increment primary key,
name varchar(50) not null,
age int,
class_id int,
gender enum('m', 'f') default 'm',
foreign key (class_id) references demo_class(id)
);
demo_student 表存储学生信息,其中 class_id 是外键,指向 demo_class 表。
demo_class 表结构
create table demo_class ( id int auto_increment primary key, class_name varchar(50) not null );
常见查询方法
普通查询(selectone, selectlist, selectbyid)
selectone:查询单条记录。selectlist:查询多条记录。selectbyid:通过主键查询一条记录。
import com.baomidou.mybatisplus.core.conditions.query.querywrapper;
import com.baomidou.mybatisplus.extension.service.iservice;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.service;
import java.util.list;
@service
public class demostudentservice {
@autowired
private demostudentmapper demostudentmapper;
// 查询单个学生
public demostudent getstudentbyid(long id) {
return demostudentmapper.selectbyid(id);
}
// 查询所有学生
public list<demostudent> getallstudents() {
return demostudentmapper.selectlist(new querywrapper<>());
}
}
lambda query 查询(lambdaquerywrapper)
mybatis-plus 提供了 lambdaquerywrapper,可以通过 lambda 表达式来避免字段名硬编码。
import com.baomidou.mybatisplus.core.conditions.query.lambdaquerywrapper;
public list<demostudent> getstudentsbyage(int age) {
lambdaquerywrapper<demostudent> querywrapper = new lambdaquerywrapper<>();
// 查询年龄大于指定值的学生
querywrapper.gt(demostudent::getage, age);
return demostudentmapper.selectlist(querywrapper);
}
条件构造器(querywrapper)
querywrapper 允许通过构建条件来查询。它支持 eq、ne、lt、gt、like 等各种条件。
public list<demostudent> getstudentsbyclassid(long classid) {
querywrapper<demostudent> querywrapper = new querywrapper<>();
// 根据班级id查询
querywrapper.eq("class_id", classid);
return demostudentmapper.selectlist(querywrapper);
}
条件链式查询
lambdaquerywrapper 和querywrapper支持链式调用,可以将多个条件组合成一个查询。
public list<demostudent> getfemalestudentsover18() {
lambdaquerywrapper<demostudent> querywrapper = new lambdaquerywrapper<>();
querywrapper.eq(demostudent::getgender, "f")
.gt(demostudent::getage, 18); // 查找性别为女性,且年龄大于18岁的学生
return demostudentmapper.selectlist(querywrapper);
}
聚合查询(selectcount, selectmax, selectmin 等)
mybatis-plus 支持基本的聚合查询,比如统计、求最大值、最小值、平均值等。
// 查询学生总数
public int gettotalstudents() {
return demostudentmapper.selectcount(new querywrapper<>());
}
// 查询年龄最大值
public integer getmaxage() {
return demostudentmapper.selectmax(demostudent::getage);
}
// 查询年龄最小值
public integer getminage() {
return demostudentmapper.selectmin(demostudent::getage);
}
分页查询
分页查询在实际开发中非常常见,mybatis-plus 提供了内置的分页功能,可以非常简单地实现。
import com.baomidou.mybatisplus.core.metadata.ipage;
import com.baomidou.mybatisplus.extension.plugins.pagination.page;
public ipage<demostudent> getstudentspage(int pagenum, int pagesize) {
page<demostudent> page = new page<>(pagenum, pagesize); // 创建分页对象
lambdaquerywrapper<demostudent> querywrapper = new lambdaquerywrapper<>();
querywrapper.gt(demostudent::getage, 18); // 查询年龄大于18的学生
return demostudentmapper.selectpage(page, querywrapper); // 返回分页结果
}
分页插件配置
分页功能需要在 application.yml 中配置分页插件:
mybatis-plus:
global-config:
db-config:
id-type: auto
configuration:
log-impl: org.apache.ibatis.logging.stdout.stdoutimpl
plugins:
- com.baomidou.mybatisplus.extension.plugins.pagination.pageinterceptor
复杂查询与多表联查
在 mybatis-plus中,虽然不直接支持join操作,但我们可以通过自定义 sql 来实现复杂的联表查询。
示例:查询学生和班级信息(联查)
import org.apache.ibatis.annotations.select;
import java.util.list;
public interface demostudentmapper {
@select("select s.id as student_id, s.name as student_name, c.class_name " +
"from demo_student s left join demo_class c on s.class_id = c.id")
list<studentwithclass> selectstudentswithclass();
}
实现自定义查询与复杂查询
对于一些需要自定义 sql 的场景,可以直接使用 @select 或 @update 注解来编写 sql。
@select("select * from demo_student where age > #{age} and gender = #{gender}")
list<demostudent> selectbyageandgender(int age, string gender);
总结
mybatis-plus提供了极为丰富的查询功能,通过简洁的 api 和灵活的查询构造器,可以非常方便地进行数据库查询操作。通过以下几点,可以更好地理解和应用 mybatis-plus 的查询功能:
- 普通查询:通过
selectone, selectlist, selectbyid方法可以快速进行数据查询。 lambda查询:通过lambdaquerywrapper构建条件查询,避免硬编码字段名,提高代码可维护性。- 条件构造器:
querywrapper和lambdaquerywrapper提供了多种条件构建方式,支持链式调用。 - 分页查询:
mybatis-plus提供了内置的分页支持,可以轻松进行分页查询。 - 聚合查询:支持常见的聚合操作,如
selectcount, selectmax, selectmin等。 - 复杂查询:通过自定义 sql 支持联表查询,处理更复杂的查询需求。
以上就是springboot基于mybatis-plus实现lambda query查询的示例代码的详细内容,更多关于mybatis-plus lambda query查询的资料请关注代码网其它相关文章!
发表评论