首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

Java orm 框架对比】十三,新增 qdbc 框架对比

orm框架使用性能比较 优化项 时间 2024年5月7日 添加 wood框架对比测试数据库存储和查询 测试结果容易上手快速集成,但是内部使用了大量字符串不易于编写 时间 2024年5月8日 针对mysql 配置 rewriteBatchedStatements=true 保存时间明显提高 时间:2024年5月9日 事件 新增hammer_sql_db框架对比测试,该框架上手比较简单比较灵活 测试结果hammer_sql_db 批量存储做的很优秀,但当分页获取数据量超过一万后分页查询性能开始下降 时间:2024年5月11日 事件 新增原生jdbc测试 测试结果 因为未对jdbc过分优化,从结果过上看insertBatch 存在一定优势但是不大、分页查询结果集映射单纯for循环迭代会很慢 时间:2024年5月20日 事件 优化easy-query批量新增 测试结果 优化后easy-query 批量新增数据趋于稳定 时间:2024年5月21日 事件 优化jpa数据存储、十万数据存储操作分批处理,表结构新增四十个测试字段 测试结果 优化后jpa 批量新增数据趋于稳定事件大大缩减,新增四十个字段后所有ORM框架处理时间明显增多,但不是呈现倍数增加 时间:2024年5月28日 事件 新增qdbc 框架对比 测试结果 qdbc基于spring JdbcTemplate处理存储和查询性能均有所不佳 issues 处理 #I9Q8UD 事件:大表大数据处理,在原先表结构上增加40个字段 测试结果:当表结构修改时使用原生sql需要修改(db_visitor、原生jdbc、mybatis、mybatis-flex、mybatis-mp),相反使用lambda表达式则不需要过多调整 问题: 如果表不存在hammer框架回无法启动,已经提交开发者issues 使用过程中如果字段中包含下划线那么hammer 框架必须声明字段框架否则数据无法插入影响测试结果,对应的issues已经提交 #I9QGIL 事件:easy-query 优化测试结果 #I9QDC7 事件: 新增结果导出Excel #I9P24G 优化纯jdbc测试 #I9SQ6K 优化hammer框架连接数据库检测数据库空表问题 测试方法拉取代码,配置数据库账号信息,直接启动,然后打开控制台页面通过页面点击测试 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc、qdbc 操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0 测试条件常规对象 orm 框架 是否支持xml 是否支持 Lambda 对比版本 编码方式 注意事项 mybatis ☑️ ☑️ 3.5.4 lambda +xml 优化 ------------------------------ sqltoy ☑️ ☑️ 5.2.98 lambda ------------------------------ lazy ✖️ ☑️ 1.2.4-JDK17-SNAPSHOT lambda ------------------------------ mybatis-flex ☑️ ☑️ 1.8.0 lambda +xml 优化 ------------------------------ easy-query ✖️ ☑️ 1.10.31 lambda ------------------------------ mybatis-mp ☑️ ☑️ 1.4.1 xml 优化 ------------------------------ jpa ☑️ ☑️ 3.0.7 ---------------------- ------------------------------ dbvisitor ☑️ ☑️ 5.4.3 xml 优化 ------------------------------ beetlsql 支持md ☑️ 3.26.0-RELEASE insert ignore into 优化 ------------------------------ dream_orm ✖️ ☑️ 1.3.0 insert ignore into (当前版本不支持) ------------------------------ wood ☑️ ☑️ 1.2.9 insert ignore into (当前版本不支持) ------------------------------ hammer_sql_db ☑️ ☑️ 0.7.0 insert ignore into (当前版本不支持) 连接的数据库中如果没有表项目无法启动 jdbc ✖️ ✖️ ---------------------- ------------------------------ qdbc ☑️ ☑️ 4.2.7 ---------------------- ------------------------------ 数据库表(含有唯一性索引s_u) CREATE TABLE `sys_user` ( `column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null', `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null', `status` tinyint(1) DEFAULT NULL COMMENT '状态', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `s_u` (`scope`,`username`) ) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页) 项目设计 声明 ORMRepository 接口提供对应增删改查方法 声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 不同ORM框架mybatis-plus、sqltoy、Lazy、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc、qdbc 创建 ORMComparisonRepository 的实现 不同 ORM 操作数据的实现 测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare 测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare 导出测试数据为MD 项目启动后使用浏览器打开 http://localhost:1003/sys/user/export-compare-result 测试执行过程 清空需要插入表中所有数据 通过ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档 查看结果曲线图 测试结果(结果只提供参考) MYBATIS_FLEX(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 93毫秒 55毫秒 525毫秒 3961毫秒 38358毫秒 WOOD(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 28毫秒 208毫秒 1320毫秒 22854毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 20毫秒 86毫秒 388毫秒 3323毫秒 33831毫秒 MYBATIS_PLUS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 51毫秒 135毫秒 350毫秒 3317毫秒 33736毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 33毫秒 581毫秒 1513毫秒 32076毫秒 QDBC(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 164毫秒 90毫秒 909毫秒 6746毫秒 71587毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 13毫秒 29毫秒 260毫秒 1711毫秒 20745毫秒 JDBC(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 49毫秒 13毫秒 69毫秒 615毫秒 6456毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 229毫秒 24毫秒 216毫秒 1458毫秒 17238毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 320毫秒 45毫秒 284毫秒 1902毫秒 21815毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 110毫秒 35毫秒 429毫秒 2722毫秒 20608毫秒 HAMMER_SQL_DB(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 81毫秒 19毫秒 326毫秒 2413毫秒 24478毫秒 DREAM_ORM(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 108毫秒 25毫秒 216毫秒 2628毫秒 18042毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 213毫秒 59毫秒 263毫秒 1904毫秒 18678毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 16毫秒 86毫秒 594毫秒 7753毫秒 WOOD(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 17毫秒 51毫秒 505毫秒 6735毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 15毫秒 72毫秒 499毫秒 7552毫秒 MYBATIS_PLUS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 34毫秒 12毫秒 66毫秒 577毫秒 6949毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 21毫秒 10毫秒 30毫秒 298毫秒 4161毫秒 QDBC(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 104毫秒 945毫秒 9243毫秒 96091毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 16毫秒 45毫秒 389毫秒 4783毫秒 JDBC(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 8毫秒 52毫秒 428毫秒 5458毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 18毫秒 42毫秒 455毫秒 5939毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 136毫秒 23毫秒 63毫秒 454毫秒 5402毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 60毫秒 9毫秒 40毫秒 328毫秒 3984毫秒 HAMMER_SQL_DB(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 121毫秒 15毫秒 63毫秒 623毫秒 7410毫秒 DREAM_ORM(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 62毫秒 11毫秒 32毫秒 320毫秒 4097毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 44毫秒 13毫秒 51毫秒 432毫秒 5670毫秒 写在最后 经过不间断时间的框架收集、学习、实验、编码、测试市面上常见的ORM框架,过程中拜读了很多作者的博文、样例,学习很多收获很多。 重新梳理下整理的框架:mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_rom、wood、hammer_sql_db、原生jdbc、qdbc 下面从一下几点出发作出总结 文档方面:学习过程中mybatis-plus、jpa、db_visitor提供的文档资料是比较全和完善,经得住市场的考验 技术方面:beetlsql、easy-query、mybatis、wood、db_visitor系列 三类框架都已经支持spring 和solon生态 其技术架构设计可以推荐大家学习 并发方面:jpa、db_visitor 还需要开发时候深度优化处理 大数据存储方面: Lazy 、原生jdbc具有一定优势 大数据查询方面:sqltoy、dream_orm、Easy_query、lazy、db_visitor 反射处理的比较优秀 小数据量下各ORM框架处理时间大体相近或者通过优化后趋于一致,重点看一万数据以后框架处理能力体现价值 以上是个人整理的观点,如果大家有不同的想法和意见可以在gitee或者个人博客留言CSDN 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、原生jdbc、mybatis-flex、mybatis-mp、mybatis-plus、dream_rom、sqltoy、beetlSql、hammer_sql_db、db_visitor、easy-query、qdbc 更适合并发性数据存储。jpa 处理耗时较长波动较大 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、 dream_rom、easy-query、sqltoy、db_visitor、beetlSql 、jpa、hammer_sql_db、原生jdbc都比较稳定。qdbc性能不佳 TODO 网关人员看下另一张图个上面差不多提示图片不合规 批量保存: 一万条数据以内 原生jdbc、lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、sqltoy、beetlSql、jpa、db_visitor、wood、hammer_sql_db、qdbc 性能趋于一致 十万数据时,处理时间由快到慢依次是: 两万毫秒以内:原生jdbc、sqltoy、db_visitor、wood、beetl_sql、dream_rom、easy-query、lazy、hammer_sql_db、 两万毫秒以上: jpa、mybatis-plus、mybatis-mp、mybatis-flex、qdbc 分页查询: 一万条数据以内 几款ORM均保持在600毫秒内 十万数据时,处理时间由快到慢依次是: 四千毫秒以内:sqltoy、dream_rom、lazy、easy-query、beetlSql、jpa、db_visitor 四千毫秒以上:原生jdbc、mybatis-mp、mybatis-plus、wood、mybatis-flex、hammer_sql_db、qdbc 快速数据对比(大数据曲线图) 关注公众号【小吴小吴bug全无】第一时间获取动态 当前项目地址:https://gitee.com/wujiawei1207537021/spring-orm-integration-compare lazy-orm地址:https://gitee.com/wujiawei1207537021/wu-framework-parent/tree/master/wu-database-parent mybatis地址:https://gitee.com/baomidou/mybatis-plus sqltoy地址:https://gitee.com/sagacity/sagacity-sqltoy mybatis-flex地址:https://gitee.com/mybatis-flex/mybatis-flex easy-query地址:https://gitee.com/xuejm/easy-query mybatis-mp地址:https://gitee.com/mybatis-mp/mybatis-mp dbvisitor地址:https://gitee.com/zycgit/dbvisitor beetlsql地址:https://gitee.com/xiandafu/beetlsql dream-orm地址:https://gitee.com/moxiaoai/dream-orm wood地址:https://gitee.com/noear/wood hammer_sql_db地址:https://gitee.com/featherfly/hammer qdbc地址:https://gitee.com/qdbp/qdbp-jdbc

优秀的个人博客,低调大师

Java orm 框架对比】十三新增 qdbc 框架对比

orm框架使用性能比较 优化项 时间 2024年5月7日 添加 wood框架对比测试数据库存储和查询 测试结果容易上手快速集成,但是内部使用了大量字符串不易于编写 时间 2024年5月8日 针对mysql 配置 rewriteBatchedStatements=true 保存时间明显提高 时间:2024年5月9日 事件 新增hammer_sql_db框架对比测试,该框架上手比较简单比较灵活 测试结果hammer_sql_db 批量存储做的很优秀,但当分页获取数据量超过一万后分页查询性能开始下降 时间:2024年5月11日 事件 新增原生jdbc测试 测试结果 因为未对jdbc过分优化,从结果过上看insertBatch 存在一定优势但是不大、分页查询结果集映射单纯for循环迭代会很慢 时间:2024年5月20日 事件 优化easy-query批量新增 测试结果 优化后easy-query 批量新增数据趋于稳定 时间:2024年5月21日 事件 优化jpa数据存储、十万数据存储操作分批处理,表结构新增四十个测试字段 测试结果 优化后jpa 批量新增数据趋于稳定事件大大缩减,新增四十个字段后所有ORM框架处理时间明显增多,但不是呈现倍数增加 时间:2024年5月28日 事件 新增qdbc 框架对比 测试结果 qdbc基于spring JdbcTemplate处理存储和查询性能均有所不佳 issues 处理 #I9Q8UD 事件:大表大数据处理,在原先表结构上增加40个字段 测试结果:当表结构修改时使用原生sql需要修改(db_visitor、原生jdbc、mybatis、mybatis-flex、mybatis-mp),相反使用lambda表达式则不需要过多调整 问题: 如果表不存在hammer框架回无法启动,已经提交开发者issues 使用过程中如果字段中包含下划线那么hammer 框架必须声明字段框架否则数据无法插入影响测试结果,对应的issues已经提交 #I9QGIL 事件:easy-query 优化测试结果 #I9QDC7 事件: 新增结果导出Excel #I9P24G 优化纯jdbc测试 #I9SQ6K 优化hammer框架连接数据库检测数据库空表问题 测试方法拉取代码,配置数据库账号信息,直接启动,然后打开控制台页面通过页面点击测试 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc、qdbc 操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0 测试条件常规对象 orm 框架 是否支持xml 是否支持 Lambda 对比版本 编码方式 注意事项 mybatis ☑️ ☑️ 3.5.4 lambda +xml 优化 ------------------------------ sqltoy ☑️ ☑️ 5.2.98 lambda ------------------------------ lazy ✖️ ☑️ 1.2.4-JDK17-SNAPSHOT lambda ------------------------------ mybatis-flex ☑️ ☑️ 1.8.0 lambda +xml 优化 ------------------------------ easy-query ✖️ ☑️ 1.10.31 lambda ------------------------------ mybatis-mp ☑️ ☑️ 1.4.1 xml 优化 ------------------------------ jpa ☑️ ☑️ 3.0.7 ---------------------- ------------------------------ dbvisitor ☑️ ☑️ 5.4.3 xml 优化 ------------------------------ beetlsql 支持md ☑️ 3.26.0-RELEASE insert ignore into 优化 ------------------------------ dream_orm ✖️ ☑️ 1.3.0 insert ignore into (当前版本不支持) ------------------------------ wood ☑️ ☑️ 1.2.9 insert ignore into (当前版本不支持) ------------------------------ hammer_sql_db ☑️ ☑️ 0.7.0 insert ignore into (当前版本不支持) 连接的数据库中如果没有表项目无法启动 jdbc ✖️ ✖️ ---------------------- ------------------------------ qdbc ☑️ ☑️ 4.2.7 ---------------------- ------------------------------ 数据库表(含有唯一性索引s_u) CREATE TABLE `sys_user` ( `column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null', `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null', `status` tinyint(1) DEFAULT NULL COMMENT '状态', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `s_u` (`scope`,`username`) ) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页) 项目设计 声明 ORMRepository 接口提供对应增删改查方法 声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 不同ORM框架mybatis-plus、sqltoy、Lazy、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc、qdbc 创建 ORMComparisonRepository 的实现 不同 ORM 操作数据的实现 测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare 测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare 导出测试数据为MD 项目启动后使用浏览器打开 http://localhost:1003/sys/user/export-compare-result 测试执行过程 清空需要插入表中所有数据 通过ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档 查看结果曲线图 测试结果(结果只提供参考) MYBATIS_FLEX(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 93毫秒 55毫秒 525毫秒 3961毫秒 38358毫秒 WOOD(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 28毫秒 208毫秒 1320毫秒 22854毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 20毫秒 86毫秒 388毫秒 3323毫秒 33831毫秒 MYBATIS_PLUS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 51毫秒 135毫秒 350毫秒 3317毫秒 33736毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 33毫秒 581毫秒 1513毫秒 32076毫秒 QDBC(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 164毫秒 90毫秒 909毫秒 6746毫秒 71587毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 13毫秒 29毫秒 260毫秒 1711毫秒 20745毫秒 JDBC(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 49毫秒 13毫秒 69毫秒 615毫秒 6456毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 229毫秒 24毫秒 216毫秒 1458毫秒 17238毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 320毫秒 45毫秒 284毫秒 1902毫秒 21815毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 110毫秒 35毫秒 429毫秒 2722毫秒 20608毫秒 HAMMER_SQL_DB(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 81毫秒 19毫秒 326毫秒 2413毫秒 24478毫秒 DREAM_ORM(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 108毫秒 25毫秒 216毫秒 2628毫秒 18042毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 213毫秒 59毫秒 263毫秒 1904毫秒 18678毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 16毫秒 86毫秒 594毫秒 7753毫秒 WOOD(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 17毫秒 51毫秒 505毫秒 6735毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 15毫秒 72毫秒 499毫秒 7552毫秒 MYBATIS_PLUS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 34毫秒 12毫秒 66毫秒 577毫秒 6949毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 21毫秒 10毫秒 30毫秒 298毫秒 4161毫秒 QDBC(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 104毫秒 945毫秒 9243毫秒 96091毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 16毫秒 45毫秒 389毫秒 4783毫秒 JDBC(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 8毫秒 52毫秒 428毫秒 5458毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 18毫秒 42毫秒 455毫秒 5939毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 136毫秒 23毫秒 63毫秒 454毫秒 5402毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 60毫秒 9毫秒 40毫秒 328毫秒 3984毫秒 HAMMER_SQL_DB(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 121毫秒 15毫秒 63毫秒 623毫秒 7410毫秒 DREAM_ORM(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 62毫秒 11毫秒 32毫秒 320毫秒 4097毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 44毫秒 13毫秒 51毫秒 432毫秒 5670毫秒 写在最后 经过不间断时间的框架收集、学习、实验、编码、测试市面上常见的ORM框架,过程中拜读了很多作者的博文、样例,学习很多收获很多。 重新梳理下整理的框架:mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_rom、wood、hammer_sql_db、原生jdbc、qdbc 下面从一下几点出发作出总结 文档方面:学习过程中mybatis-plus、jpa、db_visitor提供的文档资料是比较全和完善,经得住市场的考验 技术方面:beetlsql、easy-query、mybatis、wood、db_visitor系列 三类框架都已经支持spring 和solon生态 其技术架构设计可以推荐大家学习 并发方面:jpa、db_visitor 还需要开发时候深度优化处理 大数据存储方面: Lazy 、原生jdbc具有一定优势 大数据查询方面:sqltoy、dream_orm、Easy_query、lazy、db_visitor 反射处理的比较优秀 小数据量下各ORM框架处理时间大体相近或者通过优化后趋于一致,重点看一万数据以后框架处理能力体现价值 以上是个人整理的观点,如果大家有不同的想法和意见可以在gitee或者个人博客留言CSDN 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、原生jdbc、mybatis-flex、mybatis-mp、mybatis-plus、dream_rom、sqltoy、beetlSql、hammer_sql_db、db_visitor、easy-query、qdbc 更适合并发性数据存储。jpa 处理耗时较长波动较大 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、 dream_rom、easy-query、sqltoy、db_visitor、beetlSql 、jpa、hammer_sql_db、原生jdbc都比较稳定。qdbc性能不佳 TODO 网关人员看下另一张图个上面差不多提示图片不合规 批量保存: 一万条数据以内 原生jdbc、lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、sqltoy、beetlSql、jpa、db_visitor、wood、hammer_sql_db、qdbc 性能趋于一致 十万数据时,处理时间由快到慢依次是: 两万毫秒以内:原生jdbc、sqltoy、db_visitor、wood、beetl_sql、dream_rom、easy-query、lazy、hammer_sql_db、 两万毫秒以上: jpa、mybatis-plus、mybatis-mp、mybatis-flex、qdbc 分页查询: 一万条数据以内 几款ORM均保持在600毫秒内 十万数据时,处理时间由快到慢依次是: 四千毫秒以内:sqltoy、dream_rom、lazy、easy-query、beetlSql、jpa、db_visitor 四千毫秒以上:原生jdbc、mybatis-mp、mybatis-plus、wood、mybatis-flex、hammer_sql_db、qdbc 快速数据对比(大数据曲线图) 关注公众号【小吴小吴bug全无】第一时间获取动态 当前项目地址:https://gitee.com/wujiawei1207537021/spring-orm-integration-compare lazy-orm地址:https://gitee.com/wujiawei1207537021/wu-framework-parent/tree/master/wu-database-parent mybatis地址:https://gitee.com/baomidou/mybatis-plus sqltoy地址:https://gitee.com/sagacity/sagacity-sqltoy mybatis-flex地址:https://gitee.com/mybatis-flex/mybatis-flex easy-query地址:https://gitee.com/xuejm/easy-query mybatis-mp地址:https://gitee.com/mybatis-mp/mybatis-mp dbvisitor地址:https://gitee.com/zycgit/dbvisitor beetlsql地址:https://gitee.com/xiandafu/beetlsql dream-orm地址:https://gitee.com/moxiaoai/dream-orm wood地址:https://gitee.com/noear/wood hammer_sql_db地址:https://gitee.com/featherfly/hammer qdbc地址:https://gitee.com/qdbp/qdbp-jdbc

优秀的个人博客,低调大师

Java orm 框架比较】十一 新增 原生 jdbc 对比

迁移到(https://gitee.com/wujiawei1207537021/spring-orm-integration-compare) orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc 操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0 测试条件常规对象 orm 框架 是否支持xml 是否支持 Lambda 对比版本 编码方式 mybatis ☑️ ☑️ 3.5.4 lambda +xml 优化 sqltoy ☑️ ☑️ 5.2.98 lambda lazy ✖️ ☑️ 1.2.4-JDK17-SNAPSHOT lambda mybatis-flex ☑️ ☑️ 1.8.0 lambda +xml 优化 easy-query ✖️ ☑️ 1.10.31 lambda mybatis-mp ☑️ ☑️ 1.4.1 xml 优化 jpa ☑️ ☑️ 3.0.7 ---------------------- dbvisitor ☑️ ☑️ 5.4.1 xml 优化 beetlsql 支持md ☑️ 3.26.0-RELEASE insert ignore into 优化 dream_orm ✖️ ☑️ 1.3.0 insert ignore into (当前版本不支持) wood ☑️ ☑️ 1.2.9 insert ignore into (当前版本不支持) hammer_sql_db ☑️ ☑️ 0.7.0 insert ignore into (当前版本不支持) jdbc ✖️ ✖️ 数据库表(含有唯一性索引s_u) CREATE TABLE `sys_user` ( `column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null', `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null', `status` tinyint(1) DEFAULT NULL COMMENT '状态', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `s_u` (`scope`,`username`) ) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页) 项目设计 声明 ORMRepository 接口提供对应增删改查方法 声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 不同ORM框架mybatis-plus、sqltoy、Lazy、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm、wood、hammer_sql_db、原生jdbc 创建 ORMComparisonRepository 的实现 不同 ORM 操作数据的实现 测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare 测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare 导出测试数据为MD 项目启动后使用浏览器打开 http://localhost:1003/sys/user/export-compare-result 测试执行过程 清空需要插入表中所有数据 通过ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档 查看结果曲线图 测试结果(结果只提供参考) MYBATIS_FLEX(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 94毫秒 25毫秒 133毫秒 1119毫秒 9376毫秒 WOOD(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 13毫秒 18毫秒 100毫秒 400毫秒 4305毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 12毫秒 24毫秒 116毫秒 1021毫秒 8646毫秒 MYBATIS_PLUS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 43毫秒 21毫秒 195毫秒 871毫秒 8578毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 34毫秒 19毫秒 122毫秒 839毫秒 6994毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 8毫秒 16毫秒 75毫秒 530毫秒 4223毫秒 JDBC(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 12毫秒 11毫秒 68毫秒 415毫秒 3750毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 21毫秒 14毫秒 120毫秒 404毫秒 4763毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 78毫秒 72毫秒 1162毫秒 9891毫秒 87352毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 89毫秒 317毫秒 3192毫秒 1167毫秒 10696毫秒 HAMMER_SQL_DB(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 99毫秒 18毫秒 147毫秒 937毫秒 7454毫秒 DREAM_ORM(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 48毫秒 15毫秒 117毫秒 1059毫秒 9139毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 155毫秒 19毫秒 132毫秒 861毫秒 8667毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 29毫秒 17毫秒 31毫秒 170毫秒 1529毫秒 WOOD(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 10毫秒 10毫秒 40毫秒 148毫秒 1691毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 32毫秒 24毫秒 39毫秒 173毫秒 1433毫秒 MYBATIS_PLUS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 33毫秒 10毫秒 30毫秒 178毫秒 1639毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 25毫秒 11毫秒 48毫秒 166毫秒 976毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 5毫秒 11毫秒 25毫秒 142毫秒 1103毫秒 JDBC(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 6毫秒 57毫秒 329毫秒 2372毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 10毫秒 9毫秒 15毫秒 159毫秒 1044毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 135毫秒 25毫秒 81毫秒 166毫秒 1601毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 57毫秒 13毫秒 15毫秒 137毫秒 1516毫秒 HAMMER_SQL_DB(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 162毫秒 11毫秒 39毫秒 174毫秒 1886毫秒 DREAM_ORM(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 40毫秒 8毫秒 31毫秒 145毫秒 1213毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 53毫秒 19毫秒 47毫秒 182毫秒 1264毫秒 写在最后 经过不间断时间的框架收集、学习、实验、编码、测试市面上常见的ORM框架,过程中拜读了很多作者的博文、样例,学习很多收获很多。 重新梳理下整理的框架:mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_rom、wood、hammer_sql_db、原生jdbc 下面从一下几点出发作出总结 文档方面:学习过程中mybatis-plus、jpa、db_visitor提供的文档资料是比较全和完善,经得住市场的考验 技术方面:beetlsql、easy-query、mybatis、wood、db_visitor系列 三类框架都已经支持spring 和solon生态 其技术架构设计可以推荐大家学习 并发方面:jpa、db_visitor 还需要开发时候深度优化处理 大数据存储方面: Lazy 、原生jdbc具有一定优势 大数据查询方面:sqltoy、dream_orm、Easy_query、lazy、db_visitor 反射处理的比较优秀 小数据量下各ORM框架处理时间大体相近或者通过优化后趋于一致,重点看一万数据以后框架处理能力体现价值 以上是个人整理的观点,如果大家有不同的想法和意见可以在gitee或者个人博客留言CSDN 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、原生jdbc、mybatis-flex、mybatis-mp、mybatis-plus、dream_rom、sqltoy、beetlSql、hammer_sql_db、db_visitor 更适合并发性数据存储。jpa、easy-query 处理耗时较长波动较大 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、 dream_rom、easy-query、sqltoy、db_visitor、beetlSql 、jpa、hammer_sql_db、原生jdbc都比较稳定。 批量保存: 一万条数据以内 原生jdbc、lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、sqltoy、beetlSql、jpa、db_visitor、wood、hammer_sql_db 性能趋于一致 十万数据时,处理时间由快到慢依次是: 八千毫秒以内:原生jdbc、lazy、dream_rom、easy-query、hammer_sql_db、sqltoy、wood、db_visitor 八千毫秒以上: mybatis-flex、mybatis-mp、mybatis-plus、beetlSql、jpa,其中 jpa 处理时间明显起伏 分页查询: 一万条数据以内 几款ORM均保持在200毫秒内 十万数据时,处理时间由快到慢依次是: 一千毫秒以内:sqltoy、dream_rom、db_visitor、easy-query、lazy、beetlSql、mybatis-plus 一千毫秒以上:mybatis-mp、jpa、mybatis-flex、wood、hammer_sql_db、原生jdbc 快速数据对比(大数据曲线图) 优化项 时间 2024年5月7日 添加 wood框架对比测试数据库存储和查询 测试结果容易上手快速集成,但是内部使用了大量字符串不易于编写 时间 2024年5月8日 针对mysql 配置 rewriteBatchedStatements=true 保存时间明显提高 时间:2024年5月9日 事件 新增hammer_sql_db框架对比测试,该框架上手比较简单比较灵活 测试结果hammer_sql_db 批量存储做的很优秀,但当分页获取数据量超过一万后分页查询性能开始下降 时间:2024年5月11日 事件 新增原生jdbc测试 测试结果 因为未对jdbc过分优化,从结果过上看insertBatch 存在一定优势但是不大、分页查询结果集映射单纯for循环迭代会很慢 当前项目地址 lazy-orm地址 mybatis地址 sqltoy地址 mybatis-flex地址 easy-query地址 mybatis-mp地址 dbvisitor地址 beetlsql地址 dream-orm地址 wood地址 hammer_sql_db地址

优秀的个人博客,低调大师

Java orm 框架使用性能比较】八

orm框架使用性能比较 比较mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0 测试条件常规对象 orm 框架 是否支持xml 是否支持 Lambda 对比版本 编码方式 mybatis ☑️ ☑️ 3.5.4 lambda +xml 优化 sqltoy ☑️ ☑️ 5.2.98 lambda lazy ✖️ ☑️ 1.2.4-JDK17-SNAPSHOT lambda mybatis-flex ☑️ ☑️ 1.8.0 lambda +xml 优化 easy-query ✖️ ☑️ 1.10.31 lambda mybatis-mp ☑️ ☑️ 1.4.1 xml 优化 jpa ☑️ ☑️ 3.0.7 ---------------------- dbvisitor ☑️ ☑️ 5.4.1 xml 优化 beetlsql 支持md ☑️ 3.26.0-RELEASE insert ignore into 优化 dream_orm ✖️ ☑️ 1.3.0 insert ignore into (当前版本不支持) 数据库表(含有唯一性索引s_u) CREATE TABLE `sys_user` ( `column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段', `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null', `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码', `scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null', `status` tinyint(1) DEFAULT NULL COMMENT '状态', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `s_u` (`scope`,`username`) ) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页) 项目设计 声明 ORMRepository 接口提供对应增删改查方法 声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现 声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果 声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储 不同ORM框架mybatis-plus、sqltoy、Lazy、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_orm 创建 ORMComparisonRepository 的实现 不同 ORM 操作数据的实现 测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare 测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000 项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare 测试执行过程 清空需要插入表中所有数据 通过ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档 查看结果曲线图 测试结果(结果只提供参考) MYBATIS_FLEX(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 3毫秒 9毫秒 84毫秒 827毫秒 7199毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 3毫秒 4毫秒 51毫秒 367毫秒 3429毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 2毫秒 9毫秒 77毫秒 677毫秒 7177毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 9毫秒 24毫秒 166毫秒 1609毫秒 16990毫秒 MYBATIS_PLUS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 9毫秒 9毫秒 131毫秒 714毫秒 7349毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 13毫秒 30毫秒 1247毫秒 9894毫秒 99568毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 10毫秒 21毫秒 202毫秒 1574毫秒 15692毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 5毫秒 17毫秒 189毫秒 1537毫秒 15918毫秒 DREAM_ORM(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 12毫秒 19毫秒 159毫秒 1543毫秒 15437毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 17毫秒 30毫秒 174毫秒 1719毫秒 16831毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 5毫秒 4毫秒 19毫秒 153毫秒 1388毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 6毫秒 3毫秒 11毫秒 93毫秒 700毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 9毫秒 3毫秒 12毫秒 111毫秒 988毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 1毫秒 8毫秒 70毫秒 782毫秒 MYBATIS_PLUS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 9毫秒 3毫秒 25毫秒 152毫秒 1309毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 15毫秒 3毫秒 25毫秒 108毫秒 1082毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 7毫秒 1毫秒 9毫秒 61毫秒 637毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 14毫秒 5毫秒 16毫秒 80毫秒 602毫秒 DREAM_ORM(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 7毫秒 1毫秒 13毫秒 62毫秒 719毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 18毫秒 2毫秒 14毫秒 89毫秒 861毫秒 写在最后 经过将近一周时间的框架收集、学习、实验、编码、测试市面上常见的ORM框架,过程中拜读了很多作者的博文、样例,学习很多收获很多。 重新梳理下整理的框架:mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql、dream_rom 下面从一下几点出发作出总结 文档方面:学习过程中mybatis-plus、jpa 提供的文档资料是比较全和完善,经得住市场的考验 技术方面:beetlsql、easy-query、mybatis系列 三类框架都已经支持spring 和solon生态 其技术架构设计可以推荐大家学习 并发方面:jpa、db_visitor 还需要开发时候深度优化处理 大数据存储方面: Lazy 具有一定优势 大数据查询方面:sqltoy、dream_orm、Easy_query、lazy、db_visitor 反射处理的比较优秀 以上是个人整理的观点,如果大家有不同的想法和意见可以在gitee或者个人博客留言CSDN 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、dream_rom、sqltoy、beetlSql 更适合并发性数据存储。jpa、db_visitor 处理耗时较长 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis-plus、 dream_rom、easy-query、sqltoy、db_visitor、beetlSql 都比较稳定。jpa 处理时间明显起伏 批量保存: 一万条数据以内 lazy、mybatis-flex、mybatis-mp、mybatis-plus、easy-query、sqltoy、beetlSql、jpa、db_visitor 性能趋于一致 十万数据时,处理时间由快到慢依次是: 一万毫秒以内:lazy、mybatis-flex、mybatis-mp、mybatis-plus、 一万毫秒以上: easy-query、dream_rom、sqltoy、beetlSql、db_visitor、jpa,其中 db_visitor、jpa 处理时间明显起伏 分页查询: 一万条数据以内 几款ORM均保持在200毫秒内 十万数据时,处理时间由快到慢依次是: 一千毫秒以内:sqltoy、dream_rom、db_visitor、easy-query、lazy、beetlSql、mybatis-plus 一千毫秒以上:mybatis-mp、jpa、mybatis-flex 快速数据对比(大数据曲线图) 当前项目地址 lazy-orm地址 mybatis地址 sqltoy地址 mybatis-flex地址 easy-query地址 mybatis-mp地址 dbvisitor地址 beetlsql地址 dream-orm地址

优秀的个人博客,低调大师

国产 Java ORM:sqltoy-orm 5.2.91 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、修复updateByQuery中UnifyFieldsHandler未判null引发的空指针异常 sqltoy-orm 是 JPA 和超强查询的融合体 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

国产 Java ORM:sqltoy-orm 5.2.90 发版

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、增强loop中LocalDateTime和LocalTime的输出精度 sqltoy-orm 是 JPA 和超强查询的融合体 JPA 部分 类似 JPA 的对象化 CRUD、对象级联加载和新增、更新 强化 update 操作,提供弹性字段修改能力,不同于 hibernate 先 load 后修改,而是一次数据库交互完成修改,确保了高并发场景下数据的准确性 改进了级联修改,提供了先删除或者先置无效,再覆盖的操作选项 增加了 updateFetch、updateSaveFetch 功能,强化针对强事务高并发场景的处理,类似库存台账、资金台账,实现一次数据库交互,完成锁查询、不存在则插入、存在则修改,并返回修改后的结果 增加了树结构封装,便于统一不同数据库树型结构数据的递归查询 支持分库分表、支持多种主键策略 (额外支持基于 redis 的产生特定规则的业务主键)、加密存储、数据版本校验 提供了公共属性赋值 (创建人、修改人、创建时间、修改时间、租户)、扩展类型处理等 提供了多租户统一过滤和赋值、提供了数据权限参数带入和越权校验 查询部分 极为直观的 sql 编写方式,便于从客户端 <--> 代码 双向快速迁移,便于后期变更维护 支持缓存翻译、反向缓存匹配 key 代替 like 模糊查询 提供了跨数据库支持能力:不同数据库的函数自动转换适配,多方言 sql 根据实际环境自动匹配、多数据库同步测试,大幅提升了产品化能力 提供了取 top 记录、随机记录等特殊场景的查询功能 提供了最强大的分页查询机制:1) 自动优化 count 语句;2) 提供基于缓存的分页优化,避免每次都执行 count 查询;3) 提供了独具特色的快速分页;4) 提供了并行分页 提供了分库分表能力 提供了在管理类项目中极为价值的:分组汇总计算、行列转换 (行转列、列转行)、同比环比、树形排序、树形汇总 相关算法自然集成 提供了基于查询的层次化数据结构封装 提供了大量辅助功能:数据脱敏、格式化、条件参数预处理等 支持多种数据库 常规的 mysql、oracle、db2、postgresql、 sqlserver、dm、kingbase、sqlite、h2、 oceanBase、polardb、guassdb、tidb 支持分布式 olap 数据库: clickhouse、StarRocks、greenplum、impala (kudu) 支持 elasticsearch、mongodb 所有基于 sql 和 jdbc 各类数据库查询 sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

JeeSite V5.5.2 发布,Java 快速开发平台

升级内容 新增 文件上传支持自定义存储表,业务上可独立 file_upload 表,与系统文件上传表分离存储 新增 sqlMap.column.toSqlNoAlias() 方法,可以在 mapper 中调用,返回不包含别名的列数据 新增 Web 服务脚本,可方便进行 run、start、restart、stop 管理服务 新增 富文本中的文件和图片、用户头像的对象存储调用 新增 Vue 的 ListSelect 选择框代码生成模板 新增 Quartz、Flowable 表 ER 图和注释 新增 jdbc.connectTimeout 和 jdbc.socketTimeout 连接池参数 新增 一个日志清理接口 logService.deleteLogBefore() 可根据需要创建 job 调用 调整 工具 Byte 字节格式化默认显示两位小数 优化 服务启动脚本,支持在任意目录运行,无需切换到具体目录下 优化 数据库设计模型完善,并生成 Excel 表格和 PNG 模型图 优化 查询和重置按钮增加图标、搜索框布局优化改进 Spring Boot 3 版本升级 升级 flowable 7.0.0 release 新增 微小服务 Web Mini 支持只连接业务库,不使用自带 sys 表的支持 修正 ExceptionUtils 包名取不到 jakarta 异常类,导致前端异常信息不能正确显示 修正 代码生成模板,中的错误 javax 没有修改为 jakarta 的问题 修正 接口调用时 context-type 重复问题,导致接口调用400错误 Vue分离端 新增 Upload 组件支持后端服务地址属性自定义设置 新增 单元格变色和行变色的例子 testData/list.vue 新增 路由表单保存后刷新列表数据例子 优化 表格上的 tabs 美化、标题配色优化 优化 布局调整,将表格的搜索表单,调整到页面标题的下面 优化 ListSelect 细节样式、美化树标题样式、美化布局等 优化 标题配色、表格上页签、黑暗主题、主题设置抽屉的遮罩透明等 修正 编辑 table 的 change 事件调用2次的问题 #I8F3O7 修正 文件管理目录树,窗口改变大小的时候刷新目录树的问题 修正 表单组件 labelValue 可能为空时的异常 更新 package.json 依赖库 升级​方法 修改pom.xml文件中的jeesite-parent版本号为5.5.2-SNAPSHOT 如果您修改了parent、common、modules等项目源码,请与git上的代码进行同步 如果您是跨版本升级,请注意每一个版本的升级方法,业务上有调整的地方进行修改 执行root/package.bat(sh)打包脚本,强制更新依赖。 Spring Boot 3 版本升级 修改pom.xml文件中的jeesite-parent版本号为5.5.2.springboot3-SNAPSHOT 如果您修改了parent、common、modules等项目源码,请与git上的代码进行同步 如果您是跨版本升级,请注意每一个版本的升级方法,业务上有调整的地方进行修改 执行root/package.bat(sh)打包脚本,强制更新依赖。 Vue分离端升级 请与jeesite-vue代码仓库源码进行同步,合并代码,手动解决冲突代码。 匹配后端版本为JeeSite v5.5.2 了解更多 JeeSite 官网地址:http://jeesite.com JeeSite 在线文档:http://docs.jeesite.com JeeSite 演示地址:http://demo.jeesite.com JeeSite Vue 演示地址:http://vue.jeesite.com JeeSite 源码仓库:https://gitee.com/thinkgem/jeesite4 JeeSite Vue 前端源码:https://gitee.com/thinkgem/jeesite-vue JeeSite 跨平台手机端:https://gitee.com/thinkgem/jeesite-uniapp JeeSite Cloud 微服务:https://gitee.com/thinkgem/jeesite-cloud JeeSite 客户端安装程序:https://gitee.com/thinkgem/jeesite-client JeeSite 生态系统 分布式微服务(Spring Cloud):https://gitee.com/thinkgem/jeesite-cloud Flowable 业务流程引擎(BPM):http://jeesite.com/docs/bpm/ JFlow 工作流引擎:https://gitee.com/thinkgem/jeesite-jflow 多站点内容管理模块(CMS):https://jeesite.com/docs/cms/ 手机端移动端:https://gitee.com/thinkgem/jeesite-uniapp PC 客户端程序:https://gitee.com/thinkgem/jeesite-client Vue3 分离版本:https://gitee.com/thinkgem/jeesite-vue JeeSite 统一认证:https://jeesite.com/docs/oauth2-server TopIAM 统一认证:https://gitee.com/thinkgem/jeesite-topiam MaxKey 统一认证:https://gitee.com/thinkgem/jeesite-maxkey MybatisPlus:https://gitee.com/thinkgem/jeesite-mybatisplus Magic 接口快速开发:https://gitee.com/thinkgem/jeesite-magic-api 内外网中间件:https://my.oschina.net/thinkgem/blog/4624519

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册