mybatisplus架构影响(mybatisplus是什么)

2025-09-29 17:00:01 :0

mybatisplus架构影响(mybatisplus是什么)

今天给各位分享mybatisplus是什么的知识,其中也会对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操作分析阻断策略,也可以自定义拦截规则,预防错误操作。缺点:项目引入第三方插件包,未来升级有一定的兼容性问题;社区技术迭代行快,从而会导致有效部分技术文档得不到及时更新。

关于mybatisplus架构影响到此分享完毕,希望能帮助到您。

mybatisplus架构影响(mybatisplus是什么)

本文编辑:admin

更多文章:


mdi窗体控件(关于MDI窗体,下列说法正确的是(  ))

mdi窗体控件(关于MDI窗体,下列说法正确的是(  ))

今天给各位分享关于MDI窗体,下列说法正确的是(  )的知识,其中也会对关于MDI窗体,下列说法正确的是(  )进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录关于MDI窗体,下列说法正确的是(  )MDI类型

2026年5月20日 17:00

js 数组map(js中以(_,1)做为传给map遍历函数的参数是什么意思)

js 数组map(js中以(_,1)做为传给map遍历函数的参数是什么意思)

“js 数组map”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看js 数组map(js中以(_,1)做为传给map遍历函数的参数是什么意思)!本文目录js中以(_,1)做为传给map遍历函数的参数是什么意思JS map函数

2026年8月5日 21:00

round函数书写格式(excel中round函数)

round函数书写格式(excel中round函数)

本篇文章给大家谈谈round函数书写格式,以及excel中round函数对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录excel中roun

2026年8月15日 18:15

background属性可以继承吗(CSS中的color\background-color有什么区别)

background属性可以继承吗(CSS中的color\background-color有什么区别)

其实background属性可以继承吗的问题并不复杂,但是又很多的朋友都不太了解CSS中的color\background-color有什么区别,因此呢,今天小编就来为大家分享background属性可以继承吗的一些知识,希望可以帮助到大家

2025年11月29日 17:30

excel vba教程 多表筛选导出(如何用VBA将同一个文件夹下所有EXCEL表中的所有sheet表的数据导出到一个EXCEL中)

excel vba教程 多表筛选导出(如何用VBA将同一个文件夹下所有EXCEL表中的所有sheet表的数据导出到一个EXCEL中)

大家好,今天小编来为大家解答以下的问题,关于excel vba教程 多表筛选导出,如何用VBA将同一个文件夹下所有EXCEL表中的所有sheet表的数据导出到一个EXCEL中这个很多人还不知道,现在让我们一起来看看吧!本文目录如何用VBA将

2026年5月3日 12:30

js jquery面试(jquery中怎么调用js方法调用)

js jquery面试(jquery中怎么调用js方法调用)

这篇文章给大家聊聊关于js jquery面试,以及jquery中怎么调用js方法调用对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录jquery中怎么调用js方法调用js与Jquery的区别是什么请问会html,div+css

2025年8月8日 03:45

evaluate带文字求值(Excel表格的单元格中有文字,以及多组数据,如何自动计算公式)

evaluate带文字求值(Excel表格的单元格中有文字,以及多组数据,如何自动计算公式)

“evaluate带文字求值”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看evaluate带文字求值(Excel表格的单元格中有文字,以及多组数据,如何自动计算公式)!本文目录Excel表格的单元格中有文字,以及多组数据,

2026年2月26日 16:45

网页如何控制wordpress的侧栏显示内容?系统的数据处理的功能有哪些

网页如何控制wordpress的侧栏显示内容?系统的数据处理的功能有哪些

“标签云网站”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看网页如何控制wordpress的侧栏显示内容?系统的数据处理的功能有哪些!本文目录网页如何控制wordpress的侧栏显示内容系统的数据处理的功能有哪些为什么百度不

2025年12月10日 12:30

perl读取文件(perl中怎么获取当前pl文件所在文件夹)

perl读取文件(perl中怎么获取当前pl文件所在文件夹)

今天给各位分享perl中怎么获取当前pl文件所在文件夹的知识,其中也会对perl中怎么获取当前pl文件所在文件夹进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录perl中怎么获取当前pl文件所在文件夹用perl

2026年1月17日 18:45

安装instantclient(instantclient-basic-win64-11.2.0.1.0怎么安装)

安装instantclient(instantclient-basic-win64-11.2.0.1.0怎么安装)

这篇文章给大家聊聊关于安装instantclient,以及instantclient-basic-win64-11.2.0.1.0怎么安装对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录instantclient-basic-

2025年10月11日 06:45

java中xml文件是干什么的(java开发,你在项目中哪些地方用到了XML)

java中xml文件是干什么的(java开发,你在项目中哪些地方用到了XML)

本篇文章给大家谈谈java中xml文件是干什么的,以及java开发,你在项目中哪些地方用到了XML对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录java开发,你在项目中哪些地方用到了XMLjava和xml什么关系XML文档是

2025年10月11日 01:00

divisional是什么意思(under one’s command是什么意思)

divisional是什么意思(under one’s command是什么意思)

其实divisional是什么意思的问题并不复杂,但是又很多的朋友都不太了解under one’s command是什么意思,因此呢,今天小编就来为大家分享divisional是什么意思的一些知识,希望可以帮助到大家,下面我们一起来看看这个

2025年9月8日 04:30

css游戏按钮(CSS一按WASD键就(CS起源游戏问题!!))

css游戏按钮(CSS一按WASD键就(CS起源游戏问题!!))

各位老铁们,大家好,今天由我来为大家分享css游戏按钮,以及CSS一按WASD键就(CS起源游戏问题!!)的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本

2026年6月29日 12:45

怎么看php是否加密(PHP如何判断RAR文件是否已经加密)

怎么看php是否加密(PHP如何判断RAR文件是否已经加密)

这篇文章给大家聊聊关于怎么看php是否加密,以及PHP如何判断RAR文件是否已经加密对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录PHP如何判断RAR文件是否已经加密这种php代码是用什么加密的怎么破PHP如何判断RAR文件

2026年8月30日 04:30

shelly英文名的意思(shelly英文名的意思是什么)

shelly英文名的意思(shelly英文名的意思是什么)

“shelly英文名的意思”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看shelly英文名的意思(shelly英文名的意思是什么)!本文目录shelly英文名的意思是什么shelly什么意思女生英文名shelly寓意是什么

2026年7月19日 14:00

duplicate sample(酶标仪怎么设置三个重复样品)

duplicate sample(酶标仪怎么设置三个重复样品)

本篇文章给大家谈谈duplicate sample,以及酶标仪怎么设置三个重复样品对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录酶标仪怎么

2025年11月3日 14:45

window telnet服务打不开(如何开启telnet服务)

window telnet服务打不开(如何开启telnet服务)

本篇文章给大家谈谈window telnet服务打不开,以及如何开启telnet服务对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录如何开启telnet服务win7系统telnet客户端安装后不能使用的解决方法telnet命令

2025年10月27日 03:30

plc梯形图100实例详解pdf(红绿灯的plc程序和梯形图求)

plc梯形图100实例详解pdf(红绿灯的plc程序和梯形图求)

各位老铁们好,相信很多人对plc梯形图100实例详解pdf都不是特别的了解,因此呢,今天就来为大家分享下关于plc梯形图100实例详解pdf以及红绿灯的plc程序和梯形图求的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年3月12日 01:15

shell递归遍历文件夹(shell脚本文件夹内文件依次执行)

shell递归遍历文件夹(shell脚本文件夹内文件依次执行)

大家好,今天小编来为大家解答以下的问题,关于shell递归遍历文件夹,shell脚本文件夹内文件依次执行这个很多人还不知道,现在让我们一起来看看吧!本文目录shell脚本文件夹内文件依次执行解决shell脚本遍历带空格的文件/文件夹名she

2025年8月28日 06:30

seek doing(用seek doing造句 表示要求做)

seek doing(用seek doing造句 表示要求做)

各位老铁们,大家好,今天由我来为大家分享seek doing,以及用seek doing造句 表示要求做的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文

2026年2月4日 13:15

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索