MyBatis-Plus
官方网站:MyBatis-Plus 🚀 为简化开发而生
概述
MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。简化了单表的CURD,节省了工作量,提高效率。
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库
框架结构
快速入门
使用MyBatisPlus的基本步骤
1.引入MyBatisPlus依赖,代替MyBatis依赖
SpringBoot2
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.9</version>
</dependency>SpringBoot3
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.9</version>
</dependency>
2.定义Mapper接口并继承BaseMapper
public interface UserMapper extends BaseMapper<User>{}
常见注解
MyBatis-Plus通过扫描实体类,并且基于反射获取实体类信息作为数据库表信息
表名约定:1.类名驼峰转下划线作为表名
2.名为id的字段作为主键
3.变量名驼峰转下划线作为表的字段名
当类不满足以上约定时需要用到标签
@TableName:用来指定表名
@Tableid(value=“id”,type=“”):用来指定表中的主键字段信息
type(AUTO:数据库自增长;INPUT:通过set方法自行注入;ASSIGN_ID:接口identifiergenerator方法nextid生成id,默认实现类为雪花算法)
@TableField:用来指定表中的普通字段信息
使用@TableField的常见场景:
1.成员变量名与数据库字段名不一致
2.成员变量名以IS开头且是boolean类型
3.成员变量与数据库关键字冲突
4.成员变量不是数据库字段
常见配置
MyBatisPlus的配置继承了MyBatis原生配置和一些自己特有的配置,需在application.yml中根据需要添加自己需要的配置
核心功能
MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求
条件构造器
1.基于QueryWrapper的查询
原始的sql语句:update user set balance=2000 where username=“jack”
QueryWrapper:
//1.要更新的数据
User user =new User();
user.setBalance(2000);
//2.更新的条件
QueryWrapper<User> wrapper =new QueryWrapper<User>().eq("username","jack") ;
//3.执行更新
userMapper.update(user,wrapper);
2.基于UpdateWrapper的更新
需求:更新id为1,2,4的用户余额,扣200
原始写法:update user set balance=balance-200 where id in(1,2,4);
UpdateWrapper:
List<Integer> ids=List.of(1,2,3);
UpdateWrapper<User> wrapper =new UpdateWrapper<User>().setsql("balance=balance-200").in("id",ids);
userMapper.update(null,wrapper);
3.基于LambdaQueryWrapper
解决了字段名写死的情况,避免硬编码
LambdaQueryWrapper<User> wrapper =new LambdaQueryWrapper<User>().select(User::getId,User::getUsername).like(User::getUsername,"0").ge(User::getBalance,1000);
QueryWrapper和LambadWrapper通常用来构建select,delete,update的where条件部分
UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码
自定义SQL
利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL语句中的剩下部分
1.基于Wrapper构建where条件
2.在mapper方法参数中用Param注释声明wrapper变量名称,必须是ew
3.自定义SQL,并使用Wrapper条件
Service接口
1.自定义接口需要继承IService接口
2.实现类需要集成ServiceImpl实现类
当业务需求较简单时,可以直接在controller层调用已有的方法,例如增删改查
当业务逻辑较为复杂时,需要自定义方法,完成业务需求
IService的Lambda查询
当条件复杂时,原始的mapper文件写sql语句过于繁琐,可以采用lambdaQuery查询,条件判断便利,快速
原始的mapper文件书写sql语句:
采用lambdaQuery查询:
IService的Lambd更新
在书写完毕后一定要加.update()去执行语句,若不加该语句不会执行.
IService批量新增
1.普通for循环逐条插入
每次提交只交一条sql语句,速度极差,不推荐
2.MP的批量新增,基于预编译的批处理,减少网络请求次数,性能不错
3.配置JDBC参数,开启rewriteBatchedStatements=true,性能最好
扩展功能
代码生成
下载插件可以自动生成和表信息相关的实体类,实现类,接口等,减少了工作量.
下载完成后,选择config database配置数据库信息
填写jdbc连接的参数信息
连接成功后,点击code generator
填写相关信息
填写完毕后,点击提交生成代码.
插件功能
分页插件
首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件
分页的API
使用API