跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

MyBatis-Plus核心知识点全解析

1. MyBatis-Plus是什么?

有什么特点?

答案: MyBatis-Plus(简称MP)是MyBatis的增强工具,在MyBatis基础上 只做增强不做改变 ,由国内苞米豆团队开发,为简化开发、提高效率而生。

特点: 无侵入:引入后不影响现有工程,适配性强 损耗小:启动自动注入基本CRUD,性能几乎无损耗 强大CRUD:内置通用Mapper/Service,少量配置实现单表CRUD 丰富功能:支持Lambda查询、主键自动生成、物理分页、代码生成等 防误操作:内置全局拦截插件,阻断全表delete/update 多库兼容:支持MySQL、Oracle、SQLServer等多种数据库 2. MyBatis-Plus与MyBatis的关系?

答案: MyBatis-Plus是 MyBatis的增强版 ,完全基于MyBatis开发,不改变其核心原理 MP对MyBatis的CRUD操作做了封装,无需编写大量XML映射文件 保留MyBatis的所有功能,支持自定义XML、自定义SQL,可无缝融合 实现多表操作时,可复用MyBatis的一对一/一对多/多对多写法,或在Service层分多次单表查询 3. MyBatis-Plus的三大核心概念是什么?

答案: 镜像(Image) :只读的实体表映射模板,是创建容器的基础,通过实体类注解关联数据库表 容器(Container) :镜像的运行实例,对应MyBatis的SqlSession执行环境,处理具体CRUD请求 仓库(Repository) :Mapper接口的统称,继承BaseMapper后自动获得通用CRUD能力,是操作数据库的入口 4. MyBatis-Plus为什么能简化开发?

核心执行流程是什么?

答案: 简化原因 :自动完成实体类与数据库表的映射,内置通用CRUD方法,无需手动编写SQL和XML,通过注解/配置即可实现单表操作。

核心执行流程 : 扫描指定包下的实体类,通过反射提取表名、列名、主键信息 根据实体类信息,自动生成insert/delete/update/select等基础SQL语句 将生成的SQL注入到MyBatis的容器中,绑定到对应的Mapper接口 调用Mapper接口方法时,直接执行预生成的SQL,无需手动配置 5. MyBatis-Plus常用的核心注解有哪些?

分别作用是什么?

答案: 核心注解均用于 实体类与数据库表的映射配置 ,常用如下:

@TableName

:表名注解,标识实体类对应的数据库表名(解决类名与表名不一致)

@TableId

:主键注解,标记实体类主键字段,支持指定主键类型(AUTO/ASSIGN_ID等)

@TableField

:非主键字段注解,解决字段名与列名不一致,可指定查询/更新策略

@TableLogic

:逻辑删除注解,标记逻辑删除字段,实现“假删除”(更新字段状态而非物理删除)

@Version

:乐观锁注解,标记版本数字段,解决并发更新数据冲突问题

@EnumValue

:枚举注解,标记枚举类中与数据库映射的字段 6. MyBatis-Plus的主键生成策略有哪些?

常用的是哪几种?

答案: MP支持8种主键策略,核心枚举为

IdType

,常用策略及说明: AUTO :数据库ID自增,需将数据库主键设为自增约束 ASSIGN_ID (雪花算法):默认策略,生成分布式全局唯一Long型ID,支持数字/字符串主键 ASSIGN_UUID :生成32位全局唯一UUID字符串,适用于字符串类型主键 INPUT :手动输入主键值,插入前需自行设置ID NONE :未设置主键类型,跟随全局配置 废弃策略 :ID_WORKER、ID_WORKER_STR、UUID(推荐用ASSIGN_ID/ASSIGN_UUID替代) 配置方式 :全局配置(yml文件)或局部配置(@TableId注解,优先级更高) 7. MyBatis-Plus的条件构造器(Wrapper)有什么作用?

常用的查询条件方法有哪些?

答案: 作用 :封装复杂的查询/更新条件,替代手动编写SQL的where子句,支持链式调用、Lambda表达式,避免字段名写错,实现动态SQL。

常用条件方法 : 等值/不等值:

eq

(等于)、

ne

(不等于) 范围查询:

gt

(大于)、

ge

(大于等于)、

lt

(小于)、

le

(小于等于)、

between

(区间) 模糊查询:

like

(%值%)、

likeLeft

(%值)、

likeRight

(值%)、

notLike

(不包含) 非空判断:

isNotNull

(非空)、

isNull

(为空) 排序/子查询:

orderByDesc

(倒序)、

orderByAsc

(正序)、

inSql

(子查询in条件) 计数/拼接:

count

(统计条数)、

last

(拼接自定义SQL片段) 8. MyBatis-Plus如何实现分页查询?

核心步骤是什么?

答案: MP内置 物理分页插件 ,无需使用PageHelper等第三方插件,核心步骤2步: 步骤1:配置分页拦截器(Spring Boot配置类)

​ @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 配置分页插件,指定数据库类型(如MySQL) interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } 步骤2:代码中使用

Page

对象执行分页查询

​ // Page<实体类> 构造器:(当前页码, 每页条数) Page page = new Page<>(2, 3); // 调用selectPage方法,第二个参数为条件构造器(null表示无条件) Page userPage = userMapper.selectPage(page, null); // 获取分页结果 List data = userPage.getRecords(); // 分页数据 long total = userPage.getTotal(); // 总条数 long pages = userPage.getPages(); // 总页码 特点 :物理分页(基于LIMIT),性能优于逻辑分页,支持多数据库适配。

9. 什么是逻辑删除?

MyBatis-Plus如何实现逻辑删除?

答案: 逻辑删除 :并非物理删除数据库数据,而是通过 字段标记数据状态 (如deleted=0未删除、deleted=1已删除),实现数据“假删除”,防止误删且可恢复,是开发中的最佳实践。

MP实现逻辑删除核心步骤3步 : 数据库表添加逻辑删除字段(如

deleted int default 0

) 实体类对应字段添加

@TableLogic

注解

​ @TableLogic // 逻辑删除注解 private Integer deleted; 配置文件中指定逻辑删除/未删除值

​ mybatis-plus: global-config: db-config: logic-delete-value: 1 # 已删除值 logic-not-delete-value: 0 # 未删除值 执行效果 :调用delete方法时,自动转为

UPDATE 表 SET deleted=1 WHERE id=? AND deleted=0

;查询时自动追加

deleted=0

条件,过滤已删除数据。

10. 乐观锁是什么?

MyBatis-Plus如何实现乐观锁?

解决什么问题?

答案: 乐观锁定义 乐观锁是一种 并发控制策略 ,操作数据时认为不会有其他线程同时修改,因此不上锁;更新数据时会判断数据是否被修改过(通过版本号/时间戳),若被修改则放弃更新或重试。

解决问题 解决 并发更新数据的冲突问题 (如多人同时修改同一条数据,后更新的覆盖先更新的结果)。

MP实现乐观锁核心步骤3步 数据库表添加版本数字段(如

version int default 0

) 实体类对应字段添加

@Version

注解

​ @Version // 乐观锁注解 private Integer version; 配置类中注册乐观锁拦截器

​ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件 return interceptor; } 执行效果 :更新时自动追加版本号判断,SQL为

UPDATE 表 SET ..., version=version+1 WHERE id=? AND version=?

;若版本号不匹配(数据已被修改),则更新失败。

11. MyBatis-Plus的通用Service有什么作用?

与Mapper层的区别是什么?

答案: 通用Service作用 MP封装了

IService

接口和

ServiceImpl

实现类, 在Mapper层基础上进一步封装CRUD ,提供更丰富的批量操作、分页操作方法,简化Service层代码,无需手动编写基础CRUD的业务逻辑。

与Mapper层的核心区别 维度Mapper层(BaseMapper)Service层(IService) 封装粒度单条/批量CRUD,基础数据库操作更上层的业务操作,包含批量、分页、新增或更新等方法命名以insert/select/update/delete为前缀以save/remove/update/get/list/page为前缀事务支持无默认事务,需手动指定可结合@Transactional实现业务事务适用场景简单的数据库操作,底层数据访问业务层逻辑实现,整合多个Mapper操作 基础使用

​ // 1. 接口继承IService public interface UserService extends IService {} // 2. 实现类继承ServiceImpl,指定Mapper和实体类 @Service public class UserServiceImpl extends ServiceImpl implements UserService {} 12. MyBatis-Plus如何实现自定义SQL?

与原生MyBatis有什么区别?

答案: MP完全兼容原生MyBatis的自定义SQL写法, 无额外学习成本 ,核心步骤与MyBatis一致,适用于多表查询、复杂业务SQL等场景。

自定义SQL核心步骤 配置文件中指定XML映射文件路径

​ mybatis-plus: mapper-locations: classpath:mapper/*.xml # 扫描XML文件 type-aliases-package: com.xxx.pojo # 实体类别名 Mapper接口中定义自定义方法

​ @Mapper public interface UserMapper extends BaseMapper { // 自定义方法 List selectByAge(Integer age); } 编写对应的XML映射文件(与MyBatis语法完全一致)

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

与原生MyBatis的区别 MP的Mapper接口继承了

BaseMapper

,拥有通用CRUD方法, 无需重复编写基础SQL 自定义SQL的XML语法、接口调用方式与原生MyBatis完全一致,无缝兼容 13. MyBatis-Plus的代码生成器有什么作用?

核心能生成哪些代码?

答案: 作用 根据数据库表结构, 自动生成项目的基础代码 ,包括实体类、Mapper接口、XML映射文件、Service接口/实现类、Controller层,大幅减少重复的代码编写工作,提高开发效率。

核心生成的代码层 pojo/entity :实体类,自动添加注解(@TableName、@TableId等),支持Lombok mapper :Mapper接口(继承BaseMapper)、XML映射文件 service :IService接口、ServiceImpl实现类 controller :RestController层,自动生成基础的CRUD接口(支持Restful风格) 核心依赖

com.baomidou mybatis-plus-generator 3.4.1 org.apache.velocity velocity-engine-core 2.3

14. MyBatis-Plus中

CMD

ENTRYPOINT

的区别?

(结合容器化) 答案: CMD :容器启动时的 默认执行命令 ,可被命令行传入的参数覆盖,适用于需要灵活修改启动参数的场景 ENTRYPOINT :容器的 固定启动命令 ,不会被命令行参数覆盖,一定会执行,适用于固定启动逻辑的场景 常配合使用 :ENTRYPOINT + CMD,ENTRYPOINT定义核心启动命令,CMD作为默认参数,命令行参数可替换CMD的默认值 15. MyBatis-Plus如何配置日志?

作用是什么?

答案: 配置方式(Spring Boot.yml/properties)

​ mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出日志 作用 控制台打印执行的 SQL语句 、参数、执行结果、受影响行数 开发/测试阶段快速排查SQL问题(如字段名错误、条件拼接错误) 查看SQL执行效率,揪出慢查询,优化数据库操作 验证MP自动生成的SQL是否符合预期,便于调试

相关文章