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

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配懒加载的情况有影响。

此处体现了hibernate的一个方便处,可以直接通过getAddUser()可以取得user相关的字段。

然而myBatis则需要编写新的vo,因此在测试batis时则直接在Twitter实体中增加创建人员名字成员(createUserName)。

此处hibernate则会分别测试有懒加载,无懒加载。

mybatis会测有默认与有缓存两者情况。此处插一句话,更多关于mybatis面试题,公众号Java精选,回复Java面试,获取mybatis面试题大全。支持在线刷题。

其中mybatis的缓存机制比较难有效配置,不适用于真实业务(可能会有脏数据),在此仅供参考。

测试时,对推特关联的用户数做了两种情况,一种是推特共关联了100个用户,也就是不同的推特也就是在100个用户内,这里的关联关系随机生成。

另外一种是推特共关联了50万个用户,基本上50个用户的信息都会被查询出来。

在上文“准备”中可以看到关联数据生成方式。

关键代码:

hibernate:

long cnt = 100000;

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

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

t.getAddUser().getName();//加载相应字段

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

}

急懒加载配置更改处,Twitter.java:

@ManyToOne(fetch = FetchType.EAGER)//急加载

//@ManyToOne(fetch = FetchType.LAZY)//懒加载

@JoinColumn(name = “add_user_id”)

public User getAddUser() {

return add_user;

}

mybatis:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档

MySQL全家桶笔记

还有更多面试复习笔记分享如下

Java架构专题面试复习

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
5%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档

[外链图片转存中…(img-wo3nVDFL-1712249048047)]

还有更多面试复习笔记分享如下

[外链图片转存中…(img-kxW5OJpQ-1712249048047)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值