MybatisPlus知识点总结
配套资料
黑马微服务框架笔记,内含mp
MybatisPlus.pptx
MyBatis-Plus (mp中文官网)
快速入门
入门案例
使用MybatisPlus的基本步骤:
1.引入MybatisPlus依赖,代替Mybatis依赖
2.定义Mapper接口并继承BaseMapper注:继承时要指定泛型为你操作的实体类的类型
常见注解
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息
约定
1.类名驼峰转下划线作为表名
2.名为id的字段作为主键
3.变量名驼峰转下划线作为表的字段名
当实际与约定不同时,需要使用注解
MybatisPlus中比较常用的几个注解如下:
@TableName:用来指定表名
@TableId:用来指定表中的主键字段信息
IdType枚举:
AUTO:数据库自增长
INPUT:通过set方法自行输入
ASSIGN_ID:分配 ID,接口IdentifierGenerator的方法nextId来生成id,默认实现类为DefaultIdentifierGenerator雪花算法使用
@TableField:用来指定表中的普通字段信息
@TableField的常见场景:
成员变量名与数据库字段名不一致
(变量名是name,数据库字段名是username)
成员变量名以is开头,且是布尔值
(例:isMarried可能会被看成married,需要注解@TableField(“is_married”)
成员变量名与数据库关键字冲突
(例:变量名order与数据库关键字order相同)
成员变量不是数据库字段
(例:adress在数据库不存在)
常见配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如:
核心功能
条件构造器
mp支持各种复杂的where条件,可以满足日常开发的所有需求
案例
基于QueryWrapper的查询
需求:
1.查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段
2.更新用户名为jack的用户的余额为2000
基于UpdateWrapper的更新
需求:更新id为1,2,4的用户的余额,扣200
条件构造器的用法:
1.QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
2.UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
3.尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码
下图是LambdaQueryWrapper的使用,可以与上面第一个案例的代码进行对比
自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
上图的mp代码有部分是在Service层编写
当where条件外的部分没有办法用mp更方便地实现,只能在业务层(Service)拼接,而这样违背了企业开发的规范,就会用到自定义SQL
需求:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
步骤
1.基于Wrapper构建where条件
2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
3.自定义SQL,并使用Wrapper条件
Service接口
增:save相关
删:remove相关
改:update相关
查:get相关:查一个值
list相关:查多个值
count相关:查数量
page相关:查分页
复杂条件的查询、更新:用lambda相关
MP的Service接口使用流程是怎样的?
1.自定义Service接口继承IService接口
2.自定义Service实现类,实现自定义接口并继承ServiceImpl类
案例
基于Restful风格实现下列接口
需求:基于Restful风格实现下面的接口:
表单提交要有DTO实体,用户查询结果返回要有VO实体
IService的Lambda查询
需求:实现一个根据复杂条件查询用户的接口,查询条件如下:
name:用户名关键字,可以为空
status:用户状态,可以为空
minBalance:最小余额,可以为空
maxBalance:最大余额,可以为空
IService的Lambda更新
需求:改造根据id修改用户余额的接口,要求如下
1.完成对用户状态校验
2.完成对用户余额校验
3.如果扣减后余额为0,则将用户status修改为冻结状态
IService批量新增
需求:批量插入10万条用户数据,并作出对比:
普通for循环
插入IService的批量插入
开启rewriteBatchedStatements=true参数(在yaml的mysql->url中添加)
批处理方案:
普通for循环逐条插入速度极差,不推荐
MP的批量新增,基于预编译的批处理,性能不错
配置jdbc参数,开rewriteBatchedStatements,性能最好
扩展功能
代码生成
原因:内容类似
代码生成步骤
DB静态工具
案例
需求:
1.改造根据id查询用户的接口,查询用户的同时,查询出用户对应的所有地址改造
2.根据id批量查询用户的接口,查询用户的同时,查询出用户对应的所有地址实现
3.根据用户id查询收货地址功能,需要验证用户状态,冻结用户抛出异常(练习)
分析:
前面两个接口中,在UserService中需要注入AdressService;而第三个接口在AdressService中需要注入UserService,形成循环依赖。
为了解决这个问题,可以使用静态工具
逻辑删除
逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:
在表中添加一个字段标记数据是否被删除
当删除数据时把标记置为1
查询时只查询标记为0的数据
例如逻辑删除字段为deleted:
删除操作:
查询操作:
MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:
枚举处理器
User类中有一个用户状态字段:
在application.yml中配置全局枚举处理器:
如何实现PO类中的枚举类型变量与数据库字段的转换?
1.给枚举中的与数据库对应value值添加@EnumValue注解
2.在配置文件中配置统一的枚举处理器,实现类型转换
拓展:
枚举在给前端返回的时候,默认返回的是枚举项的名字
可以利用@JsonValue来自己定义返回的对象
默认情况下如图
在desc上加了@JsonValue,status返回结果发生改变。(value同理)
JSON处理器
//无JSON处理器
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");//有JSON处理器
user.setInfo(UserInfo.of(24,"英文老师","female"));
插件功能
MyBatisPlus提供的内置拦截器有下面这些:
序号 | 拦截器 | 描述 |
---|---|---|
1 | TenantLineInnerInterceptor | 多租户插件 |
2 | DynamicTableNameInnerInterceptor | 动态表名插件 |
3 | PaginationInnerInterceptor | 分页插件 |
4 | OptimisticLockerInnerInterceptor | 乐观锁插件 |
5 | IllegalSQLInnerInterceptor | SQL性能规范插件,检测并拦截垃圾SQL |
6 | BlockAttackInnerInterceptor | 防止全表更新和删除的插件 |
分页插件
首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件:
接着,就可以使用分页的API了: