简介
MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
框架结构
使用
内置模板
提供模板Mapper:BaseMapper,内置有基本的CURD
提供模板Service:IService
通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
泛型 T 为任意实体对象
建议如果存在自定义通用 Service 方法的可能,可以创建自己的 IBaseService 继承配置日志:
# 配置MyBatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
常用注解
@TableName
MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致 。那么问题产生:
问题一:若实体类类型的类名和要操作的表的表名不一致,会出现什么问题? ——报错,sql语句无法正常执行
解决:@TableName
在实体类类型上添加@TableName(“表名”),标识实体类对应的表,即可成功执行SQL语句
问题二:如果实体类对应的表都有固定的前缀,每张表添加@TableName就会很麻烦,那么怎么办?
解决:全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName标识实体类对应的表。
mybatis-plus:
global-config:
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: t_
@TableId
MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认 基于雪花算法的策略生成id 。
问题一:若实体类和表中表示主键的不是id,而是其他字段,例如uid,MyBatis-Plus会自动识别uid为主键列吗? ——不会
解决:在实体类对应属性上添加@TableId将其标识为主键
例如表中和实体类主键都为uid:
问题二:若是实体类主键属性与表中主键属性名不同呢?
使用@TableId的value属性
@TableId(“uid”) 或者@TableId(value = “uid”)
问题三:如何定义主键策略?
(1)数据库中设置主键自增后,设置@TableId的Type属性
(2)全局配置主键生成
@TableField
问题:非主键字段表中与实体类中不同怎么办?
如果表中是下划线,实体类中驼峰, 时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格 ,例如user_name与userName
如果名称不同,例如user_name与 name,则使用注解@TableField
@TableLogic
逻辑删除
- 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
- 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
- 使用场景:可以进行数据恢复
step1:数据库中创建逻辑删除状态列,默认值为0
step2:实体类中添加逻辑删除属性
step3:测试