目录

关于 JPA,MyBatis,Spring JDBC测试对比

说orm的前提就是用关系数据库 三个可选 jpa mybatis spring jdbc 性能测试(Imac 4核8线程16G内存cpu i7 7700k)

测试数据:生产环境中的产品,只取标题和描述,没有join,共1648条

取出所有(没有预热)

jpa:440ms

jdbc:286ms

mybatis:221ms

取出所有(有预热)

jpa:151ms

jdbc:173ms

mybatis:164ms

取出一条数据(没有预热)

jdbc:77ms

jpa:69ms

Mybatis:71ms

取出一条数据(有预热)

jdbc:36ms

jpa:37ms

Mybatis:41ms

可以看出没有预热JPA取大量数据比较慢,取单条数据却不慢,预热后JPA速度很快jdbc和mybatis勉强和它一个量级,所以说JPA慢根本就不对

测试数据:生产环境中的产品,只取标题和描述,join每个所属的category,共1648条

取出所有(没有预热)

jpa:356ms

jdbc:352ms

mybatis:336ms

取出所有(有预热)

jpa:168ms

jdbc:190ms

mybatis:167ms

取出一条数据(没有预热)

jdbc:156ms

jpa:170ms

Mybatis:159ms

取出一条数据(有预热)

jdbc:41ms

jpa:42ms

Mybatis:43ms

可以看出没有预热JPA取大量数据比较慢,取单条数据却不慢,预热后JPA速度很快jdbc和mybatis它一个量级,所以说JPA慢根本就不对

### 以上测试都没有使用缓存###
## JPA性能差的问题不用再纠结了##

JPA缺点:

1,需要以实体为单位取出数据,有时候不需要那么多

2,native query 不是真正的native而是经过加工的,所有的join 都被jpa处理为二次请求,而且原来的join还执行了,我估计目的是为了方便jpa的惰性加载和关系管理,但是这样的效率比较低

3,映射为非实体的时候,配置太死,SqlResultMapping 写的不好,如果不写就要自己解包,出来的结果是个object数组

4,批量插入算是无解了,批量更新,删除还能依靠native query

5,只有查询id时候才有一级缓存,只要查询的数据结果可能是多个的就不行

Mybatis缺点:

1,没有像jpa,jdbc那样的现成的CRUD接口实现,虽然可以自己写

2,没有自动ddl,可以用flyway

3,方法不能重载

4,对于json,array支持有限,映射机制写的真垃圾,远不如jpa

5,感觉小厂出品,各方面还不够优秀

6,不能跨数据库

Spring Jdbc 缺点

1,没有自动ddl同 mybatis

2,没有一级二级缓存,只能用spring cache

3,条件查询的时候,那个字符串拼接够恶心

4,没有一对多,多对1的概念,所有的关系都要手工构建对象

5,不能跨数据库

Spring JDBC 优点(不得不提一下)

1,json,array 转换非常方便,简单,没什么魔法

2,驼峰自动转换为下划线连字符

3,任意转化对象,list,map,object随意

4,自带时间转换器,包括Date,LocalDateTime

5,关联关系支持不好,感觉让人看到一片新天地,不再关联,全部cache,这很恐怖

6,全部裸写sql对底层理解更加深刻

综述

JPA比较全面,性能也很好,涉及到数据库底层native 支持就不太理想

mybatis类似JPA但是实力差距较大

jdbc 就是个裸体sql 封装极少,按理说性能应该是最好的,但是不明显,但是类型转换是最方便的

ID查询jpa快,不然就是jdbc和mybatis快,能快一倍

#######准备尝试jdbc#####