Mybatis_Plus_1
Mybatis-Plus
1. 了解Mybatis-Plus
1.1 Mybatis-Plus介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网:https://mybatis.plus/ 或 https://mp.baomidou.com/
1.2 代码以及文档
文档地址:https://mybatis.plus/guide/
源码地址:https://github.com/baomidou/mybatis-plus
1.3 特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
- 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击
1.1 架构
1.5 作者
Mybatis-Plus是由baomidou(苞米豆)组织开发并且开源的,目前该组织大概有30人左右。
码云地址:https://gitee.com/organizations/baomidou
2. 快速开始
对于Mybatis整合MP有常常有三种用法,分别是Mybatis+MP、Spring+Mybatis+MP、Spring Boot+Mybatis+MP。
2.1 创建数据库
2.2 创建工程
创建一个名为itcast-mybatis-plus的maven工程
导入pom依赖
2.3 Mybatis + MP
通过纯Mybatis与Mybatis-Plus整合。
2.3.1 创建子Module
itcast-mybatis-plus-simple
添加log4j.properties
2.4 Mybatis实现查询User
1.编写mybatis-config.xml配置文件
2.编写User实体对象
3.编写UserMapper接口
4.编写UserMapper.xml
5.编写测试类
2.5 Mybatis+MP实现查询User
1.将UserMapper继承BaseMapper,将拥有了BaseMapper中的所有方法:
2.使用MP中的MybatisSqlSessionFactoryBuilder进程构建
3.在User对象中添加@TableName,指定数据库表名
2.6 Spring + Mybatis + MP
引入了Spring框架,数据源、构建等工作就交给了Spring管理。
2.6.1 创建module
itcast-mybatis-plus-spring
导入pom文件
2.编写jdbc.properties
3.编写applicationContext.xml
4.编写User对象以及UserMapper接口
5.编写测试用例
2.7 SpringBoot + Mybatis + MP
使用SpringBoot将进一步的简化MP的整合,需要注意的是,由于使用SpringBoot需要继承parent,所以需要重新创建工程,并不是创建子Module。
2.7.1 创建SpringBoot工程
1.创建itcast-mp-springboot
导入依赖
2.编写log4j.properties
3.编写application.properties
4.编写编写pojo
5.编写mapper
6.编写启动器
7.编写测试类
3. 通用CRUD
通过前面的学习,我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作,接下来我们将详细讲解这些操作。
3.1 插入操作
3.1.1 方法定义
3.1.2 写测试案例
测试结果:成功插入一条数据
注意事项:如果想要数据库字段自增,需要加@TableId
@TableField
在MP中通过TableField注解可以指定字段的一些属性,常常解决的问题有2个
1.对象中的属性名与字段名不一致的问题
2.对象中的属性字段在表中不存在的问题
3.2 更新操作
在MP中,更新操作有2种,一种是根据id更新,另一种是根据条件更新。
3.2.1 根据id更新
方法定义:
测试:
测试结果:修改成功
3.2.2 根据条件更新
方法定义:
测试用例:
测试结果:修改成功
3.3 删除操作
3.3.1 deleteById
方法定义:
测试用例:
执行结果:删除成功
3.3.2 deleteByMap
方法定义:
测试用例:
执行结果:删除成功
3.3.3 delete
方法定义:
测试用例:
3.3.4 deleteBatchIds
方法定义:
测试用例:
3.4 查询操作
MP提供了多种查询操作,包括根据id查询、批量查询、查询单条数据、查询列表、分页查询等操作。
3.4.1 selectById
方法定义:
测试用例:
3.4.2 selectBatchIds
方法定义:
测试用例:
3.4.3 selectOne
方法定义:
测试用例:
3.4.5 selectCount 查询数据条数
方法定义:
测试用例:
3.4.5 selectList
方法定义:
测试用例:
3.4.6 selectPage
方法定义:
配置分页插件:
测试用例:
3.5 SQL注入的原理
前面我们已经知道,MP在启动后会将BaseMapper中的一系列的方法注册到meppedStatements中,那么究竟是如何注入的呢?流程又是怎么样的?下面我们将一起来分析下。
在MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类,实现关系如下:
在AbstractSqlInjector中,主要是由inspectInject()方法进行注入的,如下:
在实现方法中,methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
是关键,循环遍历方法,进行注入。
最终调用抽象方法injectMappedStatement进行真正的注入:
查看该方法的实现:
以SelectById为例查看:
可以看到,生成了SqlSource对象,再将SQL通过addSelectMappedStatement方法添加到meppedStatements中。
__EOF__

本文链接:https://www.cnblogs.com/he-peng/p/mybatis_plus_20220308.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库