mybatisplus架构影响(mybatisplus是什么)

本文目录
- mybatisplus是什么
- mybatis+创建文档实例错误
- MyBatis-Plus 使用这么方便,底层是如何处理的呢
- 改mybatis到mybatis-plus的擎天巨坑
- 工作中不推荐mybatisplus
mybatisplus是什么
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
建议可以看一下官网
MyBatis-Plus官网
mybatis+创建文档实例错误
如果您在使用MyBatis-Plus创建文档实例时出现错误,可能是以下几个方面导致的:
实体类没有继承父类Model
在使用MyBatis-Plus创建文档实例时,需要保证实体类继承了父类Model,例如:- csharpCopy codepublic class User extends Model《User》 { // ...}
实体类的属性没有添加@TableField注解
在实体类中需要添加@TableField注解,用于指定实体类的属性对应数据库表中的列名,例如:- kotlinCopy codepublic class User extends Model《User》 { @TableField("user_name")
- private String userName; // ...}
实体类的主键没有添加@TableId注解
在实体类中需要添加@TableId注解,用于指定实体类的主键对应数据库表中的主键列名,例如:- kotlinCopy codepublic class User extends Model《User》 { @TableId("id")
- private Long id; // ...}
缺少依赖
使用MyBatis-Plus创建文档实例需要依赖MyBatis-Plus和MyBatis框架,如果您没有正确添加这些依赖,可能会导致出现错误。请确保您的项目中正确添加了以下依赖:- phpCopy code《!-- MyBatis-Plus --》《dependency》
- 《groupId》com.baomidou《/groupId》
- 《artifactId》mybatis-plus-boot-starter《/artifactId》
- 《version》最新版本号《/version》《/dependency》《!-- MyBatis --》《dependency》
- 《groupId》org.mybatis《/groupId》
- 《artifactId》mybatis《/artifactId》
- 《version》最新版本号《/version》《/dependency》
如果您仍然无法解决问题,请提供更具体的错误信息或代码,以便更好地帮助您解决问题。
MyBatis-Plus 使用这么方便,底层是如何处理的呢
MyBatis-plus是完全基于MyBatis开发的一个增强工具,是在MyBatis的基础上做增强的框架,为简化开发、提高效率而生。
它在MyBatis原本的框架上增加了很多实用性功能,比如乐观锁插件、字段自动填充功能、分页插件、条件构造器、sql 注入器等等。使用 MyBatis-plus 可以完全不写任何 XML 文件,直接使用继承了BaseMapper 接口的类对象完成对数据库的映射操作
基于映射的原理,MyBatis-plus 必然要实现 Mapper中的方法与 SQL 语句的对应转化,以下即为 MyBatis-plus 重要流程图例
1.在 MyBatis-plus 中, MybatisPlusAutoConfiguration 自动配置类的 sqlSessionFactory() 方法为 Spring提供创建 sqlSession 的工厂类对象,对 sqlSessionFactory 进行定义的定义类变为了 MybatisSqlSessionFactoryBean 。
在 sqlSessionFactory() 方法中,除了注入 MyBatis本身的组件,还会注入MyBatis-plus 的 主键生成器、SQL 注入器等组件,最后通过 MybatisSqlSessionFactoryBean#getObject() 方法获取到 sqlSessionFactory 对象
2. MybatisSqlSessionFactoryBean#getObject() 执行懒加载策略,最后通过 buildSqlSessionFactory() 方法创建 SqlSessionFactory 工厂类对象。这个方法的流程很长,不过大致可以分为两个步骤:
3. MybatisXMLConfigBuilder#parse() 会去解析配置文件,最后会调用到其内部方法 mapperElement() 。这个方法完成解析 Mapper工作,并将其添加到配置类 MybatisConfiguration 中
4. MybatisConfiguration#addMapper() 方法其实是去调用 MybatisMapperRegistry#addMapper() 方法,其核心是 MybatisMapperAnnotationBuilder#parse()
5. MybatisMapperAnnotationBuilder#parse() 方法真正开始完成 Mapper 接口中的方法与 SQL 语句的映射,其中 parseStatement() 方法是解析 @Select/@Update 等注解写入的 SQL语句,而代码 GlobalConfigUtils.getSqlInjector(configuration).inspectInject(assistant, type ) 通过 MaBatis-plus的 SQL 注入器完成 Mapper 方法与 SQL 语句的转化
6. AbstractSqlInjector#inspectInject() 会完成 BaseMapper 接口中提供的通用方法对应的 SQL 语句准备,这部分主要通过 AbstractMethod#inject() 方法完成
7. AbstractMethod#inject() 方法并没有什么特别的操作,只是调用其子类实现 injectMappedStatement() 方法。以 SelectOne#injectMappedStatement() 为例,其 SQL 语句的核心在于 SqlMethod 类,这个枚举类中缓存了可以动态拼接的 SQL 语句脚本,只需要填上参数 format 就可以得到 SQL 语句的执行脚本。
以上过程结束,只需要将所有信息通过 addInsertMappedStatement() 方法封装成 MappedStatement 对象并将其加入到容器中,这样 Mapper接口方法调用时,就可以通过 动态代理 的方式找到其对应执行的 SQL 脚本,至此 SQL 语句准备及配置解析就完成了。
最后拼接的 SQL 语句 脚本形式如下示例,实际执行数据库操作时会解析这个脚本完成变量替换,从而得到可执行的 SQL 语句
8. SqlSessionFactory 对象的创建需要回到 MybatisSqlSessionFactoryBean#buildSqlSessionFactory() 方法中,很容易追踪到 MybatisSqlSessionFactoryBuilder#build() 方法,最后其实是通过 SqlSessionFactoryBuilder#build() 方法创建了一个 DefaultSqlSessionFactory 对象返回
1. @MapperScan 注解通过 @Import(MapperScannerRegistrar.class) 引入扫描注册的类 MapperScannerRegistrar ,该类实现了 ImportBeanDefinitionRegistrar 接口并重写 registerBeanDefinitions() 方法,在该方法中注册了 MapperScannerConfigurer 类
2. MapperScannerConfigurer 是 Mapper接口的扫描配置类,实现了 BeanDefinitionRegistryPostProcessor 接口,其 postProcessBeanDefinitionRegistry() 方法会在容器启动过程中被回调,通过 ClassPathMapperScanner#scan() 方法完成 Mapper 的扫描注册
3. ClassPathMapperScanner#processBeanDefinitions() 将扫描到的 Mapper接口生成的对应 BeanDefinition 的 beanClass 属性替换为 MapperFactoryBean ,这样每次获取 Mapper 实例实际是通过 MapperFactoryBean 的实例去获取
此处体现了 FactoryBean 的定位,即用于获取同一类 bean 的工厂 bean。
4. @Autowired 自动注入 Mapper 触发容器获取 bean 的方法,调用到 MapperFactoryBean#getObject() 方法,最终调用到 sqlSessionTemplate#getMapper() 方法
5.MyBatis-plus 使用的配置类是 MybatisConfiguration ,最终调用到 MybatisMapperRegistry#getMapper() 方法,这里就进入了动态代理获取 MapperProxy 实例的流程
6. MybatisMapperProxyFactory#newInstance() 方法给自动注入返回一个 MybatisMapperProxy 代理对象
7.调用 Mapper 接口的方法触发代理对象的 MybatisMapperProxy#invoke() ,此时根据 Mapper 对象被调用的方法生成 MybatisMapperMethod 对象,通过 MybatisMapperMethod#execute() 去真正地执行 SQL 语句,从而完成数据库操作。
改mybatis到mybatis-plus的擎天巨坑
兄弟们!mybatis-plus是号称对mybatis本身无侵入的一种加强版。
但是当你引入它的时候,可能会广泛踩坑。接下来给大家看看我的踩坑历史。
第一坑:当你选择的是 mybatis-spring-boot-starter + mybatis-plus 引入时
pom依赖如下:
这样。其实,你的mybatis还是你曾经的mybatis,只是附加了一些功能。但是,当你开始配置yml文件的时候,诸多小白(如我),可能会直接将一些属性配置直接替换到mybatis-plus之下。
如:
血泪的教训!!!
其实,yml已经很好心地提醒了你,比如打 mybatis-plus 之后没有属性提示信息,属性高亮黄色等等,但是你的配置很可能就是直接CL复制过来的,所以完全不会注意到。
那么此时请记住,现在你的 mybatis-plus 是没有 mybatis 基础文件的大哥们!!!你们是两个包!!!你不是直接引入的 mybatis-plus-boot-starter 的!!!
因此,该配置在mybatis下的,一个都不能少。比如,驼峰映射。
如果你像我这么配置,明明打开了驼峰映射 map-underscore-to-camel-case: true 但是鉴于它不是有效的配置,所以它是不会生效的。
当你纠结为啥你获取到的参数都是null的时候,花费了N个小时之后,终于觉得可能是驼峰映射的问题的时候,一个断点打进来。
哟嚯,发现了!这个配置是关闭的哦!
所以需要在 mybatis 下保留其基础配置。
如下:
但这样就没法直接在yml中操作 mybatis-plus 了。
第二坑:当你觉得附和两个包太过麻烦,而且无法配置mybatis-plus的属性打算直接引入 mybatis-plus-boot-starter 时
请记住一定要排除掉 mybatis-spring-boot-starter 这个包,不然很可能会有jar包版本冲突。
mybatis造成的启动时版本冲突bug示例
因此,我们直接这样导入包即可
然后配置文件就可以全部转到 mybatis-plus 下
如下:
其实yml真的已经尽力了!如果你真的已经引入了starter包,它的提示就是会生效的配置!
工作中不推荐mybatisplus
具体看公司和项目。
能不能用到得看公司和项目,不是很大的新项目可能会考虑用mybatis-plus,上手简单。稍大点儿的项目用着挺难受的,有坑且拓展定制灵活度不够。
MyBatis-plus是一款Mybatis增强工具,用于简化开发,提高效率。优点:无侵入,只做增加不做改变,引入它对工程无影响;损耗小,启动时会自动注入基本CRUD操作,性能基本无损耗,直接面向对象;强大的CRUD操作,内置Mapper、Service,只需简单少量配置就可以实现对单表大量的CRUD操作,更有强大的条件构造器,满足各类使用需求;内置代买生成器,采用代码或者maven插件,就可以快速生成Mapper、model、service、controller多层代码;支持模板引擎,有更多许多自定义配置使用;内置分页插件,myabyis基于数据库的基本物理分页,开发者无需担心各类操作问题,只要做好简单啊配置,就可以实现分页查询;内置全局拦截插件,提供全表delete,update操作分析阻断策略,也可以自定义拦截规则,预防错误操作。缺点:项目引入第三方插件包,未来升级有一定的兼容性问题;社区技术迭代行快,从而会导致有效部分技术文档得不到及时更新。

更多文章:
js 数组map(js中以(_,1)做为传给map遍历函数的参数是什么意思)
2026年8月5日 21:00
background属性可以继承吗(CSS中的color\background-color有什么区别)
2025年11月29日 17:30
js jquery面试(jquery中怎么调用js方法调用)
2025年8月8日 03:45
evaluate带文字求值(Excel表格的单元格中有文字,以及多组数据,如何自动计算公式)
2026年2月26日 16:45
网页如何控制wordpress的侧栏显示内容?系统的数据处理的功能有哪些
2025年12月10日 12:30
perl读取文件(perl中怎么获取当前pl文件所在文件夹)
2026年1月17日 18:45
安装instantclient(instantclient-basic-win64-11.2.0.1.0怎么安装)
2025年10月11日 06:45
java中xml文件是干什么的(java开发,你在项目中哪些地方用到了XML)
2025年10月11日 01:00
divisional是什么意思(under one’s command是什么意思)
2025年9月8日 04:30
css游戏按钮(CSS一按WASD键就(CS起源游戏问题!!))
2026年6月29日 12:45
怎么看php是否加密(PHP如何判断RAR文件是否已经加密)
2026年8月30日 04:30
duplicate sample(酶标仪怎么设置三个重复样品)
2025年11月3日 14:45
window telnet服务打不开(如何开启telnet服务)
2025年10月27日 03:30
plc梯形图100实例详解pdf(红绿灯的plc程序和梯形图求)
2026年3月12日 01:15
shell递归遍历文件夹(shell脚本文件夹内文件依次执行)
2025年8月28日 06:30
seek doing(用seek doing造句 表示要求做)
2026年2月4日 13:15







