【Java 比较 ORM 框架操作数据】操作批量新增、分页查询(七)
orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、dbvisitor、beetlsql操作数据 环境: 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 优化 数据库表(含有唯一性索引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框架创建 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 执行时间: 25毫秒 18毫秒 73毫秒 671毫秒 6653毫秒 MYBATIS(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 51毫秒 28毫秒 84毫秒 601毫秒 5963毫秒 LAZY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 4毫秒 12毫秒 48毫秒 353毫秒 3512毫秒 MYBATIS_MP(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 8毫秒 16毫秒 66毫秒 589毫秒 6060毫秒 DB_VISITOR(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 67毫秒 155毫秒 897毫秒 8368毫秒 82348毫秒 JPA(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 67毫秒 64毫秒 952毫秒 8608毫秒 95946毫秒 EASY_QUERY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 58毫秒 91毫秒 395毫秒 1608毫秒 15802毫秒 SQLTOY(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 35毫秒 36毫秒 173毫秒 1540毫秒 15167毫秒 BEETL_SQL(batchStory) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 187毫秒 106毫秒 260毫秒 1713毫秒 16778毫秒 MYBATIS_FLEX(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 28毫秒 8毫秒 19毫秒 113毫秒 865毫秒 MYBATIS(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 26毫秒 7毫秒 20毫秒 98毫秒 732毫秒 LAZY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 5毫秒 5毫秒 9毫秒 71毫秒 474毫秒 MYBATIS_MP(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 28毫秒 5毫秒 16毫秒 89毫秒 752毫秒 DB_VISITOR(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 14毫秒 4毫秒 9毫秒 50毫秒 424毫秒 JPA(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 85毫秒 11毫秒 49毫秒 117毫秒 805毫秒 EASY_QUERY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 39毫秒 9毫秒 22毫秒 60毫秒 474毫秒 SQLTOY(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 23毫秒 4毫秒 10毫秒 45毫秒 249毫秒 BEETL_SQL(findPage) 影响行数:10 影响行数:100 影响行数:1000 影响行数:10000 影响行数:100000 执行时间: 43毫秒 13毫秒 21毫秒 76毫秒 633毫秒 写在最后 细节数据对比(一万以内基本相差不大) 细节数据对比,数据属于并发行测试数据,如果测试总数是一百,那么会执行一百次batchStory,一百次findPage 每次执行的条数在之前数据的基础上+1 从形成的折线图看(具体趋势看排名与测试结果) 存储性能对比: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql 更适合并发性数据存储。jpa、db_visitor 处理耗时较长 分页查询性能对比: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、db_visitor、beetlSql 都比较稳定。jpa 处理时间明显起伏 批量保存: 一万条数据以内 lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql、jpa、db_visitor 性能趋于一致 十万数据时,处理时间由快到慢依次是: lazy、mybatis-flex、mybatis-mp、mybatis、easy-query、sqltoy、beetlSql、db_visitor、jpa,其中 db_visitor、jpa 处理时间明显起伏 分页查询: 一万条数据以内 几款ORM均保持在200毫秒内 十万数据时,处理时间由快到慢依次是: sqltoy、db_visitor、easy-query、lazy、beetlSql、mybatis、mybatis-mp、jpa、mybatis-flex 快速数据对比(大数据曲线图) 当前项目地址 lazy-orm地址 mybatis地址 sqltoy地址 mybatis-flex地址 easy-query地址 mybatis-mp地址 dbvisitor地址 beetlsql地址