五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
@
1. ActiveRecord 模式
2. ActiveRecord介绍
ActiveRecord(活动记录,简称AR),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。ActiveRecord,一直广受解释型动态语言(PHP,Ruby 等)的喜爱,通过围绕一个数据对象进行 CRUD 操作。而Java作为准静态(编译型语言),对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索,仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅。
2.1 ActiveRecord实现
接下来我们来看一下ActiveRecord的实现步骤
想要使用 ActiveRecord 模式,就需要让对应的实体类(Java Bean) extends(继承) Model 类。

我们可以看到,Model 类中提供了一些增删改查方法,这样的话我们就可以直接使用实体类对象调用这些增删改查方法了,简化了操作的语法,但是他的底层依然是需要 UserMapper 的,所以持久层接口不能省略。
测试 ActiveRecord 模式的增删改查。
添加数据
import com.rainbowsea.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ActiveRecordTest {
//public class User extends Model<User>, 需要继承 extends Model<User>
// 添加操作
@Test
void activeRecordAdd() {
User user = new User();
user.setName("zhang");
user.setAge(28);
user.setEmail("zhang@rainbowsea.com");
user.insert();
}
}

删除数据
import com.rainbowsea.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ActiveRecordTest {
//public class User extends Model<User>, 需要继承 extends Model<User>
// 删除操作
@Test
void activeRecordDelete() {
User user = new User();
user.setId("1837781440184680449");
user.deleteById();
}
}

修改数据
import com.rainbowsea.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ActiveRecordTest {
//public class User extends Model<User>, 需要继承 extends Model<User>
// 修改操作
@Test
void activeRecordUpdate() {
User user = new User();
user.setId("3");
user.setAge(1);
user.updateById();
}
}

查询数据
import com.rainbowsea.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ActiveRecordTest {
//public class User extends Model<User>, 需要继承 extends Model<User>
// 查询操作
@Test
void activeRecordSelect() {
User user = new User();
user.setId("7");
User result = user.selectById();
System.out.println(result);
}
}

3. SimpleQuery 工具类
3.1 SimpleQuery介绍
SimpleQuery 可以对 selectList 查询后的结果用 Stream 流进行了一些封装,使其可以返回一些指定结果,简洁了 api 的调用。
3.2 list

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testList() {
List<String> list = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getId);
System.out.println(list);
}
}

对于封装后的字段进行 lambda 操作。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testList2() {
List<String> list = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getName,
new Consumer<User>() {
@Override
public void accept(User user) {
Optional.of(user.getName()).map(String::toLowerCase).ifPresent(user::setName);
}
});
System.out.println(list);
}
}

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
// 使用lab表达式
@Test
void testList3() {
List<String> list = SimpleQuery.list(new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getName,
user -> Optional.of(user.getName()).map(String::toLowerCase).ifPresent(user::setName));
System.out.println(list);
}
}
3.3 map
将所有的对象以id,实体的方式封装为Map集合
、
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testMap() {
Map<String, User> map = SimpleQuery.keyMap(new LambdaQueryWrapper<User>(), User::getId);
System.out.println(map);
}
}
将单个对象以id,实体的方式封装为Map集合

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testMap2() {
Map<String, User> map = SimpleQuery.keyMap(new LambdaQueryWrapper<User>().eq(User::getId, 1L), User::getId);
System.out.println(map);
}
}
只想要 id 和 name 组成的 map

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testMap3() {
Map<String, String> map = SimpleQuery.map(new LambdaQueryWrapper<User>(), User::getId, User::getName);
System.out.println(map);
}
}
3.4 Group
Group 就是简单的分组效果。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery;
import com.rainbowsea.bean.User;
import com.rainbowsea.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
@SpringBootTest
public class SimpleQueryTest {
@Resource
private UserMapper userMapper;
@Test
void testGroup() {
Map<String, List<User>> map = SimpleQuery.group(new LambdaQueryWrapper<User>(), User::getName);
System.out.println(map);
}
}
4. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)的更多相关文章
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- Java并发指南9:AQS共享模式与并发工具类的实现
一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...
- SSM-MyBatis-10:Mybatis中SqlSession的getMapper()和简单的工具类MyBatisUtils
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- getMapper的作用,获取到接口,直接通过点的方式调用方法,以免直接手打的方式写错方法名,(强类型的方式) ...
- mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里
- Atitit orm的实现模式 data-mapper模式和active-record模式有什么区别
Atitit orm的实现模式 data-mapper模式和active-record模式有什么区别 1.1. 这是来自Node.js路线有关混合两种ORM模式Active Record(活动记录模 ...
- mybatis(五)mybatis工作流程
转载:https://www.cnblogs.com/wuzhenzhao/p/11103017.html 先来看一下MyBatis 的编程式使用的方法: public void testMapper ...
- Mybatis-plus - ActiveRecord 模式CRUD
什么是ActiveRecord模式 ActiveRecord 也属于 ORM 层,由 Rails 最早提出,遵循标准的 ORM 模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和 ...
- 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!
转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
随机推荐
- UE中返回值为数组的时候,无法传递Reference的问题
我如果要修改一个类或者结构体的成员变量, 那么我需要通过函数返回 也就是说Struct目前不能传递引用,只能传递备份
- MySQL 跨服务器关联查询
如果您需要在 MySQL 中关联查询位于不同服务器的表(跨服务器关联查询),您可以考虑使用 MySQL 的联机查询(Federated MySQL).联机查询允许您在一个服务器上访问和查询另一个服务器 ...
- mysql进阶笔记
说明:此文章并非原创,参考极客时间文章<MySQL实战45讲>做的一些笔记,方便自己查阅,有兴趣可以自行去极客时间阅读,内容非常给力. mysql引擎 Innodb: Page是Inno ...
- 【Vue】树状节点接口 与 级联选择框组件
原来有一个组织机构的渲染, 我自己写的我自己看也8太明白了: https://www.cnblogs.com/mindzone/p/14888046.html 现在,有一个位置选择,使用这个级联选择器 ...
- Git的分支管理和标签操作
分支操作 分支是Git使用过程中非常重要的概念.使用分支意味着你可以把你的工作从开发主线上分离出来,以免影响开发主线. 同意一个仓库可以有多个分支,各个分支相互独立,互不干扰.通过git init 命 ...
- OSS简单文件上传和本地存储上传
网站的文件上传方法 本地存储上传 // 本地存储方式 MultipartFile接受文件 @PostMapping("/save") public Result save(Stri ...
- 英语词汇:simplistic和simple区别
"Simplistic" 和 "simple" 都表示简单,但它们有不同的含义和语境: Simplistic: 含义: 过于简单化的,有贬义,表示忽略了复杂性或 ...
- 切记:使用nvidia omniverse时一定要用2T的固态硬盘
最近在用nvidia omniverse时突然发现这样的一个问题,那就是这个软件实在是太太了,一个组件就4个多GB大小,如果安装几个组件后那么几十GB的硬盘就没有了,同时由于这个体积太大,因此再启动和 ...
- 树莓派3b+ 安装windows10 arm版本的方法及使用体验
首先,我再网上找到了一个很详细的为树莓派3b安装windows10 arm的教程,实际操作下来发现并不可行. 最后找到了可行的教程: 第3章 将Windows10镜像写入TF卡:https://zhu ...
- AMiner的数据质量和完善问题
最近参加到了一个国家科技项目中,这里就不吐槽这种高校承接国家科技项目是一件多么不靠谱的事情了,这里就说说我们的对标产品"AMiner".补充一下,虽然个人对AMiner的评价不是很 ...
