引言
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查询的资料请关注代码网其它相关文章!
发表评论