1.element-plus源码学习日志-03
2.Mybatis-plus分页原理
3.Mybatis-plus使用TableNameHandler分表详解(附完整示例源码)
4.MyBatis-Plus代码生成器(3.5.1版本)
5.一起来学Mybatis 源码Plus(八) & 自定义插件开发
6.关于mybatis-plus中Service和Mapper的分析
element-plus源码学习日志-03
在element-plus的源码探索系列中,今天的讲解重点转向了Dialog组件和Vue3的新特性。首先,源码我们来到element-plus\packages\dialog\src\index.vue,讲解研究内置的源码teleport组件。
teleport是讲解macos 编译qemu源码个强大的工具,它能让原本作为子组件的源码DOM元素,通过to属性的讲解指定,直接定位到应用的源码同级节点,甚至body下。讲解这对于解决层级问题,源码特别是讲解实现全局弹层时,非常重要。源码在Vue2时代,讲解我们曾用Vue.extend来创建并挂载在顶层的源码自定义组件,teleport简化了这一过程。
接着,我们注意到vue3的自定义指令有所更新,涉及生命周期的变动。虽然具体细节还未详尽理解,但官方文档的说明有待后续深入研究。由于vue3支持fragments,组件不再受限于单一节点,这带来了新的挑战,目前暂存疑问。
在代码部分,我们回顾了之前讲解过的内容,通过实际例子,复习了相关知识。今天的收获包括对teleport的深入理解,以及对新版本自定义指令的初步接触。
最后,计划在下篇中,我们将学习如何基于Jest为组件编写单元测试,APP 小游戏 源码包括基本用法和测试报告的生成,这是框架开发中的关键步骤。
Mybatis-plus分页原理
为了深入了解 MyBatis-Plus 的分页原理,首先需要引入 MyBatis-Plus 的相关依赖。在项目的配置文件中添加如下依赖配置: 紧接着,创建配置类或在 Spring 的配置文件中定义配置 bean,以初始化 MyBatis-Plus 的核心组件。 在实现 MyBatis-Plus 的分页功能时,关键在于其拦截器机制。当执行 SELECT 类型的 SQL 语句时,MyBatis-Plus 会检查是否包含 rowBounds 参数。如果存在 rowBounds 对象,系统会判断是否需要进行分页处理。 具体实现步骤如下: 首先,拦截器会检查 rowBounds 是否包含分页信息。如果包含,会进一步判断 pageSize 的大小。如果 pageSize 为负数或为 0,则直接返回结果集。若 pageSize 大于 0,则继续处理。 对于单页条数限制,拦截器会调用 handlerLimit 方法处理。接着,从 BoundSql 中获取原始 SQL 语句,并对数据库连接进行初始化。 针对分页查询,拦截器会判断是否开启优化查询计数功能。如果开启,将使用 JSqlParser 对原始 SQL 进行优化,并调用 queryTotal 方法执行计数查询,将结果存储到 page 对象中。 随后,大圣彩票源码调用 concatOrderBy 方法对自定义排序进行处理。接着,根据数据库方言类型构建分页 SQL,通过方言工厂生成分页 SQL 语句。最后,执行 SQL 查询,通常通过 invocation.proceed() 方法调用。 总结分页原理的关键步骤:通过 page 对象获取分页信息。
利用 count 查询优化获取总记录数。
在原始 SQL 中添加 LIMIT 子句实现分页。
实现过程中,有一个 setConsumerChain 方法,其具体功能需要进一步查阅源码以明确。 MyBatis-Plus 的分页机制依赖于其拦截器和 SQL 优化逻辑,通过参数的传递和 SQL 的动态构建,实现了灵活且高效的分页功能。Mybatis-plus使用TableNameHandler分表详解(附完整示例源码)
为何要分表
MySQL作为互联网系统中广泛应用的关系型数据库,具备ACID特性,然而,其单表性能受限于数据量,主要原因是B+树索引过大导致查询时索引无法完全加载到内存,磁盘读取频率增加,严重影响性能。分表成为解决策略之一,即将大量数据分布在多个表中,减少B+树索引大小,降低磁盘读取次数,提升性能。
基础分表逻辑详解
分表方式有两类常见方案:按日期分表与按ID取模分表。
按日期分表
通常在表名后添加年月日,适合用于存储按日期划分的统计数据或操作记录。在线展示仅需最近表中的数据,其余用于离线统计。17代练源码
按ID取模分表
需ID生成器,如snowflake或分布式ID服务,保证相同ID的数据在同一表中。适用于保存用户基本信息、系统资源信息、购买记录等。此方式扩展性较差,数据增长后需进行分库再分表处理。
Mybatis-plus中的分表实现
Mybatis-plus提供内置分表方案,配置简便,适用于快速开发。
动态表名处理器
Mybatis-plus引入TableNameHandler接口实现动态表名生成,无需额外引入jar包,学习成本低。根据需求选择表名处理器,灵活定义生成规则。
示例实现
示例分为按日期和按ID取模两种分表方式,分别通过四个步骤实现。
创建日期表名处理器
实现动态表名生成逻辑,返回查询时使用的表名。
创建ID取模表名处理器
实现相对复杂,需要动态传入用于分表的ID值。新版本已优化,简化传参方式,避免使用MetaObject,使用其他方法传入参数。
使用ThreadLocal管理参数
为解决多线程参数修改问题,使用ThreadLocal定义参数,确保每次请求独立。
加载表名处理器
作为Mybatis-plus插件,初始化时创建实例并加载,实现分表逻辑。
在Controller中使用
通过Controller接口展示具体使用方法,diy个性定制 源码集成分表逻辑。
总结
Mybatis-plus动态表名处理器提供了灵活定义表名生成规则的方案,支持按实际情况调整分表逻辑,促进性能优化。实际项目中需根据业务需求选择合适分表策略,并注意参数管理,确保系统稳定运行。
MyBatis-Plus代码生成器(3.5.1版本)
MyBatis-Plus(简称 MP)是Mybatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性:pom配置,依赖准备好后,创建Java类,在main()方法中:配置连接mysql数据库信息+调用自动生成API并设置各类参数,根据自定义策略,执行自动生成代码操作。这里新建一个MpGenerator.java,提供主方法main()。
templateConfig我禁用了MP提供的模板,设置成了自己定义的。先看下MP自带的模板。
包路径,一共支持三种引擎,Velocity对应vm后缀;Beetl对应btl后缀;Freemarker对应ftl后缀
MP自带的模板service,controller等太简单,只是一个文件并没有提供增删改查功能,可以自己配置一个模板替换到自带的。就需要在templateConfig中配置一下。(自带的模板就不贴代码了,有兴趣的自己看一下)
拿controller举例,贴一下我自己配置的。
其实就是把增删改查的外壳设置好,把参数配置成动态的。$ 里面这些参数是哪里来的呢?接下来分析一下
由于我用的是Velocity,看一下它的引擎源码
一共4个方法,看名字大概分析一下,大概率是writer这个方法是主要功能,接下来断点看一下。
模板中配置的动态参数,都是从objectMap取的。
table数据格式,可以看到生成的entity,mapper,service,controller名称,fields取的数据库中字段信息。
是否为主键,字段类型,名称等等。可以根据这些参数来配置我们需要的模板样式。
如果objectMap中的参数不满足我们的要求,可以自己写一个引擎继承VelocityTemplateEngine重写他的writer方法。
我把主键的信息单独取出来了,避免每次循环调用。
自定义配置模板文件,根据MP提供的功能,可以生成entity,mapper,mapperXML,service,serviceImpl,controller。我们可能还需要用到BO,VO等,这时候就需要自定义配置模板了。
模板的定义跟上面说的一样。
简单记录一下自己使用过程的学习,大家有啥想法互相学习。
各个参数详细说明: mybatis-plus代码生成器及配置 - BlogMemory - 博客园
一起来学Mybatis Plus(八) & 自定义插件开发
Mybatis Plus系列教程现已完成,喜欢本系列文章的读者,欢迎关注。
MyBatis-Plus是基于MyBatis的增强工具,旨在简化开发、提高效率,但用户仍需掌握Mybatis基础。以下是自定义插件开发相关内容。
已展示的内置插件如OptimisticLockerInnerInterceptor,其核心在于实现InnerInterceptor接口,该接口提供多种操作的拦截方法。开发者只需根据需求实现对应方法即可。
以查询插件为例,实现步骤包括插件注册与测试验证,通过查询可确认拦截方法生效。在拦截器中修改SQL语句,利用JsqlParserSupport API实现,适用于不同权限下返回字段和查询条件的统一处理,提高系统安全性和维护性。
对于增删改操作,原理与查询相同,只需相应调整实现逻辑。对于感兴趣的读者,推荐查阅开源插件源码,学习他人实现技巧。
Mybatis Plus系列教程至此结束,感谢大家的阅读与支持。如果内容对您有所帮助,欢迎点赞与关注。
关于mybatis-plus中Service和Mapper的分析
在后端开发中,mybatis-plus是广泛使用的框架之一。该框架内部包含两个核心的数据库操作接口:Iservice和BaseMapper。在日常开发中,我们通常会发现这两者在功能上高度相似,仅在方法命名上有细微差别。对于这样的设计,我产生了浓厚的兴趣,决定深入研究。
通过对比两个接口的源码,我们首先发现了一个奇妙的继承结构。Service接口(如ServiceImpl)实际上同时继承了BaseMapper接口和Iservice接口。乍一看,这似乎有些冗余,因为我们通常会为Service类单独创建一个Mapper类,并继承BaseMapper。然而,这样的设计实际上为Service带来了更多功能,尤其是批处理功能的加入。
具体而言,Service接口通过继承BaseMapper接口,实现了基础的CRUD操作,但又进一步扩展了接口功能,提供了更多便利的批处理方法。这与BaseMapper接口相比,增加了业务逻辑处理的灵活性和效率。
为了更深入地理解Service和BaseMapper的区别,我参考了mybatis-plus官方文档的描述。文档详细解释了这两种接口的功能特性,强调了Service在提供数据库操作的同时,更侧重于业务逻辑的实现,而复杂的SQL查询任务则交由BaseMapper对应的XML文件来完成。
总的来说,mybatis-plus中的Service和BaseMapper的设计虽然在表面上看似相似,但实际上它们各有侧重,共同为开发者提供了强大的数据库操作和业务逻辑处理能力。Service接口通过继承BaseMapper接口,不仅实现了基本的CRUD功能,还提供了更高效、便捷的批处理功能,使得开发过程更加流畅。而BaseMapper则专注于SQL语句的编写,为复杂查询提供了有力的支持。
element-plus源码与二次开发:package.json解析
element-plus使用pnpm的workspace来搭建monorepo工程,允许在单一码仓库中集中管理大量互相依赖的包,同时确保发布时的独立性。pnpm-workspace.yaml文件在根目录声明内部可引用的包,执行pnpm i后,会在node_modules中创建软连接,无需手动link。
element-plus组件库将vue声明在peerDependencies中,避免在主项目安装组件库时额外安装vue。通过czg包定义规范,执行提交commit命令,确保遵循git规范。使用play子包进行简单的开发调试,引入本地组件库。通过gen命令快速创建新组件,使用模板生成组件基础模板。生成版本号文件命令用于在构建时提供rollup的banner参数,部署前更新版本号命令从环境变量获取TAG_VERSION和GIT_HEAD,写入到三个包的package.json中的version和gitHead字段。
清理dist目录命令使用pnpm run -r --parallel,以并行方式执行所有子包的命令,删除根目录下的dist目录,并执行所有子包的clean命令。构建文档和组件库的关键步骤包括使用rollup执行构建,通过@esbuild-kit/cjs-loader将esm和ts实时转换为CommonJS。生成类型声明文件和代码提示文件,复制源样式文件、编译为css、压缩,并输出到特定目录。启动组件库文档docs项目基于vitepress,构建组件文档,本地测试构建出的生产环境docs,生成多语言文件和CROWDIN_TOKEN。
执行各包的stub命令,使用unbuild打包工具,基于rollup,支持typescript,支持生成commonjs和esmodule和类型声明,无需额外配置。prepare Husky钩子脚本确保自动执行预定义命令,执行pnpm i后,自动执行pnpm stub,编译internal下的三个包入口。
通过上述详细解析,我们可以清晰了解到element-plus源码与二次开发中的核心功能与流程,从构建结构到构建流程,再到二次开发工具的运用,展示了其高效、灵活的特点。