【109期】面试官问:说说 MyBatis 和 Hibernate JPA,哪个性能更佳?

测试分两轮,同场景下默认参数做一轮,调优做强一轮,横纵对比分析了。

测试中尽保证输入输出的一致性。

样本量尽可能大,达到10万级别以上,减少统计误差。

测试提纲

=================================================================================================================================================================================================================================

具体的场景情况下

插入测试1:10万条记录插入。

查询测试1:100万数据中单表通过id查询100000次,无关联字段。

查询测试2:100万数据中单表通过id查询100000次,输出关联对象字段。

查询测试3:100万*50万关联数据中查询100000次,两者输出相同字段。

准备

===============================================================================================================================================================================================================================

数据库:mysql 5.6

表格设计:

twitter:推特

CREATE TABLE twitter (

id bigint(20) NOT NULL AUTO_INCREMENT,

add_date datetime DEFAULT NULL,

modify_date datetime DEFAULT NULL,

ctx varchar(255) NOT NULL,

add_user_id bigint(20) DEFAULT NULL,

modify_user_id bigint(20) DEFAULT NULL,

PRIMARY KEY (id),

KEY UPDATE_USER_FORI (modify_user_id),

KEY ADD_USER_FORI (add_user_id),

CONSTRAINT ADD_USER_FORI FOREIGN KEY (add_user_id) REFERENCES user (id) ON DELETE SET NULL,

CONSTRAINT UPDATE_USER_FORI FOREIGN KEY (modify_user_id) REFERENCES user (id) ON DELETE SET NULL

) ENGINE=InnoDB AUTO_INCREMENT=1048561 DEFAULT CHARSET=utf8

user: 用户

CREATE TABLE user (

id bigint(20) NOT NULL AUTO_INCREMENT,

name varchar(255) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=524281 DEFAULT CHARSET=utf8

测试数据准备:

表一:twitter

无数据。

表二:user

50万个随机的用户名。

随机内容推特表(material_twitter)

无id,仅有随机字符串内容,共10万条。

用于插入控推特表。此处插一句话,更多关于mybatis面试题,公众号Java精选,回复Java面试,获取mybatis面试题大全。支持在线刷题。

生成数据代码,关联100个用户:

insert into twitter(ctx,add_user_id,modify_user_id,add_date,modify_date)

SELECT name,ROUND(RAND()*100)+1,ROUND(RAND()*100)+1,‘2016-12-31’,‘2016-12-31’

from MATERIAL

生成数据代码,关联500000个用户:

insert into twitter(ctx,add_user_id,modify_user_id,add_date,modify_date)

SELECT name,ROUND(RAND()*500000)+1,ROUND(RAND()*500000)+1,‘2016-12-31’,‘2016-12-31’

from MATERIAL

实体代码

@Entity

@Table(name = “twitter”)

public class Twitter implements java.io.Serializable{

private Long id;

private Date add_date;

private Date modify_date;

private String ctx;

private User add_user;

private User modify_user;

private String createUserName;

@Id

@GeneratedValue(strategy = IDENTITY)

@Column(name = “id”, unique = true, nullable = false)

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

@Temporal(TemporalType.DATE)

@Column(name = “add_date”)

public Date getAddDate() {

return add_date;

}

public void setAddDate(Date add_date) {

this.add_date = add_date;

}

@Temporal(TemporalType.DATE)

@Column(name = “modify_date”)

public Date getModifyDate() {

return modify_date;

}

public void setModifyDate(Date modify_date) {

this.modify_date = modify_date;

}

@Column(name = “ctx”)

public String getCtx() {

return ctx;

}

public void setCtx(String ctx) {

this.ctx = ctx;

}

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = “add_user_id”)

public User getAddUser() {

return add_user;

}

public void setAddUser(User add_user) {

this.add_user = add_user;

}

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = “modify_user_id”)

public User getModifyUser() {

return modify_user;

}

public void setModifyUser(User modify_user) {

this.modify_user = modify_user;

}

@Transient

public String getCreateUserName() {

return createUserName;

}

public void setCreateUserName(String createUserName) {

this.createUserName = createUserName;

}

}

开始

==

插入测试1

代码操作:

将随机内容推特表的数据加载到内存中,然后一条条加入到推特表中,共10万条。

关键代码:

hibernate:

Session session = factory.openSession();

session.beginTransaction();

Twitter t = null;

Date now = new Date();

for(String materialTwitter : materialTwitters){

//            System.out.println(“materialTwitter=”+materialTwitter);

t = new Twitter();

t.setCtx(materialTwitter);

t.setAddDate(now);

t.setModifyDate(now);

t.setAddUser(null);

t.setModifyUser(null);

session.save(t);

}

session.getTransaction().commit();

mybatis:

Twitter t = null;

Date now = new Date();

for(String materialTwitter : materialTwitters){

//            System.out.println(“materialTwitter=”+materialTwitter);

t = new Twitter();

t.setCtx(materialTwitter);

t.setAddDate(now);

t.setModifyDate(now);

t.setAddUser(null);

t.setModifyUser(null);

msession.insert(“insertTwitter”, t);

}

msession.commit();

TwitterMapper.xml,插入代码片段:

  

insert into twitter(ctx, add_date,modify_date) values (#{ctx},#{add_date},#{modify_date})

查询测试1

通过id从1递增到10万依次进行查询推特内容,仅输出微博内容。

关键代码:

hibernate:

long cnt = 100000;

for(long i = 1; i <= cnt; ++i){

Twitter t = (Twitter)session.get(Twitter.class, i);

//System.out.println(“t.getCtx=”+ t.getCtx() + " t.getUser.getName=" + t.getAddUser().getName());

}

mybatis:

long cnt = 100000;

for(long i = 1; i <= cnt; ++i){

Twitter t = (Twitter)msession.selectOne(“getTwitter”, i);

//System.out.println(“t.getCtx=”+ t.getCtx() + " t.getUser.getName=" + t.getAddUser().getName());

}

查询测试2

与查询测试1总体一样,增加微博的创建人名称字段,此处需要关联。

其中微博对应有10万个用户。可能一部份用户重复。这里对应的用户数可能与hibernate配懒加载的情况有影响。

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

}

查询测试2

与查询测试1总体一样,增加微博的创建人名称字段,此处需要关联。

其中微博对应有10万个用户。可能一部份用户重复。这里对应的用户数可能与hibernate配懒加载的情况有影响。

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

[外链图片转存中…(img-bkCFkGrm-1714492899484)]

[外链图片转存中…(img-FhZ8mtFa-1714492899484)]

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-EjRNKGWC-1714492899484)]

[外链图片转存中…(img-41lcw1jj-1714492899485)]

2021企业Java面试题精选

[外链图片转存中…(img-K6vPMdDX-1714492899485)]

[外链图片转存中…(img-xZW3AkIa-1714492899485)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值