MyBatis-Plus中最简单的查询操作教程(Lambda)
作者:冯文议 发布时间:2022-03-16 13:43:28
引言
MyBatis-Plus | 最优雅最简洁地完成数据库操作
是对MyBatis-Plus的功能进行简单介绍,虽然是介绍,也让我们领略到他的优雅与强大。你是不是已经被吸引了?别着急,上一节,我们算是参观了MyBatis的风景,这一节,我将带你领略他独特的魅力。
Lambda
官方表示,3.x支持Lambda表达式,那应该怎么使用呢?我们来看个例子:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(Student::getName, "冯文议");
List<Student> studentList = list(queryWrapper);
for (Student student : studentList)
Console.info(student);
看一下测试结果(为了看好,我们转成json):
{
"id":1035789714459471874,
"name":"冯文议",
"age":26,
"info":"无畏造英雄",
"isDelete":false,
"createTime":"Sep 1, 2018 3:21:26 PM",
"updateTime":"Sep 1, 2018 3:21:26 PM",
"gender":"MALE",
"idcardId":1035789714388168706,
"cityId":1035762001753501698
}
如果你使用了我的配置,你也能看到相应的SQL
==> Preparing: SELECT id,name,age,info,is_delete,create_time,update_time,gender,idcard_id,city_id FROM t_student WHERE name = ?
==> Parameters: 冯文议(String)
<== Columns: id, name, age, info, is_delete, create_time, update_time, gender, idcard_id, city_id
<== Row: 1035789714459471874, 冯文议, 26, <<BLOB>>, 0, 2018-09-01 15:21:26.0, 2018-09-01 15:21:26.0, 1, 1035789714388168706, 1035762001753501698
<== Total: 1
分页查询
感觉哈,分页查询是他们框架的起因,那我们先说分页查询。直接看代码:
第一步:在 Application 中配置
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
第二步:写分页代码(为了你能够看得清楚,我截图给你):
看结果(json):
{
"records":[
{
"id":1035788325322752001,
"name":"1",
"age":1,
"info":"1",
"isDelete":false,
"createTime":"Sep 1, 2018 3:15:55 PM",
"updateTime":"Sep 1, 2018 3:15:55 PM",
"gender":"MALE",
"idcardId":1035788325276614657,
"cityId":1035788325201117185
},
{
"id":1035789714459471874,
"name":"冯文议",
"age":26,
"info":"无畏造英雄",
"isDelete":false,
"createTime":"Sep 1, 2018 3:21:26 PM",
"updateTime":"Sep 1, 2018 3:21:26 PM",
"gender":"MALE",
"idcardId":1035789714388168706,
"cityId":1035762001753501698
}
],
"total":2,
"size":2,
"current":1,
"optimizeCountSql":true
}
不要问我前端应该怎么写,表示我也不会写。
条件查询
终于要进入这里了,是不是很激动啊。别急,客官,抽根烟先,我们慢慢来。
【1】多eq
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Student::getName, "冯文议")
.eq(Student::getAge, 26);
List<Student> studentList = list(queryWrapper);
for (Student student : studentList)
Console.info(new Gson().toJson(student));
对于这部分的测试,我想结果是毫无因为,那么你应该关注什么呢?没错,SQL,所以,我们直接看SQL。当然,结果也是可以看到的。
==> Preparing: SELECT id,name,age,info,is_delete,create_time,update_time,gender,idcard_id,city_id FROM t_student WHERE name = ? AND age = ?
==> Parameters: 冯文议(String), 26(Integer)
<== Columns: id, name, age, info, is_delete, create_time, update_time, gender, idcard_id, city_id
<== Row: 1035789714459471874, 冯文议, 26, <<BLOB>>, 0, 2018-09-01 15:21:26.0, 2018-09-01 15:21:26.0, 1, 1035789714388168706, 1035762001753501698
<== Total: 1
我们还可以这样写:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.and(obj ->
obj.eq(Student::getName, "冯文议")
.eq(Student::getAge, 26));
List<Student> studentList = list(queryWrapper);
for (Student student : studentList)
Console.info(new Gson().toJson(student));
【2】or
第一种:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.or(obj1 -> obj1.eq(Student::getName, "冯文议"))
.or(obj2 -> obj2.eq(Student::getName, "1"));
List<Student> studentList = list(queryWrapper);
for (Student student : studentList)
Console.info(new Gson().toJson(student));
sql:
SELECT * FROM t_student WHERE ( name = ? ) OR ( name = ? )
第二种:
QueryWrapper<Student> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Student::getName, "冯文议")
.or()
.eq(Student::getName, "1");
List<Student> studentList = list(queryWrapper);
for (Student student : studentList)
Console.info(new Gson().toJson(student));
SQL:
SELECT * FROM t_student WHERE name = ? OR name = ?
这样的话,我们就可以拼接各种条件了。那么问题来了:到底有哪些关键字呢?性能如何呢?
条件构造器
条件参数说明
查询方式 | 说明 |
---|---|
setSqlSelect | 设置 SELECT 查询字段 |
where | WHERE 语句,拼接 + WHERE 条件 |
and | AND 语句,拼接 + AND 字段=值 |
andNew | AND 语句,拼接 + AND (字段=值) |
or | OR 语句,拼接 + OR 字段=值 |
orNew | OR 语句,拼接 + OR (字段=值) |
eq | 等于= |
allEq | 基于 map 内容等于= |
ne | 不等于<> |
gt | 大于> |
ge | 大于等于>= |
lt | 小于< |
le | 小于等于<= |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN 查询 |
notIn | NOT IN 查询 |
isNull | NULL 值查询 |
isNotNull | IS NOT NULL |
groupBy | 分组 GROUP BY |
having | HAVING 关键词 |
orderBy | 排序 ORDER BY |
orderAsc | ASC 排序 ORDER BY |
orderDesc | DESC 排序 ORDER BY |
exists | EXISTS 条件语句 |
notExists | NOT EXISTS 条件语句 |
between | BETWEEN 条件语句 |
notBetween | NOT BETWEEN 条件语句 |
addFilter | 自由拼接 SQL |
last | 拼接在最后,例如:last(“LIMIT 1”) |
注意! xxNew 都是另起 ( ... )
括号包裹。
自定义sql
如果官方提供的满足不了你的需求,或者你的需求很复杂,导致你不知道如何使用条件构造器,那应该怎么办呢?
很简单。
第一步:找到 Dao,写一个数据库操作接口
public interface StudentDao extends BaseMapper<Student> {
List<Student> selectAll();
}
第二步:在xml文件中写sql
<!--List<Student> selectAll();-->
<select id="selectAll" resultMap="BaseResultMap">
select * from t_student
</select>
这样我们就可以使用了:
@Resource
StudentDao studentDao;
List<Student> studentList = studentDao.selectAll();
for (Student student : studentList)
Console.info(new Gson().toJson(student));
测试:
封装我们自己的Service
前面我们就说了,我是很不喜欢MP的查询接口的,我们就把他弄成我们喜欢的吧,我这里借鉴 JPA接口了,哈哈
interface:
/**
* 查询所有数据
* @return List<Student>
*/
List<Student> findAll();
/**
* 查询部分数据
* @return List<Student>
*/
List<Student> findList();
/**
* 查询一条数据
* @return Student
*/
Student findOne();
/**
* 根据主键ID查询数据
* @param id 主键ID,为null,返回null
* @return Student
*/
Student findById(Long id);
impl:
@Override
public List<Student> findAll() {
return list(null);
}
@Override
public List<Student> findList() {
return list(null);
}
@Override
public Student findOne() {
return getOne(null);
}
@Override
public Student findById(Long id) {
ExceptionUtil.notNull(id, "id must not null.");
return getById(id);
}
我们来试一下:
哇!!!
是不是很爽!!!
资料
[1] MyBatis-Plus测试示例
[2] 官网测试例子:WrapperTest.java
来源:https://blog.csdn.net/qq_28336351/article/details/82635100


猜你喜欢
- C#动态webservice调用接口using System;using System.Collections;using System.I
- 实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket
- 方法一: IDictionaryEnumerator enumerator = thProduct.GetEn
- 这篇文章主要介绍了Java数组索引异常产生及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- Spring Boot怎么实现热部署在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目。1、引
- 本文实例为大家分享了Android实现简单计时器的具体代码,供大家参考,具体内容如下布局在res/layout 下进行布局<?xml
- 前面已经把java io的主要操作讲完了 这一节我们来说说关于java io的其他内容 Serializable序列化 实例1:对象的序列化
- 数据库表结构departmentemployee要求一现在的要求是输入 id 把 employee 表的对应员工数据查询出来,并且查询出该员
- 本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下这次用到的jar包是zxing,没有用到core的jar包先导入zxi
- 引言在上一篇文章中# Android进阶宝典 -- KOOM线上APM监控最全剖析,我详细介绍了对于线上App内存监控的方案策略,其实除了内
- Java 垃圾回收与对象生命周期详解Java中的垃圾回收与对象生命周期1. 垃圾回收 垃圾回收是Java程序设计中
- 问题: 在win10系统中,使用IDEA 查看源码的时候,经常跳转代码,这样会让使用者感觉和方便,但是当你想要返回上次跳转的位置时,却不知道
- Eclipse Che被Eclipse官方称为下一代IDE,作为老牌的IDE,被其寄予厚望的Eclipse Che到底有什么特点,在这篇文章
- 目录一 前言二 解决方法三 常见的错误案例分析1.错误:ERR_UNKNOWN_URL_SCHEME2.实现UC、华为浏览器处理的效果——&
- 在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要
- 1.EazyEmail邮件发送类库Net 类库自带了邮件发送功能。笔者对该类库,从使用的角度进行了二次封装,nuget上可搜索EazyEma
- 前言想使用ffmpeg打开摄像头,需要输入摄像头的名称,而ffmpeg本身的枚举摄像头列表功能不是接口,所以需要用其他方式获取到设备列表。C
- 一、什么是加壳?加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。二、加壳作
- 本文实例分析了采用C#实现软件自动更新的方法,是非常实用的功能,值得学习和借鉴。具体如下:1.问题概述:长期以来,广大程序员为到底是使用Cl
- 一、Close与Dispose这两种方法的区别调用完了对象的Close方法后,此对象有可能被重新进行使用;而Dispose方法来说,此对象所