MyBatisPlus常用功能总结!(附项目示例)
这篇主要是总结一下MybatisPlus一些常用的场景,目前主要有以下几点:

- 完整的CURD操作示例
- 逻辑删除功能示例
- 自动填充功能示例
- 分页插件功能示例
有关一些其它重要的功能比如 条件生成器、主键策略、通用枚举、多数据源、乐观锁、多租户等功能可以看官方文档,官方文档已经写的很清楚了,而且每个功能点都有对应的项目示例。
示例准备
1、用户表
CREATE TABLE `user` (
`id` int unsigned AUTO_INCREMENT COMMENT '主键',
`username` varchar(128) COMMENT '用户名',
`phone` varchar(32) COMMENT '手机号',
`sex` char(1) COMMENT '性别',
`create_time` datetime COMMENT '创建时间',
`update_time` datetime COMMENT '更新时间',
`deleted` tinyint DEFAULT '0' COMMENT '1、删除 0、未删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1
2、创建对应实体
@Data
@Accessors(chain = true)
@TableName("user")
public class UserDO implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 用户名
*/
@TableField("username")
private String username;
/**
* 手机号
*/
@TableField("phone")
private String phone;
/**
* 性别
*/
@TableField("sex")
private String sex;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
/**
* 1、删除 0、未删除
*/
@TableField("deleted")
private Integer deleted;
}
3、创建Mapper
@Mapper
public interface UserMapper extends BaseMapper<UserDO> {
}
其它有关代码这里就不粘贴了,具体看项目源码就可以了。
一、完整的CURD操作
public class UserServiceTest extends Base {
@Autowired
private UserMapper mapper;
@Test
public void insert() {
UserDO user = new UserDO();
user.setUsername("小小");
user.setPhone("18812345678");
user.setSex("女");
Assertions.assertThat(mapper.insert(user)).isGreaterThan(0);
// 成功直接拿回写的 ID
Assertions.assertThat(user.getId()).isNotNull();
}
@Test
public void delete() {
mapper.deleteById(6);
mapper.delete(new LambdaQueryWrapper<UserDO>().eq(UserDO::getUsername, "张三"));
}
@Test
public void update() {
//方式一: 根据id更新
mapper.updateById(new UserDO().setId(1).setPhone("13312345678"));
//方式二: 左边是需要更新的值 右边是where条件
mapper.update(
new UserDO().setDeleted(1), new LambdaQueryWrapper<UserDO>().eq(UserDO::getPhone, "18812345678")
);
//方式三:不创建User对象
mapper.update(null,new LambdaUpdateWrapper<UserDO>()
.set(UserDO::getPhone,"13111111111").set(UserDO::getCreateTime, LocalDateTime.now()).eq(UserDO::getUsername,"小小"));
}
@Test
public void select() {
//1、根据主键获取
UserDO userDO = mapper.selectById(1);
//2、根据手机号获取 单个
UserDO userDO1 = mapper.selectOne(new LambdaQueryWrapper<UserDO>().eq(UserDO::getPhone, "13312345678"));
//3、获取集合
List<UserDO> userDOS = mapper.selectList(new LambdaQueryWrapper<UserDO>().eq(UserDO::getPhone, "13312345678"));
List<UserDO> userDOS1 = mapper.selectList(null);
}
@Test
public void orderBy() {
//1、单个排序
List<UserDO> users = mapper.selectList(Wrappers.<UserDO>query().orderByAsc("create_time"));
//2、多字段排序
List<UserDO> users2 = mapper.selectList(Wrappers.<UserDO>query().orderByAsc(Lists.newArrayList("create_time","phone")));
//3、先按手机号升序排列,phone相同再按create_time降序排列
List<UserDO> users3 = mapper.selectList(Wrappers.<UserDO>query().orderByAsc("phone").orderByDesc("create_time"));
//4、Lambda实现方式,和3实现的效果是一样的。
List<UserDO> users4 = mapper.selectList(new LambdaQueryWrapper<UserDO>().orderByAsc(UserDO::getPhone).orderByDesc(UserDO::getCreateTime));
}
@Test
public void groupBy() {
QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
wrapper.select("phone, count(*) as total")
.groupBy("phone");
//注意要用 listMaps ,返回的是 Map<String,Object>
List<Map<String, Object>> maplist = mapper.selectMaps(wrapper);
}
@Test
public void testSelectMaxId() {
QueryWrapper<UserDO> wrapper = new QueryWrapper<>();
wrapper.select("max(id) as id");
UserDO user = mapper.selectOne(wrapper);
}
}
二、逻辑删除功能
1、使用场景
这个场景是这样的,因为我们在设计表结构的时候都会有一个逻辑删除字段,比如上表中就有一个deleted字段,1=删除 0=未删除。
那我们在查询或者更新操作时,sql都会带上这个字段。
例如:
-- 更新
update user set sex='女' where id = 1 and deleted=0
-- 查询
select id,sex,username from user where deleted=0
既然都要带上,那是不是可以做成全局的,不用我们每个sql都手动添加deleted=0,这个条件。
2、使用方法
1、配置
例如: application.yml
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名()
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
2、实体类字段上加上@TableLogic注解
@TableLogic
private Integer deleted;
注意:since 3.3.0,配置后可以忽略不配置这步骤
3、示例
public class UserServiceDeleteTest extends Base {
@Autowired
private UserMapper mapper;
@Test
public void update() {
//方式一: 根据id更新
mapper.updateById(new UserDO().setId(1).setPhone("13312345678"));
//实际执行sql: UPDATE user SET phone=? WHERE id=? AND deleted=0
}
@Test
public void select() {
//1、根据主键获取
UserDO userDO = mapper.selectById(1);
//实际执行sql: SELECT id,username,phone,sex,create_time,update_time,deleted FROM user WHERE id=? AND deleted=0
}
}
上面两条sql虽然没有加入deleted=0这个条件,但因为加了全局配置,所以会自动加上deleted=0条件。
三、自动填充功能
1、使用背景
我们在设计表的时候,会有创建人ID,创建人名称,创建时间,更新人ID,更新人名称,更新时间。
我们在新增或者更新数据的时候,都会修改这些数据。所以我们也可以做成全局的。
2、使用方式
1、实体添加注解
/**
* 创建时间
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
FieldFill一共有4种属性,默认是DEFAULT
public enum FieldFill {
DEFAULT,
INSERT,
UPDATE,
INSERT_UPDATE;
}
2、自定义实现类 MyMetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//设置属性值
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
3、测试
@Test
public void insert() {
UserDO user = new UserDO();
user.setUsername("小小");
user.setPhone("18812345678");
user.setSex("女");
Assertions.assertThat(mapper.insert(user)).isGreaterThan(0);
// 成功直接拿回写的 ID
Assertions.assertThat(user.getId()).isNotNull();
}
用上面这个测试用例,发现虽然这里没有插入创建时间和更新时间,但打印sql发现插入该属性。
==> Preparing: INSERT INTO user ( username, phone, sex, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: 小小(String), 18812345678(String), 女(String), 2022-09-27T16:40:00.682(LocalDateTime), 2022-09-27T16:40:00.687(LocalDateTime)
<== Updates: 1
4、注意事项
- 填充原理是直接给
entity的属性设置值!!! - 注解则是指定该属性在对应情况下必有值,如果无值则入库会是
null MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充- 字段必须声明
TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段 - 填充处理器
MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入 - update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效
四、分页功能示例
1、配置类
@Configuration
public class MybatisPlusPageConfig {
/**
* 新的分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
2、示例
public class UserServicePageTest extends Base {
@Autowired
private UserMapper mapper;
@Test
public void page() {
Page<UserDO> page = new Page<>(1, 3);
Page<UserDO> result = mapper.selectPage(page, new LambdaQueryWrapper<UserDO>().eq(UserDO::getDeleted, 0));
}
}
这里有点需要注意: MybatisPlus 与 pagehelper 存在依赖 jsqlparser 冲突,不建议混用
项目地址: https://github.com/yudiandemingzi/spring-boot-study
MyBatisPlus常用功能总结!(附项目示例)的更多相关文章
- Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码)
Visual Studio 2015开发Qt项目实战经验分享(附项目示例源码) 转 https://blog.csdn.net/lhl1124281072/article/details/800 ...
- Echarts图表常用功能配置,Demo示例
先看下效果图: 就如上图所示,都是些常用的基本配置. Legend分页,X轴设置,Y轴设置,底部缩放条设置, 数值显示样式设置,工具箱设置,自定义工具按钮, 绑定点击事件等等.这些配置代码中都做了简单 ...
- mybatis常用功能总结
mybatis-plus常用功能总结-以User表为例 1.数据库 id name age email create_time update_time version deleted 1 mary 2 ...
- iOS项目开发常用功能静态库
YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...
- Spring Boot从入门到实战:整合Web项目常用功能
在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问.异常处理.消息队列.缓存服务.OSS服务,以及接口日志配置,接口文档生成等.如果每个项目都来一套,则既费力又难以维护.可以通过Spr ...
- 项目中常用功能,如:流媒体、健康数据(步数等)等-b
整理iOS开发中使用的各种流媒体和常用的高级功能.由于时间关系,目前只写了一部分功能,全部都采用的是系统方法,没用第三方,截图如下: screen1.png screen2.png 个人比较懒,不爱多 ...
- Spring Boot搭建Web项目常用功能
搭建WEB项目过程中,哪些点需要注意: 1.技术选型: 前端:freemarker.vue 后端:spring boot.spring mvc 2.如何包装返回统一结构结果数据? 首先要弄清楚为什么要 ...
- 开源三维地球GIS引擎Cesium常用功能的开发
Cesium是一个非常优秀的三维地球GIS引擎(开源且免费).能够加载各种符合标准的地图图层,瓦片图.矢量图等都支持.支持3DMax等建模软件生成的obj文件,支持通用的GIS计算:支持DEM高程图. ...
- Nginx常用功能
3.Nginx常用功能 3.1 反向代理服务器 3.1.1.demo2 a.我在tomcat下部署了一个javaweb项目,tomcat安装的服务器IP为:192.168.37.136,部署的项目在t ...
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
C#构造方法(函数) 一.概括 1.通常创建一个对象的方法如图: 通过 Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...
随机推荐
- Vue +Spring Boot 前后端分离 的 项目 笔记
Vue +Spring Boot 前后端分离 的 项目 笔记 前端部分 Vue 脚手架的搭建 1.在创建目录的上一目录执行命令 命令为 vue init webpack 项目名 再创建项目的时候会自动 ...
- 【幻兽帕鲁】专用服务器攻略来啦!一键部署,5s开服
本文分享自华为云社区<全网最易用.最实用.最好用的[幻兽帕鲁]专用服务器攻略来啦!一键部署,5s开服!>,作者: 云容器大未来. 华为云隆重推出"帕鲁服务器-云耀云容器版&quo ...
- Kubernetes 漫游:Controller Manager
Controller Manager Controller Manager 是控制平面的一个重要组件,负责维护 Kubernetes 集群的整体状态. 流程: 在集群中 Controller Mana ...
- 如何更改 C# Record 构造函数的行为
如何更改 C# Record 构造函数的行为 Record 是 C# 9 中的一个新功能.Record是从Structs借用的特殊类, 因为它们具有 基于值的相等性,您可以将它们视为两类类型之间的混合 ...
- 介绍 ComPDFKit 转换 SDK 1.5.0
介绍 ComPDFKit 转换 SDK 1.5.0 了解有关 ComPDFKit PDF SDK 的更多信息:https ://www.compdf.com/ ComPDFKit Conversion ...
- std::weak_ptr 与 std::shared_ptr 配合使用
std::shared_ptr<int> a = std::make_shared<int>(2); std::weak_ptr<int> b = a; a = n ...
- xHook 源码解析
xHook 是爱奇艺开源的一个PLT Hook 框架 项目地址: https://github.com/iqiyi/xHook 该项目实现了 PTL/GOT Hook PTL hook 的本质是修改内 ...
- 记录级别索引:Hudi 针对大型数据集的超快索引
介绍 索引是一个关键组件,有助于 Hudi 写入端快速更新和删除,并且它在提高查询执行方面也发挥着关键作用. Hudi提供了多种索引类型,包括全局变化的Bloom索引和Simple索引.利用HBase ...
- KPTP 汇报模板
1.什么是KPTP 它是由4个单词:Keep.Problem.Try.Plan的首字母组成的. K:keep,今天做了哪些工作: P:problem,遇到了哪些问题: T:try,计划尝试如何解决这些 ...
- VS Code实现SSH远程开发
最近收获一台新台式机,但是个人主要还是使用自己的笔记本,用了几天远程控制,感觉各种不方便,最终决定配置一下VS Code实现SSH远程开发,特此记录. 首先介绍一下环境,控制端是Windows 11, ...