Plus是如何成功灵活SQL语句的 Mybatis 原理你懂吗 (plus?)

Plus是如何成功灵活SQL语句的 Mybatis 原理你懂吗 (plus?)

本文目录导航:

Mybatis Plus是如何成功灵活SQL语句的?原理你懂吗?

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎样增强的呢?其实就是它曾经封装好了一些crud方法,开发就不须要再写xml了,间接调用这些方法就行,就相似于JPA。

那么这篇文章就来浏览以下MP的详细成功,看看是怎样成功这些增强的。

入口类:MybatisSqlSessionFactoryBuilder

经过在入口类 MybatisSqlSessionFactoryBuilder#build方法中, 在运行启动时, 将MyBatis plus(简称MP)自定义的灵活性能xml文件注入到Mybatis中。

publicclassMybatisSqlSessionFactoryBuilderextendsSqlSessionFactoryBuilder{publicSqlSessionFactorybuild(Configurationconfiguration){//...省略若干行if(()){newSqlRunnerInjector()(configuration);}//...省略若干行returnsqlSessionFactory;}}

这里触及到2个MP2特性能类

裁减承袭自Mybatis的MybatisConfiguration类: MP灵活脚本构建,注册,及其它逻辑判别。

SqlRunnerInjector: MP自动拔出一些灵活方法的xml 脚本方法。

MybatisConfiguration类

这里咱们重点剖析MybatisConfiguration类,在MybatisConfiguration中,MP初始化了其自身的MybatisMapperRegistry,而MybatisMapperRegistry是MP加载自定义的SQL方法的注册器。

MybatisConfiguration中很多方法是经常使用MybatisMapperRegistry启动重写成功

其中有3个重载方法addMapper成功了注册MP灵活脚本的性能。

publicclassMybatisConfigurationextendsConfiguration{/***Mapper注册*/protectedfinalMybatisMapperRegistrymybatisMapperRegistry=newMybatisMapperRegistry(this);//..../***初始化调用*/publicMybatisConfiguration(){super();=true;();}/***MybatisPlus加载SQL顺序:*<p>1、加载XML中的SQL</p>*<p>2、加载SqlProvider中的SQL</p>*<p>3、XmlSql与SqlProvider不能蕴含相反的SQL</p>*<p>调整后的SQL优先级:XmlSql>sqlProvider>CurdSql</p>*/@OverridepublicvoidaddMappedStatement(MappedStatementms){//...}//...省略若干行/***经常使用自己的MybatisMapperRegistry*/@Overridepublic<T>voidaddMapper(Class<T>type){(type);}//....省略若干行}

在MybatisMapperRegistry中,MP将mybatis的MapperAnnotationBuilder交流为MP自己的MybatisMapperAnnotationBuilder

publicclassMybatisMapperRegistryextendsMapperRegistry{@Overridepublic<T>voidaddMapper(Class<T>type){//...省略若干行MybatisMapperAnnotationBuilderparser=newMybatisMapperAnnotationBuilder(config,type);();//...省略若干行}}

在MybatisMapperRegistry类的addMapper方法中,真正进入到MP的外围类MybatisMapperAnnotationBuilder,MybatisMapperAnnotationBuilder这个类是MP成功灵活脚本的关键类。

MybatisMapperAnnotationBuilder灵活结构

在MP的外围类MybatisMapperAnnotationBuilder的parser方法中,MP逐个遍历要加载的Mapper类,加载的方法包括上方几个

publicclassMybatisMapperAnnotationBuilderextendsMapperAnnotationBuilder{@Overridepublicvoidparse(){//...省略若干行for(()){/**for循环代码,MP判别method方法能否是@Select@Insert等mybatis注解方法**/parseStatement(method);(cache,mapperName,method);(mapperName,method);}/**这2行代码,MP注入自动的方法列表**/if((configuration,type)){(configuration)(assistant,type);}//...省略若干行}@OverridepublicvoidinspectInject(MapperBuilderAssistantbuilderAssistant,Class<?>mapperClass){Class<?>modelClass=extractModelClass(mapperClass);//...省略若干行List<AbstractMethod>methodList=(mapperClass);TableInfotableInfo=(builderAssistant,modelClass);//循环注入自定义方法(m->(builderAssistant,mapperClass,modelClass,tableInfo));(className);}}publicclassDefaultSqlInjectorextendsAbstractSqlInjector{@OverridepublicList<AbstractMethod>getMethodList(Class<?>mapperClass){(newInsert(),//...省略若干行newSelectPage())(toList());}}

在MybatisMapperAnnotationBuilder中,MP真正将框架自定义的灵活SQL语句注册到Mybatis引擎中。

而AbstractMethod则实行了详细方法的SQL语句结构。

详细的AbstractMethod实例类,结构详细的方法SQL语句

以 SelectById 这个类为例说明下

/***依据ID查问一条数据*/publicclassSelectByIdextendsAbstractMethod{@OverridepublicMappedStatementinjectMappedStatement(Class<?>mapperClass,Class<?>modelClass,TableInfotableInfo){/**定义mybatisxmlmethodid,对应<id=xyz>**/SqlMethodsqlMethod=_BY_ID;/**结构id对应的详细xml片段**/SqlSourcesqlSource=newRawSqlSource(configuration,((),sqlSelectColumns(tableInfo,false),(),(),(),(true,true)),);/**将xmlmethod方法减少到mybatis的MappedStatement中**/(mapperClass,getMethod(sqlMethod),sqlSource,tableInfo);}}

至此,MP成功了在启动时加载自定义的方法xml性能的环节,前面的就是mybatis ${变量} #{变量}的灵活交流和预编译,曾经进入mybatis自有性能。

总结一下

MP总共改写和交流了mybatis的十多个类,重要如下图所示:

总体过去说,MP成功mybatis的增强,手腕略显繁琐和不够直观,其实依据MybatisMapperAnnotationBuilder结构出自定义方法的xml文件,将其转换为mybatis的Resource资源,可以只承袭重写一个Mybatis类:SqlSessionFactoryBean 比如如下:

publicclassYourSqlSessionFactoryBeanextendsSqlSessionFactoryBeanimplementsApplicationContextAware{privateResource[]mapperLocations;@OverridepublicvoidsetMapperLocations(){(mapperLocations);/**暂存经常使用mybatis原生定义的mapperxml文件门路**/=mapperLocations;}/***{@inheritDoc}*/@OverridepublicvoidafterPropertiesSet()throwsException{ConfigurableListableBeanFactorybeanFactory=getBeanFactory();/**只有要经过将自定义的方法构形成xmlresource和原生定义的Resource一同注入到mybatis中即可,这样就可以成功MP的自定义灵活SQL和原生SQL的共生相关**/((,beanFactory,));();}}

在这边文章中,方便引见了MP成功灵活语句的成功环节,并且给出一个或者的更方便方法。

为什么mybatisplus这么好用,反而用的不多?

为什么Mybatis-plus虽然好用,却经常使用不多?Mybatis-plus,作为Mybatis的增强工具,初衷是简化开发、提高效率。

它具备如下特点:首先,它是对Mybatis的轻量级增强,引入后对现有工程影响微不足道,操作流利。

其次,以效率为外围,极速成功单表CRUD,节俭期间。

此外,性能丰盛,涵盖代码生成、智能分页、逻辑删除等适用性能。

虽然Mybatis-plus有诸多好处:无侵入式设计,只有Mybatis和MyBatis-Spring的大批依赖;启动时基本无损耗,提供面向对象操作;内置SQL注入包全;支持多种主键战略和热加载(3.1.0版本后或者不再支持);Active Record形式的方便集成;代码生成器让开发极速;还支持自定义全局操作和关键词转义。

但是,它的疑问在于适度简化,或者造成代码复用性降落和档次结构不清。

在实践运行中,虽然Mybatis-plus能让代码看起来更繁复,但过于依赖或者造成服务层和数据访问层职责混杂,不利于保养和审核SQL逻辑。

关于复杂场景,尤其是触及多表操作,倡导坚持传统的三层架构(Controller、Service、DAO),以确保代码的明晰性和可保养性。

因此,虽然Mybatis-plus在繁多表操作上极具吸引力,但在大规模名目开发中,经常使用需审慎思考其常年影响。

mybatisplus比mybatis究竟好在哪里?

传统 MyBatis 开发中,手动性能 SQL 映射文件和编写 SQL 语句,关于复杂查问有其必要性,但关于方便的 CRUD 操作显得繁琐费时。

因此,能否能有一款框架能处置这一疑问,提供智能生成方便 SQL 性能同时支持自定义 SQL 设置?答案是必需的,这就是 MyBatis Plus 的降生。

MyBatis Plus 是一款专为简化 MyBatis 开发中 SQL 手动映射性能繁琐疑问而设计的框架,它在 MyBatis 的基础上提供丰盛的 API,旨在简化开发,提高效率。

接上去,咱们将经过代码实例展现 MyBatis Plus 的便利性。

首先,须要导入 MyBatis Plus 的相关依赖。

在数据库中构建表结构后,借助 BaseMapper 接口,咱们可以轻松成功 CRUD 操作,而无需手动编写 SQL 语句。

BaseMapper 外部封装了少量罕用 CRUD 函数,简化了操作。

接上去,咱们展现如何应用 MyBatis Plus 的性能来成功拔出、删除、降级和查问等操作。

以拔出操作为例,BaseMapper 提供的封装性能准许咱们间接调用已定义的拔出语句,无需手动编写。

关于删除操作,雷同只有调用预约义的函数即可。

降级操作时,MyBatis Plus 提供了 EntityWrapper 类来简化查问参数的注入,防止了繁琐的 SQL 拼接。

此外,MyBatis Plus 支持经常使用 Entity 对象启动关键字查问,经常使用 Map 启动多关键字查问,以及统计查问、分页查问等初级性能。

它还兼容原有的 MyBatis XML 和注解形式的 SQL 拼写,提供更丰盛的 CRUD 操作性能。

MyBatis Plus 的设计融合了 MyBatis 和 Hibernate 的好处,既提供了 Hibernate 式的单表 CRUD 操作便利性,又保管了 MyBatis 的特性。

它的产生极大地优化了与 MyBatis 搭配下的开发效率,被笼统地比喻为魂斗罗中的两兄弟,基友搭配,效率翻倍。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

25阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读