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
猜你喜欢
- 在Java 字符终端上获取输入有三种方式:1、java.lang.System.in (目前JDK版本均支持)2、java.util.Sca
- 说到Java的本地存储,肯定使用IO流进行操作。首先,我们需要一个创建文件的函数createNewFile:public static bo
- 因为某些需求,要在特定的时间执行一些任务,比如定时删除服务器存储的数据缓存,定时获取数据以及定时发送推送等等,这时就需要用到定时任务了。定时
- ReentrantLock内部由Sync类实例实现。Sync类定义于ReentrantLock内部。Sync继承于AbstractQueue
- 1、深度总结引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果
- 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换
- 对于服务器端开发人员而言,调用第三方接口获取数据,将其“代理”转化并返给客户端几乎是家常便
- SpringMVC @RequestBody的使用Spring mvc是一个非常轻量的mvc框架,注解可以大大减少配置,让请求的拦截变得比较
- 本文实例为大家分享了java通过PDF模板填写PDF表单的具体代码,包括图片,供大家参考,具体内容如下需要用到的java包: it
- 重写java object类的equals方法覆盖equals方法请遵守约定什么情况下要覆盖equals方法容易违反的对称性不易察觉的传递性
- 大家好,在这篇文章中,我们将学习如何添加动画,同时从一个页面到其他在 Flutter。我们将覆盖不同类型的动画和实现基本动画 Flutter
- maven打包时候修改包名称带上git版本号和打包时间使用 maven 插件 git-commit-id-plugin 可以获取项目的git
- 简介本文用示例介绍java的Duration的用法。Duration和Period说明Duration类通过秒和纳秒相结合来描述一个时间量,
- 不同点:不能直接实例化接口。接口不包含方法的实现。接口可以多继承,类只能单继承。类定义可以在不同的源文件之间进行拆分。相同点:接口、类和结构
- 使用InsertProvider注解报错解决目前项目在使用mybatis,并且是使用注解的方式。在使用InsertProvider注解的时候
- 一、引言90坦克大战,很经典的一款游戏,当年与小伙伴一人一个手柄,搬上小板凳坐在电视机前,身体时不时跟随手柄摇晃着,时而表情严肃、眉头紧锁,
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 前言之前我们提到了 CustomPaint er 的 Paint 可以使用渐变(GradientShader)来填充绘制的图形,本篇我们来介
- 将DataGrid中上面这个表头变成下面的两行表头,你会怎么实现?很巧妙地截断和补充td tr来实现来源:http://www.cnsend
- 该方法把该字符串转换成一个新的字符数组。 String str="abcdefg"; char a[]; a=str.t