MyBatis和Hibernate相比,优势在哪里? | 您所在的位置:网站首页 › hibernate框架和mybatis › MyBatis和Hibernate相比,优势在哪里? |
通过各种实验,测出两个在相同情景下的性能相关的指数,供大家参考。 测试目标 以下测试需要确定几点内容: 性能差异的场景; 性能不在同场景下差异比; 找出各架框优劣,各种情况下的表现,适用场景。 测试思路 测试总体分成:单表插入,关联插入,单表查询,多表查询。 测试分两轮,同场景下默认参数做一轮,调优做强一轮,横纵对比分析了。 测试中尽保证输入输出的一致性。 样本量尽可能大,达到10万级别以上,减少统计误差。 测试提纲 具体的场景情况下 插入测试1:10万条记录插入。 查询测试1:100万数据中单表通过id查询100000次,无关联字段。 查询测试2:100万数据中单表通过id查询100000次,输出关联对象字段。 查询测试3:100万*50万关联数据中查询100000次,两者输出相同字段。 准备 数据库:mysql 5.6 表格设计: twitter:推特 Sql代码 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=utf8user: 用户 Sql代码 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测试数据准备: 无数据。 user 50万个随机的用户名。 随机内容推特表(material_twitter) 无id,仅有随机字符串内容,共10万条。 用于插入控推特表。 生成数据代码,关联100个用户: Java代码 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个用户: Java代码 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实体代码 Java代码 @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: Java代码 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: Java代码 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,插入代码片段: Xml代码 insert into twitter(ctx, add_date,modify_date) values (#{ctx},#{add_date},#{modify_date})查询测试1 通过id从1递增到10万依次进行查询推特内容,仅输出微博内容。 关键代码: hibernate: Java代码 long cnt = 100000; for(long i = 1; i |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |